Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9c50f07

Browse files
rcomertacaswell
andcommitted
Get dpi, canvas and renderer directly from the root Figure
Co-authored-by: Thomas A Caswell <[email protected]>
1 parent 9d38be2 commit 9c50f07

23 files changed

+87
-86
lines changed

lib/matplotlib/artist.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ def _different_canvas(self, event):
474474
# subclass-specific implementation follows
475475
"""
476476
return (getattr(event, "canvas", None) is not None
477-
and (fig := self.get_figure(root=False)) is not None
477+
and (fig := self.get_figure(root=True)) is not None
478478
and event.canvas is not fig.canvas)
479479

480480
def contains(self, mouseevent):
@@ -527,7 +527,7 @@ def pick(self, mouseevent):
527527
else:
528528
inside, prop = self.contains(mouseevent)
529529
if inside:
530-
PickEvent("pick_event", self.get_figure(root=False).canvas,
530+
PickEvent("pick_event", self.get_figure(root=True).canvas,
531531
mouseevent, self, **prop)._process()
532532

533533
# Pick children

lib/matplotlib/axes/_base.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3119,7 +3119,7 @@ def draw(self, renderer):
31193119
for _axis in self._axis_map.values():
31203120
artists.remove(_axis)
31213121

3122-
if not self.get_figure(root=False).canvas.is_saving():
3122+
if not self.get_figure(root=True).canvas.is_saving():
31233123
artists = [
31243124
a for a in artists
31253125
if not a.get_animated() or isinstance(a, mimage.AxesImage)]
@@ -3159,7 +3159,7 @@ def draw_artist(self, a):
31593159
"""
31603160
Efficiently redraw a single artist.
31613161
"""
3162-
a.draw(self.get_figure(root=False).canvas.get_renderer())
3162+
a.draw(self.get_figure(root=True).canvas.get_renderer())
31633163

31643164
def redraw_in_frame(self):
31653165
"""
@@ -3169,7 +3169,7 @@ def redraw_in_frame(self):
31693169
for artist in [*self._axis_map.values(),
31703170
self.title, self._left_title, self._right_title]:
31713171
stack.enter_context(artist._cm_set(visible=False))
3172-
self.draw(self.get_figure(root=False).canvas.get_renderer())
3172+
self.draw(self.get_figure(root=True).canvas.get_renderer())
31733173

31743174
# Axes rectangle characteristics
31753175

@@ -4477,7 +4477,7 @@ def get_tightbbox(self, renderer=None, call_axes_locator=True,
44774477

44784478
bb = []
44794479
if renderer is None:
4480-
renderer = self.get_figure(root=False)._get_renderer()
4480+
renderer = self.get_figure(root=True)._get_renderer()
44814481

44824482
if not self.get_visible():
44834483
return None

lib/matplotlib/axis.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,7 @@ def _update_ticks(self):
13471347
def _get_ticklabel_bboxes(self, ticks, renderer=None):
13481348
"""Return lists of bboxes for ticks' label1's and label2's."""
13491349
if renderer is None:
1350-
renderer = self.get_figure(root=False)._get_renderer()
1350+
renderer = self.get_figure(root=True)._get_renderer()
13511351
return ([tick.label1.get_window_extent(renderer)
13521352
for tick in ticks if tick.label1.get_visible()],
13531353
[tick.label2.get_window_extent(renderer)
@@ -1366,7 +1366,7 @@ def get_tightbbox(self, renderer=None, *, for_layout_only=False):
13661366
if not self.get_visible():
13671367
return
13681368
if renderer is None:
1369-
renderer = self.get_figure(root=False)._get_renderer()
1369+
renderer = self.get_figure(root=True)._get_renderer()
13701370
ticks_to_draw = self._update_ticks()
13711371

13721372
self._update_label_position(renderer)
@@ -2410,13 +2410,13 @@ def _update_label_position(self, renderer):
24102410
bbox = mtransforms.Bbox.union([
24112411
*bboxes, self.axes.spines.get("bottom", self.axes).get_window_extent()])
24122412
self.label.set_position(
2413-
(x, bbox.y0 - self.labelpad * self.get_figure(root=False).dpi / 72))
2413+
(x, bbox.y0 - self.labelpad * self.get_figure(root=True).dpi / 72))
24142414
else:
24152415
# Union with extents of the top spine if present, of the axes otherwise.
24162416
bbox = mtransforms.Bbox.union([
24172417
*bboxes2, self.axes.spines.get("top", self.axes).get_window_extent()])
24182418
self.label.set_position(
2419-
(x, bbox.y1 + self.labelpad * self.get_figure(root=False).dpi / 72))
2419+
(x, bbox.y1 + self.labelpad * self.get_figure(root=True).dpi / 72))
24202420

24212421
def _update_offset_text_position(self, bboxes, bboxes2):
24222422
"""
@@ -2432,14 +2432,14 @@ def _update_offset_text_position(self, bboxes, bboxes2):
24322432
else:
24332433
bbox = mtransforms.Bbox.union(bboxes)
24342434
bottom = bbox.y0
2435-
y = bottom - self.OFFSETTEXTPAD * self.get_figure(root=False).dpi / 72
2435+
y = bottom - self.OFFSETTEXTPAD * self.get_figure(root=True).dpi / 72
24362436
else:
24372437
if not len(bboxes2):
24382438
top = self.axes.bbox.ymax
24392439
else:
24402440
bbox = mtransforms.Bbox.union(bboxes2)
24412441
top = bbox.y1
2442-
y = top + self.OFFSETTEXTPAD * self.get_figure(root=False).dpi / 72
2442+
y = top + self.OFFSETTEXTPAD * self.get_figure(root=True).dpi / 72
24432443
self.offsetText.set_position((x, y))
24442444

24452445
def set_ticks_position(self, position):
@@ -2637,13 +2637,13 @@ def _update_label_position(self, renderer):
26372637
bbox = mtransforms.Bbox.union([
26382638
*bboxes, self.axes.spines.get("left", self.axes).get_window_extent()])
26392639
self.label.set_position(
2640-
(bbox.x0 - self.labelpad * self.get_figure(root=False).dpi / 72, y))
2640+
(bbox.x0 - self.labelpad * self.get_figure(root=True).dpi / 72, y))
26412641
else:
26422642
# Union with extents of the right spine if present, of the axes otherwise.
26432643
bbox = mtransforms.Bbox.union([
26442644
*bboxes2, self.axes.spines.get("right", self.axes).get_window_extent()])
26452645
self.label.set_position(
2646-
(bbox.x1 + self.labelpad * self.get_figure(root=False).dpi / 72, y))
2646+
(bbox.x1 + self.labelpad * self.get_figure(root=True).dpi / 72, y))
26472647

26482648
def _update_offset_text_position(self, bboxes, bboxes2):
26492649
"""
@@ -2658,7 +2658,7 @@ def _update_offset_text_position(self, bboxes, bboxes2):
26582658
bbox = self.axes.bbox
26592659
top = bbox.ymax
26602660
self.offsetText.set_position(
2661-
(x, top + self.OFFSETTEXTPAD * self.get_figure(root=False).dpi / 72)
2661+
(x, top + self.OFFSETTEXTPAD * self.get_figure(root=True).dpi / 72)
26622662
)
26632663

26642664
def set_offset_position(self, position):

lib/matplotlib/backend_bases.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,7 +1514,7 @@ def _mouse_handler(event):
15141514
# done with the internal _set_inaxes method which ensures that
15151515
# the xdata and ydata attributes are also correct.
15161516
try:
1517-
canvas = last_axes.get_figure(root=False).canvas
1517+
canvas = last_axes.get_figure(root=True).canvas
15181518
leave_event = LocationEvent(
15191519
"axes_leave_event", canvas,
15201520
event.x, event.y, event.guiEvent,
@@ -2496,27 +2496,27 @@ def _get_uniform_gridstate(ticks):
24962496
scale = ax.get_yscale()
24972497
if scale == 'log':
24982498
ax.set_yscale('linear')
2499-
ax.get_figure(root=False).canvas.draw_idle()
2499+
ax.get_figure(root=True).canvas.draw_idle()
25002500
elif scale == 'linear':
25012501
try:
25022502
ax.set_yscale('log')
25032503
except ValueError as exc:
25042504
_log.warning(str(exc))
25052505
ax.set_yscale('linear')
2506-
ax.get_figure(root=False).canvas.draw_idle()
2506+
ax.get_figure(root=True).canvas.draw_idle()
25072507
# toggle scaling of x-axes between 'log and 'linear' (default key 'k')
25082508
elif event.key in rcParams['keymap.xscale']:
25092509
scalex = ax.get_xscale()
25102510
if scalex == 'log':
25112511
ax.set_xscale('linear')
2512-
ax.get_figure(root=False).canvas.draw_idle()
2512+
ax.get_figure(root=True).canvas.draw_idle()
25132513
elif scalex == 'linear':
25142514
try:
25152515
ax.set_xscale('log')
25162516
except ValueError as exc:
25172517
_log.warning(str(exc))
25182518
ax.set_xscale('linear')
2519-
ax.get_figure(root=False).canvas.draw_idle()
2519+
ax.get_figure(root=True).canvas.draw_idle()
25202520

25212521

25222522
def button_press_handler(event, canvas=None, toolbar=None):

lib/matplotlib/collections.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ def set_sizes(self, sizes, dpi=72.0):
10011001

10021002
@artist.allow_rasterization
10031003
def draw(self, renderer):
1004-
self.set_sizes(self._sizes, self.get_figure(root=False).dpi)
1004+
self.set_sizes(self._sizes, self.get_figure(root=True).dpi)
10051005
super().draw(renderer)
10061006

10071007

@@ -1310,7 +1310,7 @@ def get_rotation(self):
13101310

13111311
@artist.allow_rasterization
13121312
def draw(self, renderer):
1313-
self.set_sizes(self._sizes, self.get_figure(root=False).dpi)
1313+
self.set_sizes(self._sizes, self.get_figure(root=True).dpi)
13141314
self._transforms = [
13151315
transforms.Affine2D(x).rotate(-self._rotation).get_matrix()
13161316
for x in self._transforms

lib/matplotlib/contour.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828

2929
def _contour_labeler_event_handler(cs, inline, inline_spacing, event):
30-
canvas = cs.axes.get_figure(root=False).canvas
30+
canvas = cs.axes.get_figure(root=True).canvas
3131
is_button = event.name == "button_press_event"
3232
is_key = event.name == "key_press_event"
3333
# Quit (even if not in infinite mode; this is consistent with
@@ -224,7 +224,7 @@ def too_close(self, x, y, lw):
224224
def _get_nth_label_width(self, nth):
225225
"""Return the width of the *nth* label, in pixels."""
226226
fig = self.axes.get_figure(root=False)
227-
renderer = fig._get_renderer()
227+
renderer = fig.get_figure(root=True)._get_renderer()
228228
return (Text(0, 0,
229229
self.get_text(self.labelLevelList[nth], self.labelFmt),
230230
figure=fig, fontproperties=self._label_font_props)

lib/matplotlib/figure.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ def _remove_axes(self, ax, owners):
947947

948948
self._axobservers.process("_axes_change_event", self)
949949
self.stale = True
950-
self.canvas.release_mouse(ax)
950+
self._root_figure.canvas.release_mouse(ax)
951951

952952
for name in ax._axis_names: # Break link between any shared Axes
953953
grouper = ax._shared_axes[name]

lib/matplotlib/legend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1065,7 +1065,7 @@ def get_title(self):
10651065
def get_window_extent(self, renderer=None):
10661066
# docstring inherited
10671067
if renderer is None:
1068-
renderer = self.get_figure(root=False)._get_renderer()
1068+
renderer = self.get_figure(root=True)._get_renderer()
10691069
return self._legend_box.get_window_extent(renderer=renderer)
10701070

10711071
def get_tightbbox(self, renderer=None):

lib/matplotlib/lines.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ def contains(self, mouseevent):
467467
yt = xy[:, 1]
468468

469469
# Convert pick radius from points to pixels
470-
fig = self.get_figure(root=False)
470+
fig = self.get_figure(root=True)
471471
if fig is None:
472472
_log.warning('no figure set when check if mouse is on line')
473473
pixels = self._pickradius
@@ -641,7 +641,7 @@ def get_window_extent(self, renderer=None):
641641
ignore=True)
642642
# correct for marker size, if any
643643
if self._marker:
644-
ms = (self._markersize / 72.0 * self.get_figure(root=False).dpi) * 0.5
644+
ms = (self._markersize / 72.0 * self.get_figure(root=True).dpi) * 0.5
645645
bbox = bbox.padded(ms)
646646
return bbox
647647

@@ -1649,7 +1649,7 @@ def __init__(self, line):
16491649
'pick_event', self.onpick)
16501650
self.ind = set()
16511651

1652-
canvas = property(lambda self: self.axes.get_figure(root=False).canvas)
1652+
canvas = property(lambda self: self.axes.get_figure(root=True).canvas)
16531653

16541654
def process_selected(self, ind, xs, ys):
16551655
"""

lib/matplotlib/offsetbox.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ def get_bbox(self, renderer):
363363
def get_window_extent(self, renderer=None):
364364
# docstring inherited
365365
if renderer is None:
366-
renderer = self.get_figure(root=False)._get_renderer()
366+
renderer = self.get_figure(root=True)._get_renderer()
367367
bbox = self.get_bbox(renderer)
368368
try: # Some subclasses redefine get_offset to take no args.
369369
px, py = self.get_offset(bbox, renderer)
@@ -1356,15 +1356,15 @@ def get_fontsize(self):
13561356
def get_window_extent(self, renderer=None):
13571357
# docstring inherited
13581358
if renderer is None:
1359-
renderer = self.get_figure(root=False)._get_renderer()
1359+
renderer = self.get_figure(root=True)._get_renderer()
13601360
self.update_positions(renderer)
13611361
return Bbox.union([child.get_window_extent(renderer)
13621362
for child in self.get_children()])
13631363

13641364
def get_tightbbox(self, renderer=None):
13651365
# docstring inherited
13661366
if renderer is None:
1367-
renderer = self.get_figure(root=False)._get_renderer()
1367+
renderer = self.get_figure(root=True)._get_renderer()
13681368
self.update_positions(renderer)
13691369
return Bbox.union([child.get_tightbbox(renderer)
13701370
for child in self.get_children()])
@@ -1469,7 +1469,7 @@ def __init__(self, ref_artist, use_blit=False):
14691469
]
14701470

14711471
# A property, not an attribute, to maintain picklability.
1472-
canvas = property(lambda self: self.ref_artist.get_figure(root=False).canvas)
1472+
canvas = property(lambda self: self.ref_artist.get_figure(root=True).canvas)
14731473
cids = property(lambda self: [
14741474
disconnect.args[0] for disconnect in self._disconnectors[:2]])
14751475

@@ -1481,7 +1481,7 @@ def on_motion(self, evt):
14811481
if self._use_blit:
14821482
self.canvas.restore_region(self.background)
14831483
self.ref_artist.draw(
1484-
self.ref_artist.get_figure(root=False)._get_renderer())
1484+
self.ref_artist.get_figure(root=True)._get_renderer())
14851485
self.canvas.blit()
14861486
else:
14871487
self.canvas.draw()
@@ -1536,7 +1536,7 @@ def __init__(self, ref_artist, offsetbox, use_blit=False):
15361536

15371537
def save_offset(self):
15381538
offsetbox = self.offsetbox
1539-
renderer = offsetbox.get_figure(root=False)._get_renderer()
1539+
renderer = offsetbox.get_figure(root=True)._get_renderer()
15401540
offset = offsetbox.get_offset(offsetbox.get_bbox(renderer), renderer)
15411541
self.offsetbox_x, self.offsetbox_y = offset
15421542
self.offsetbox.set_offset(offset)
@@ -1547,7 +1547,7 @@ def update_offset(self, dx, dy):
15471547

15481548
def get_loc_in_canvas(self):
15491549
offsetbox = self.offsetbox
1550-
renderer = offsetbox.get_figure(root=False)._get_renderer()
1550+
renderer = offsetbox.get_figure(root=True)._get_renderer()
15511551
bbox = offsetbox.get_bbox(renderer)
15521552
ox, oy = offsetbox._offset
15531553
loc_in_canvas = (ox + bbox.x0, oy + bbox.y0)

lib/matplotlib/patches.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4596,7 +4596,7 @@ def _get_xy(self, xy, s, axes=None):
45964596
return self._get_xy(self.xy, 'data')
45974597
return (
45984598
self._get_xy(self.xy, self.xycoords) # converted data point
4599-
+ xy * self.get_figure(root=False).dpi / 72) # converted offset
4599+
+ xy * self.get_figure(root=True).dpi / 72) # converted offset
46004600
elif s == 'polar':
46014601
theta, r = x, y
46024602
x = r * np.cos(theta)

lib/matplotlib/pyplot.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -989,15 +989,16 @@ def figure(
989989

990990
if isinstance(num, FigureBase):
991991
# type narrowed to `Figure | SubFigure` by combination of input and isinstance
992-
if num.canvas.manager is None:
992+
root_fig = num.get_figure(root=True)
993+
if root_fig.canvas.manager is None:
993994
raise ValueError("The passed figure is not managed by pyplot")
994995
elif any([figsize, dpi, facecolor, edgecolor, not frameon,
995-
kwargs]) and num.canvas.manager.num in allnums:
996+
kwargs]) and root_fig.canvas.manager.num in allnums:
996997
_api.warn_external(
997-
"Ignoring specified arguments in this call "
998-
f"because figure with num: {num.canvas.manager.num} already exists")
999-
_pylab_helpers.Gcf.set_active(num.canvas.manager)
1000-
return num.get_figure(root=True)
998+
"Ignoring specified arguments in this call because figure "
999+
f"with num: {root_fig.canvas.manager.num} already exists")
1000+
_pylab_helpers.Gcf.set_active(root_fig.canvas.manager)
1001+
return root_fig
10011002

10021003
next_num = max(allnums) + 1 if allnums else 1
10031004
fig_label = ''

lib/matplotlib/quiver.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -316,11 +316,11 @@ def __init__(self, Q, X, Y, U, label,
316316

317317
@property
318318
def labelsep(self):
319-
return self._labelsep_inches * self.Q.axes.get_figure(root=False).dpi
319+
return self._labelsep_inches * self.Q.axes.get_figure(root=True).dpi
320320

321321
def _init(self):
322322
if True: # self._dpi_at_last_init != self.axes.get_figure().dpi
323-
if self.Q._dpi_at_last_init != self.Q.axes.get_figure(root=False).dpi:
323+
if self.Q._dpi_at_last_init != self.Q.axes.get_figure(root=True).dpi:
324324
self.Q._init()
325325
self._set_transform()
326326
with cbook._setattr_cm(self.Q, pivot=self.pivot[self.labelpos],
@@ -341,7 +341,7 @@ def _init(self):
341341
self.vector.set_color(self.color)
342342
self.vector.set_transform(self.Q.get_transform())
343343
self.vector.set_figure(self.get_figure())
344-
self._dpi_at_last_init = self.Q.axes.get_figure(root=False).dpi
344+
self._dpi_at_last_init = self.Q.axes.get_figure(root=True).dpi
345345

346346
def _text_shift(self):
347347
return {
@@ -519,11 +519,11 @@ def _init(self):
519519
self.width = 0.06 * self.span / sn
520520

521521
# _make_verts sets self.scale if not already specified
522-
if (self._dpi_at_last_init != self.axes.get_figure(root=False).dpi
522+
if (self._dpi_at_last_init != self.axes.get_figure(root=True).dpi
523523
and self.scale is None):
524524
self._make_verts(self.XY, self.U, self.V, self.angles)
525525

526-
self._dpi_at_last_init = self.axes.get_figure(root=False).dpi
526+
self._dpi_at_last_init = self.axes.get_figure(root=True).dpi
527527

528528
def get_datalim(self, transData):
529529
trans = self.get_transform()
@@ -580,7 +580,7 @@ def _dots_per_unit(self, units):
580580
'width': bb.width,
581581
'height': bb.height,
582582
'dots': 1.,
583-
'inches': self.axes.get_figure(root=False).dpi,
583+
'inches': self.axes.get_figure(root=True).dpi,
584584
}, units=units)
585585

586586
def _set_transform(self):

0 commit comments

Comments
 (0)