@@ -421,7 +421,7 @@ def _get_journal_size(preset):
421
421
return figwidth , figheight
422
422
423
423
424
- def _add_canvas_preprocessor (canvas , method ):
424
+ def _add_canvas_preprocessor (canvas , method , cache = False ):
425
425
"""
426
426
Return a pre-processer that can be used to override instance-level
427
427
canvas draw() and print_figure() methods. This applies tight layout
@@ -456,15 +456,8 @@ def _canvas_preprocess(self, *args, **kwargs):
456
456
# Adjust layout
457
457
# NOTE: The authorized_context is needed because some backends disable
458
458
# constrained layout or tight layout before printing the figure.
459
- # NOTE: *Critical* to not add print_figure renderer to the cache when the print
460
- # method (print_pdf, print_png, etc.) calls Figure.draw(). Otherwise have issues
461
- # where (1) figure size and/or figure bounds are incorrect after saving figure
462
- # *then* displaying it in qt or inline notebook backends, and (2) figure fails
463
- # to update correctly after successively modifying and displaying within inline
464
- # notebook backend (previously worked around this by forcing additional draw()
465
- # call in this function before proceeding with print_figure).
466
- ctx1 = fig ._context_adjusting (cache = (method != 'print_figure' ))
467
- ctx2 = fig ._context_authorized () # backends might call set_constrained_layout()
459
+ ctx1 = fig ._context_adjusting (cache = cache )
460
+ ctx2 = fig ._context_authorized () # skip backend set_constrained_layout()
468
461
ctx3 = rc .context (fig ._render_context ) # draw with figure-specific setting
469
462
with ctx1 , ctx2 , ctx3 :
470
463
fig .auto_layout ()
@@ -1737,14 +1730,20 @@ def set_canvas(self, canvas):
1737
1730
--------
1738
1731
matplotlib.figure.Figure.set_canvas
1739
1732
"""
1740
- # Set the canvas and add monkey patches to the instance-level draw and
1741
- # print_figure methods. The latter is called by save() and by the inline
1742
- # backend. See `_add_canvas_preprocessor` for details.
1743
- _add_canvas_preprocessor (canvas , 'print_figure' )
1744
- if callable (getattr (canvas , '_draw' , None )): # for macosx backend
1745
- _add_canvas_preprocessor (canvas , '_draw' )
1746
- else :
1747
- _add_canvas_preprocessor (canvas , 'draw' )
1733
+ # NOTE: Use the _draw method if it exists, e.g. for osx backends. Critical
1734
+ # or else wrong renderer size is used.
1735
+ # NOTE: See _add_canvas_preprocessor for details. Critical to not add cache
1736
+ # print_figure renderer when the print method (print_pdf, print_png, etc.)
1737
+ # calls Figure.draw(). Otherwise have issues where (1) figure size and/or
1738
+ # bounds are incorrect after saving figure *then* displaying it in qt or inline
1739
+ # notebook backends, and (2) figure fails to update correctly after successively
1740
+ # modifying and displaying within inline notebook backend (previously worked
1741
+ # around this by forcing additional draw() call in this function before
1742
+ # proceeding with print_figure). Set the canvas and add monkey patches
1743
+ # to the instance-level draw and print_figure methods.
1744
+ method = '_draw' if callable (getattr (canvas , '_draw' , None )) else 'draw'
1745
+ _add_canvas_preprocessor (canvas , 'print_figure' , cache = False ) # saves, inlines
1746
+ _add_canvas_preprocessor (canvas , method , cache = True ) # renderer displays
1748
1747
super ().set_canvas (canvas )
1749
1748
1750
1749
def _is_same_size (self , figsize , eps = None ):
0 commit comments