@@ -33,6 +33,9 @@ def _fn_name(): return sys._getframe(1).f_code.co_name
3333from matplotlib .path import Path
3434from matplotlib .transforms import Affine2D
3535
36+ from matplotlib .backends .backend_mixed import MixedModeRenderer
37+
38+
3639import numpy as npy
3740import binascii
3841import re
@@ -843,34 +846,42 @@ def print_ps(self, outfile, *args, **kwargs):
843846 def print_eps (self , outfile , * args , ** kwargs ):
844847 return self ._print_ps (outfile , 'eps' , * args , ** kwargs )
845848
849+
850+
851+
852+
853+
846854 def _print_ps (self , outfile , format , * args , ** kwargs ):
847- papertype = kwargs .get ("papertype" , rcParams ['ps.papersize' ])
855+ papertype = kwargs .pop ("papertype" , rcParams ['ps.papersize' ])
848856 papertype = papertype .lower ()
849857 if papertype == 'auto' :
850858 pass
851859 elif papertype not in papersize :
852860 raise RuntimeError ( '%s is not a valid papertype. Use one \
853861 of %s'% (papertype , ', ' .join ( papersize .keys () )) )
854862
855- orientation = kwargs .get ("orientation" , "portrait" ).lower ()
863+ orientation = kwargs .pop ("orientation" , "portrait" ).lower ()
856864 if orientation == 'landscape' : isLandscape = True
857865 elif orientation == 'portrait' : isLandscape = False
858866 else : raise RuntimeError ('Orientation must be "portrait" or "landscape"' )
859867
860868 self .figure .set_dpi (72 ) # Override the dpi kwarg
861- imagedpi = kwargs .get ("dpi" , 72 )
862- facecolor = kwargs .get ("facecolor" , "w" )
863- edgecolor = kwargs .get ("edgecolor" , "w" )
869+ imagedpi = kwargs .pop ("dpi" , 72 )
870+ facecolor = kwargs .pop ("facecolor" , "w" )
871+ edgecolor = kwargs .pop ("edgecolor" , "w" )
864872
865873 if rcParams ['text.usetex' ]:
866874 self ._print_figure_tex (outfile , format , imagedpi , facecolor , edgecolor ,
867- orientation , isLandscape , papertype )
875+ orientation , isLandscape , papertype ,
876+ ** kwargs )
868877 else :
869878 self ._print_figure (outfile , format , imagedpi , facecolor , edgecolor ,
870- orientation , isLandscape , papertype )
879+ orientation , isLandscape , papertype ,
880+ ** kwargs )
871881
872882 def _print_figure (self , outfile , format , dpi = 72 , facecolor = 'w' , edgecolor = 'w' ,
873- orientation = 'portrait' , isLandscape = False , papertype = None ):
883+ orientation = 'portrait' , isLandscape = False , papertype = None ,
884+ ** kwargs ):
874885 """
875886 Render the figure to hardcopy. Set the figure patch face and
876887 edge colors. This is useful because some of the GUIs have a
@@ -939,10 +950,30 @@ def _print_figure(self, outfile, format, dpi=72, facecolor='w', edgecolor='w',
939950 self .figure .set_facecolor (facecolor )
940951 self .figure .set_edgecolor (edgecolor )
941952
942- self ._pswriter = StringIO ()
943- renderer = RendererPS (width , height , self ._pswriter , imagedpi = dpi )
953+
954+ dryrun = kwargs .get ("dryrun" , False )
955+ if dryrun :
956+ class NullWriter (object ):
957+ def write (self , * kl , ** kwargs ):
958+ pass
959+
960+ self ._pswriter = NullWriter ()
961+ else :
962+ self ._pswriter = StringIO ()
963+
964+
965+ # mixed mode rendering
966+ _bbox_inches_restore = kwargs .pop ("bbox_inches_restore" , None )
967+ ps_renderer = RendererPS (width , height , self ._pswriter , imagedpi = dpi )
968+ renderer = MixedModeRenderer (self .figure ,
969+ width , height , dpi , ps_renderer ,
970+ bbox_inches_restore = _bbox_inches_restore )
971+
944972 self .figure .draw (renderer )
945973
974+ if dryrun : # return immediately if dryrun (tightbbox=True)
975+ return
976+
946977 self .figure .set_facecolor (origfacecolor )
947978 self .figure .set_edgecolor (origedgecolor )
948979
@@ -962,15 +993,15 @@ def _print_figure(self, outfile, format, dpi=72, facecolor='w', edgecolor='w',
962993 Ndict = len (psDefs )
963994 print >> fh , "%%BeginProlog"
964995 if not rcParams ['ps.useafm' ]:
965- Ndict += len (renderer .used_characters )
996+ Ndict += len (ps_renderer .used_characters )
966997 print >> fh , "/mpldict %d dict def" % Ndict
967998 print >> fh , "mpldict begin"
968999 for d in psDefs :
9691000 d = d .strip ()
9701001 for l in d .split ('\n ' ):
9711002 print >> fh , l .strip ()
9721003 if not rcParams ['ps.useafm' ]:
973- for font_filename , chars in renderer .used_characters .values ():
1004+ for font_filename , chars in ps_renderer .used_characters .values ():
9741005 if len (chars ):
9751006 font = FT2Font (font_filename )
9761007 cmap = font .get_charmap ()
@@ -1019,7 +1050,8 @@ def _print_figure(self, outfile, format, dpi=72, facecolor='w', edgecolor='w',
10191050 shutil .move (tmpfile , outfile )
10201051
10211052 def _print_figure_tex (self , outfile , format , dpi , facecolor , edgecolor ,
1022- orientation , isLandscape , papertype ):
1053+ orientation , isLandscape , papertype ,
1054+ ** kwargs ):
10231055 """
10241056 If text.usetex is True in rc, a temporary pair of tex/eps files
10251057 are created to allow tex to manage the text layout via the PSFrags
@@ -1051,10 +1083,29 @@ def _print_figure_tex(self, outfile, format, dpi, facecolor, edgecolor,
10511083 self .figure .set_facecolor (facecolor )
10521084 self .figure .set_edgecolor (edgecolor )
10531085
1054- self ._pswriter = StringIO ()
1055- renderer = RendererPS (width , height , self ._pswriter , imagedpi = dpi )
1086+ dryrun = kwargs .get ("dryrun" , False )
1087+ if dryrun :
1088+ class NullWriter (object ):
1089+ def write (self , * kl , ** kwargs ):
1090+ pass
1091+
1092+ self ._pswriter = NullWriter ()
1093+ else :
1094+ self ._pswriter = StringIO ()
1095+
1096+
1097+ # mixed mode rendering
1098+ _bbox_inches_restore = kwargs .pop ("bbox_inches_restore" , None )
1099+ ps_renderer = RendererPS (width , height , self ._pswriter , imagedpi = dpi )
1100+ renderer = MixedModeRenderer (self .figure ,
1101+ width , height , dpi , ps_renderer ,
1102+ bbox_inches_restore = _bbox_inches_restore )
1103+
10561104 self .figure .draw (renderer )
10571105
1106+ if dryrun : # return immediately if dryrun (tightbbox=True)
1107+ return
1108+
10581109 self .figure .set_facecolor (origfacecolor )
10591110 self .figure .set_edgecolor (origedgecolor )
10601111
@@ -1117,11 +1168,11 @@ def _print_figure_tex(self, outfile, format, dpi, facecolor, edgecolor,
11171168 paper will be used to prevent clipping.'% (papertype , temp_papertype ), 'helpful' )
11181169
11191170
1120- texmanager = renderer .get_texmanager ()
1171+ texmanager = ps_renderer .get_texmanager ()
11211172 font_preamble = texmanager .get_font_preamble ()
11221173 custom_preamble = texmanager .get_custom_preamble ()
11231174
1124- convert_psfrags (tmpfile , renderer .psfrag , font_preamble ,
1175+ convert_psfrags (tmpfile , ps_renderer .psfrag , font_preamble ,
11251176 custom_preamble , paperWidth , paperHeight ,
11261177 orientation )
11271178
0 commit comments