Skip to content

Commit 0d433b4

Browse files
authored
Merge pull request #22745 from jklymak/mnt-cache-renderer
MNT: Don't require renderer for window_extent and tightbbox
2 parents 33e428d + 24b1680 commit 0d433b4

23 files changed

+109
-70
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
No need to specify renderer for get_tightbbox and get_window_extent
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
4+
The ``get_tightbbox`` and `~.Artist.get_window_extent` methods
5+
no longer require the *renderer* kwarg, saving users from having to
6+
querry it from ``fig.canvas.get_renderer``. If the *renderer*
7+
kwarg is not supplied these methods first check if there is a cached renderer
8+
from a previous draw and use that. If there is no cahched renderer, then
9+
the methods will use ``fig.canvas.get_renderer()`` as a fallback.

lib/matplotlib/_constrained_layout.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import numpy as np
5353

5454
from matplotlib import _api, artist as martist
55-
from matplotlib._tight_layout import get_renderer
5655
import matplotlib.transforms as mtransforms
5756
import matplotlib._layoutgrid as mlayoutgrid
5857

@@ -94,7 +93,7 @@ def do_constrained_layout(fig, h_pad, w_pad,
9493
layoutgrid : private debugging structure
9594
"""
9695

97-
renderer = get_renderer(fig)
96+
renderer = fig._get_renderer()
9897
# make layoutgrid tree...
9998
layoutgrids = make_layoutgrids(fig, None, rect=rect)
10099
if not layoutgrids['hasgrids']:

lib/matplotlib/_tight_layout.py

-12
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,6 @@ def auto_adjust_subplotpars(
198198
ax_bbox_list, pad, h_pad, w_pad, rect)
199199

200200

201-
def get_renderer(fig):
202-
if fig._cachedRenderer:
203-
return fig._cachedRenderer
204-
else:
205-
canvas = fig.canvas
206-
if canvas and hasattr(canvas, "get_renderer"):
207-
return canvas.get_renderer()
208-
else:
209-
from . import backend_bases
210-
return backend_bases._get_renderer(fig)
211-
212-
213201
def get_subplotspec_list(axes_list, grid_spec=None):
214202
"""
215203
Return a list of subplotspec from the given list of axes.

lib/matplotlib/artist.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ def stale(self, val):
298298
if val and self.stale_callback is not None:
299299
self.stale_callback(self, val)
300300

301-
def get_window_extent(self, renderer):
301+
def get_window_extent(self, renderer=None):
302302
"""
303303
Get the artist's bounding box in display space.
304304
@@ -318,7 +318,7 @@ def get_window_extent(self, renderer):
318318
"""
319319
return Bbox([[0, 0], [0, 0]])
320320

321-
def get_tightbbox(self, renderer):
321+
def get_tightbbox(self, renderer=None):
322322
"""
323323
Like `.Artist.get_window_extent`, but includes any clipping.
324324

lib/matplotlib/axes/_base.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -4441,7 +4441,7 @@ def get_default_bbox_extra_artists(self):
44414441
return [a for a in artists if a.get_visible() and a.get_in_layout()
44424442
and (isinstance(a, noclip) or not a._fully_clipped_to_axes())]
44434443

4444-
def get_tightbbox(self, renderer, call_axes_locator=True,
4444+
def get_tightbbox(self, renderer=None, call_axes_locator=True,
44454445
bbox_extra_artists=None, *, for_layout_only=False):
44464446
"""
44474447
Return the tight bounding box of the Axes, including axis and their
@@ -4485,6 +4485,8 @@ def get_tightbbox(self, renderer, call_axes_locator=True,
44854485
"""
44864486

44874487
bb = []
4488+
if renderer is None:
4489+
renderer = self.figure._get_renderer()
44884490

44894491
if not self.get_visible():
44904492
return None

lib/matplotlib/axis.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -1198,14 +1198,16 @@ def _update_ticks(self):
11981198

11991199
return ticks_to_draw
12001200

1201-
def _get_ticklabel_bboxes(self, ticks, renderer):
1201+
def _get_ticklabel_bboxes(self, ticks, renderer=None):
12021202
"""Return lists of bboxes for ticks' label1's and label2's."""
1203+
if renderer is None:
1204+
renderer = self.figure._get_renderer()
12031205
return ([tick.label1.get_window_extent(renderer)
12041206
for tick in ticks if tick.label1.get_visible()],
12051207
[tick.label2.get_window_extent(renderer)
12061208
for tick in ticks if tick.label2.get_visible()])
12071209

1208-
def get_tightbbox(self, renderer, *, for_layout_only=False):
1210+
def get_tightbbox(self, renderer=None, *, for_layout_only=False):
12091211
"""
12101212
Return a bounding box that encloses the axis. It only accounts
12111213
tick labels, axis label, and offsetText.
@@ -1217,7 +1219,8 @@ def get_tightbbox(self, renderer, *, for_layout_only=False):
12171219
"""
12181220
if not self.get_visible():
12191221
return
1220-
1222+
if renderer is None:
1223+
renderer = self.figure._get_renderer()
12211224
ticks_to_draw = self._update_ticks()
12221225

12231226
self._update_label_position(renderer)

lib/matplotlib/collections.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ def get_datalim(self, transData):
303303
return bbox
304304
return transforms.Bbox.null()
305305

306-
def get_window_extent(self, renderer):
306+
def get_window_extent(self, renderer=None):
307307
# TODO: check to ensure that this does not fail for
308308
# cases other than scatter plot legend
309309
return self.get_datalim(transforms.IdentityTransform())

lib/matplotlib/contour.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -251,23 +251,25 @@ def too_close(self, x, y, lw):
251251
def _get_nth_label_width(self, nth):
252252
"""Return the width of the *nth* label, in pixels."""
253253
fig = self.axes.figure
254+
renderer = fig._get_renderer()
254255
return (
255256
text.Text(0, 0,
256257
self.get_text(self.labelLevelList[nth], self.labelFmt),
257258
figure=fig,
258259
size=self.labelFontSizeList[nth],
259260
fontproperties=self.labelFontProps)
260-
.get_window_extent(mpl._tight_layout.get_renderer(fig)).width)
261+
.get_window_extent(renderer).width)
261262

262263
@_api.deprecated("3.5")
263264
def get_label_width(self, lev, fmt, fsize):
264265
"""Return the width of the label in points."""
265266
if not isinstance(lev, str):
266267
lev = self.get_text(lev, fmt)
267268
fig = self.axes.figure
269+
renderer = fig._get_renderer()
268270
width = (text.Text(0, 0, lev, figure=fig,
269271
size=fsize, fontproperties=self.labelFontProps)
270-
.get_window_extent(mpl._tight_layout.get_renderer(fig)).width)
272+
.get_window_extent(renderer).width)
271273
width *= 72 / fig.dpi
272274
return width
273275

lib/matplotlib/figure.py

+15-9
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,7 @@ def get_default_bbox_extra_artists(self):
16011601
bbox_artists.extend(ax.get_default_bbox_extra_artists())
16021602
return bbox_artists
16031603

1604-
def get_tightbbox(self, renderer, bbox_extra_artists=None):
1604+
def get_tightbbox(self, renderer=None, bbox_extra_artists=None):
16051605
"""
16061606
Return a (tight) bounding box of the figure *in inches*.
16071607
@@ -1628,6 +1628,9 @@ def get_tightbbox(self, renderer, bbox_extra_artists=None):
16281628
containing the bounding box (in figure inches).
16291629
"""
16301630

1631+
if renderer is None:
1632+
renderer = self.figure._get_renderer()
1633+
16311634
bb = []
16321635
if bbox_extra_artists is None:
16331636
artists = self.get_default_bbox_extra_artists()
@@ -2043,13 +2046,8 @@ def dpi(self):
20432046
def dpi(self, value):
20442047
self._parent.dpi = value
20452048

2046-
@property
2047-
def _cachedRenderer(self):
2048-
return self._parent._cachedRenderer
2049-
2050-
@_cachedRenderer.setter
2051-
def _cachedRenderer(self, renderer):
2052-
self._parent._cachedRenderer = renderer
2049+
def _get_renderer(self):
2050+
return self._parent._get_renderer()
20532051

20542052
def _redo_transform_rel_fig(self, bbox=None):
20552053
"""
@@ -2479,6 +2477,14 @@ def axes(self):
24792477

24802478
get_axes = axes.fget
24812479

2480+
def _get_renderer(self):
2481+
if self._cachedRenderer is not None:
2482+
return self._cachedRenderer
2483+
elif hasattr(self.canvas, 'get_renderer'):
2484+
return self.canvas.get_renderer()
2485+
else:
2486+
return _get_renderer(self)
2487+
24822488
def _get_dpi(self):
24832489
return self._dpi
24842490

@@ -2627,7 +2633,7 @@ def get_constrained_layout_pads(self, relative=False):
26272633
hspace = info['hspace']
26282634

26292635
if relative and (w_pad is not None or h_pad is not None):
2630-
renderer = _get_renderer(self)
2636+
renderer = self._get_renderer()
26312637
dpi = renderer.dpi
26322638
w_pad = w_pad * dpi / renderer.width
26332639
h_pad = h_pad * dpi / renderer.height

lib/matplotlib/gridspec.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ def tight_layout(self, figure, renderer=None,
474474
"might be incorrect.")
475475

476476
if renderer is None:
477-
renderer = _tight_layout.get_renderer(figure)
477+
renderer = figure._get_renderer()
478478

479479
kwargs = _tight_layout.get_tight_layout_figure(
480480
figure, figure.axes, subplotspec_list, renderer,

lib/matplotlib/image.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1425,7 +1425,7 @@ def __init__(self, bbox,
14251425

14261426
def get_window_extent(self, renderer=None):
14271427
if renderer is None:
1428-
renderer = self.get_figure()._cachedRenderer
1428+
renderer = self.get_figure()._get_renderer()
14291429

14301430
if isinstance(self.bbox, BboxBase):
14311431
return self.bbox

lib/matplotlib/layout_engine.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
from matplotlib._constrained_layout import do_constrained_layout
2323
from matplotlib._tight_layout import (get_subplotspec_list,
2424
get_tight_layout_figure)
25-
# from matplotlib.backend_bases import _get_renderer
26-
from matplotlib._tight_layout import get_renderer
2725

2826

2927
class LayoutEngine:
@@ -154,7 +152,7 @@ def execute(self, fig):
154152
_api.warn_external("This figure includes Axes that are not "
155153
"compatible with tight_layout, so results "
156154
"might be incorrect.")
157-
renderer = get_renderer(fig)
155+
renderer = fig._get_renderer()
158156
with getattr(renderer, "_draw_disabled", nullcontext)():
159157
kwargs = get_tight_layout_figure(
160158
fig, fig.axes, subplotspec_list, renderer,

lib/matplotlib/legend.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -883,10 +883,10 @@ def get_title(self):
883883
def get_window_extent(self, renderer=None):
884884
# docstring inherited
885885
if renderer is None:
886-
renderer = self.figure._cachedRenderer
886+
renderer = self.figure._get_renderer()
887887
return self._legend_box.get_window_extent(renderer=renderer)
888888

889-
def get_tightbbox(self, renderer):
889+
def get_tightbbox(self, renderer=None):
890890
# docstring inherited
891891
return self._legend_box.get_window_extent(renderer)
892892

lib/matplotlib/lines.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ def get_bbox(self):
616616
bbox.update_from_data_xy(self.get_xydata())
617617
return bbox
618618

619-
def get_window_extent(self, renderer):
619+
def get_window_extent(self, renderer=None):
620620
bbox = Bbox([[0, 0], [0, 0]])
621621
trans_data_to_xy = self.get_transform().transform
622622
bbox.update_from_data_xy(trans_data_to_xy(self.get_xydata()),

lib/matplotlib/offsetbox.py

+29-12
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,10 @@ def get_extent(self, renderer):
345345
w, h, xd, yd, offsets = self.get_extent_offsets(renderer)
346346
return w, h, xd, yd
347347

348-
def get_window_extent(self, renderer):
348+
def get_window_extent(self, renderer=None):
349349
# docstring inherited
350+
if renderer is None:
351+
renderer = self.figure._get_renderer()
350352
w, h, xd, yd, offsets = self.get_extent_offsets(renderer)
351353
px, py = self.get_offset(w, h, xd, yd, renderer)
352354
return mtransforms.Bbox.from_bounds(px - xd, py - yd, w, h)
@@ -631,8 +633,10 @@ def get_offset(self):
631633
"""Return offset of the container."""
632634
return self._offset
633635

634-
def get_window_extent(self, renderer):
636+
def get_window_extent(self, renderer=None):
635637
# docstring inherited
638+
if renderer is None:
639+
renderer = self.figure._get_renderer()
636640
w, h, xd, yd = self.get_extent(renderer)
637641
ox, oy = self.get_offset() # w, h, xd, yd)
638642

@@ -765,8 +769,10 @@ def get_offset(self):
765769
"""Return offset of the container."""
766770
return self._offset
767771

768-
def get_window_extent(self, renderer):
772+
def get_window_extent(self, renderer=None):
769773
# docstring inherited
774+
if renderer is None:
775+
renderer = self.figure._get_renderer()
770776
w, h, xd, yd = self.get_extent(renderer)
771777
ox, oy = self.get_offset()
772778
return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h)
@@ -866,8 +872,10 @@ def get_offset(self):
866872
"""Return offset of the container."""
867873
return self._offset
868874

869-
def get_window_extent(self, renderer):
875+
def get_window_extent(self, renderer=None):
870876
# docstring inherited
877+
if renderer is None:
878+
renderer = self.figure._get_renderer()
871879
w, h, xd, yd = self.get_extent(renderer)
872880
ox, oy = self.get_offset() # w, h, xd, yd)
873881
return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h)
@@ -1048,8 +1056,11 @@ def set_bbox_to_anchor(self, bbox, transform=None):
10481056
self._bbox_to_anchor_transform = transform
10491057
self.stale = True
10501058

1051-
def get_window_extent(self, renderer):
1059+
def get_window_extent(self, renderer=None):
10521060
# docstring inherited
1061+
if renderer is None:
1062+
renderer = self.figure._get_renderer()
1063+
10531064
self._update_offset_func(renderer)
10541065
w, h, xd, yd = self.get_extent(renderer)
10551066
ox, oy = self.get_offset(w, h, xd, yd, renderer)
@@ -1211,8 +1222,10 @@ def get_offset(self):
12111222
def get_children(self):
12121223
return [self.image]
12131224

1214-
def get_window_extent(self, renderer):
1225+
def get_window_extent(self, renderer=None):
12151226
# docstring inherited
1227+
if renderer is None:
1228+
renderer = self.figure._get_renderer()
12161229
w, h, xd, yd = self.get_extent(renderer)
12171230
ox, oy = self.get_offset()
12181231
return mtransforms.Bbox.from_bounds(ox - xd, oy - yd, w, h)
@@ -1390,12 +1403,14 @@ def get_fontsize(self):
13901403
"""Return the fontsize in points."""
13911404
return self.prop.get_size_in_points()
13921405

1393-
def get_window_extent(self, renderer):
1406+
def get_window_extent(self, renderer=None):
13941407
# docstring inherited
1408+
if renderer is None:
1409+
renderer = self.figure._get_renderer()
13951410
return Bbox.union([child.get_window_extent(renderer)
13961411
for child in self.get_children()])
13971412

1398-
def get_tightbbox(self, renderer):
1413+
def get_tightbbox(self, renderer=None):
13991414
# docstring inherited
14001415
return Bbox.union([child.get_tightbbox(renderer)
14011416
for child in self.get_children()])
@@ -1511,7 +1526,8 @@ def on_motion(self, evt):
15111526
self.update_offset(dx, dy)
15121527
if self._use_blit:
15131528
self.canvas.restore_region(self.background)
1514-
self.ref_artist.draw(self.ref_artist.figure._cachedRenderer)
1529+
self.ref_artist.draw(
1530+
self.ref_artist.figure._get_renderer())
15151531
self.canvas.blit()
15161532
else:
15171533
self.canvas.draw()
@@ -1526,7 +1542,8 @@ def on_pick(self, evt):
15261542
self.canvas.draw()
15271543
self.background = \
15281544
self.canvas.copy_from_bbox(self.ref_artist.figure.bbox)
1529-
self.ref_artist.draw(self.ref_artist.figure._cachedRenderer)
1545+
self.ref_artist.draw(
1546+
self.ref_artist.figure._get_renderer())
15301547
self.canvas.blit()
15311548
self._c1 = self.canvas.callbacks._connect_picklable(
15321549
"motion_notify_event", self.on_motion)
@@ -1576,7 +1593,7 @@ def __init__(self, ref_artist, offsetbox, use_blit=False):
15761593

15771594
def save_offset(self):
15781595
offsetbox = self.offsetbox
1579-
renderer = offsetbox.figure._cachedRenderer
1596+
renderer = offsetbox.figure._get_renderer()
15801597
w, h, xd, yd = offsetbox.get_extent(renderer)
15811598
offset = offsetbox.get_offset(w, h, xd, yd, renderer)
15821599
self.offsetbox_x, self.offsetbox_y = offset
@@ -1588,7 +1605,7 @@ def update_offset(self, dx, dy):
15881605

15891606
def get_loc_in_canvas(self):
15901607
offsetbox = self.offsetbox
1591-
renderer = offsetbox.figure._cachedRenderer
1608+
renderer = offsetbox.figure._get_renderer()
15921609
w, h, xd, yd = offsetbox.get_extent(renderer)
15931610
ox, oy = offsetbox._offset
15941611
loc_in_canvas = (ox - xd, oy - yd)

0 commit comments

Comments
 (0)