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

Skip to content

Commit 3541148

Browse files
committed
Make OffsetBox.set_offset callables nullary.
1 parent a68dfad commit 3541148

File tree

3 files changed

+33
-16
lines changed

3 files changed

+33
-16
lines changed

lib/matplotlib/legend.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,8 +585,12 @@ def _get_loc(self):
585585

586586
_loc = property(_get_loc, _set_loc)
587587

588-
def _findoffset(self, width, height, xdescent, ydescent, renderer):
588+
def _findoffset(self):
589589
"""Helper function to locate the legend."""
590+
renderer = (self.figure._cachedRenderer
591+
or self._legend_box._cached_renderer)
592+
width, height, xdescent, ydescent = self._legend_box.get_extent(
593+
renderer)
590594

591595
if self._loc == 0: # "best".
592596
x, y = self._find_best_position(width, height, renderer)
@@ -883,6 +887,8 @@ def get_window_extent(self, renderer=None):
883887
# docstring inherited
884888
if renderer is None:
885889
renderer = self.figure._cachedRenderer
890+
# May not be cached on the figure, so cache it ourselves.
891+
self._cached_renderer = renderer
886892
return self._legend_box.get_window_extent(renderer=renderer)
887893

888894
def get_tightbbox(self, renderer):

lib/matplotlib/offsetbox.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,19 @@ def set_offset(self, xy):
263263
xy : (float, float) or callable
264264
The (x, y) coordinates of the offset in display units. These can
265265
either be given explicitly as a tuple (x, y), or by providing a
266-
function that converts the extent into the offset. This function
267-
must have the signature::
266+
function that dynamically computes an offset (taking the arguments
267+
passed to `.OffsetBox.get_offset`). It is recommended to make such
268+
functions take no arguments.
269+
270+
Before version 3.6, the callable had to have the signature::
268271
269272
def offset(width, height, xdescent, ydescent, renderer) \
270273
-> (float, float)
274+
275+
For backwards compatibility, callables with arbitrary signatures
276+
are currently accepted as long as compatible arguments are
277+
passed in calls to `.set_offset`. This should be considered an
278+
implementation detail, and may be deprecated in the future.
271279
"""
272280
self._offset = xy
273281
self.stale = True
@@ -276,9 +284,12 @@ def get_offset(self, *args, **kwargs):
276284
"""
277285
Return the (x, y) offset.
278286
279-
Parameters must be passed if the offset is dynamically determined by a
280-
callable (see `~.OffsetBox.set_offset`), and are forwarded to that
281-
callable.
287+
Parameters are usually not necessary. The only exception can occur
288+
if you have defined a callable to calculate the offset dynamically (see
289+
`~.OffsetBox.set_offset`). It is now recommended that such a
290+
callable does not take parameters. However, for backward-compatibility,
291+
callables with parameters are still supported; these parameters must be
292+
provided to `.get_offset` so that we can pass them on.
282293
"""
283294
return (self._offset(*args, **kwargs) if callable(self._offset)
284295
else self._offset)
@@ -340,7 +351,9 @@ def get_extent(self, renderer):
340351
def get_window_extent(self, renderer):
341352
# docstring inherited
342353
w, h, xd, yd = self.get_extent(renderer)
343-
px, py = self.get_offset(w, h, xd, yd, renderer)
354+
# dynamic offset compute callables may need to access the renderer.
355+
self._cached_renderer = renderer
356+
px, py = self.get_offset()
344357
return mtransforms.Bbox.from_bounds(px - xd, py - yd, w, h)
345358

346359
def draw(self, renderer):
@@ -349,7 +362,7 @@ def draw(self, renderer):
349362
to the given *renderer*.
350363
"""
351364
w, h, xdescent, ydescent, offsets = self.get_extent_offsets(renderer)
352-
px, py = self.get_offset(w, h, xdescent, ydescent, renderer)
365+
px, py = self.get_offset()
353366
for c, (ox, oy) in zip(self.get_visible_children(), offsets):
354367
c.set_offset((px + ox, py + oy))
355368
c.draw(renderer)
@@ -530,7 +543,7 @@ def get_extent_offsets(self, renderer):
530543
def draw(self, renderer):
531544
# docstring inherited
532545
w, h, xdescent, ydescent, offsets = self.get_extent_offsets(renderer)
533-
px, py = self.get_offset(w, h, xdescent, ydescent, renderer)
546+
px, py = self.get_offset()
534547
for c, (ox, oy) in zip(self.get_visible_children(), offsets):
535548
c.set_offset((px + ox, py + oy))
536549

@@ -1036,9 +1049,10 @@ def get_window_extent(self, renderer):
10361049
# docstring inherited
10371050
# Update the offset func, which depends on the dpi of the renderer
10381051
# (because of the padding).
1052+
w, h, xd, yd = self.get_extent(renderer)
10391053
fontsize = renderer.points_to_pixels(self.prop.get_size_in_points())
10401054

1041-
def _offset(w, h, xd, yd, renderer):
1055+
def _offset(*args, **kwargs): # args are ignored; left for backcompat.
10421056
bbox = Bbox.from_bounds(0, 0, w, h)
10431057
pad = self.borderpad * fontsize
10441058
bbox_to_anchor = self.get_bbox_to_anchor()
@@ -1064,9 +1078,7 @@ def draw(self, renderer):
10641078
self.update_frame(bbox, fontsize)
10651079
self.patch.draw(renderer)
10661080

1067-
width, height, xdescent, ydescent = self.get_extent(renderer)
1068-
1069-
px, py = self.get_offset(width, height, xdescent, ydescent, renderer)
1081+
px, py = self.get_offset()
10701082

10711083
self.get_child().set_offset((px, py))
10721084
self.get_child().draw(renderer)
@@ -1545,8 +1557,7 @@ def __init__(self, ref_artist, offsetbox, use_blit=False):
15451557
def save_offset(self):
15461558
offsetbox = self.offsetbox
15471559
renderer = offsetbox.figure._cachedRenderer
1548-
w, h, xd, yd = offsetbox.get_extent(renderer)
1549-
offset = offsetbox.get_offset(w, h, xd, yd, renderer)
1560+
offset = offsetbox.get_offset()
15501561
self.offsetbox_x, self.offsetbox_y = offset
15511562
self.offsetbox.set_offset(offset)
15521563

lib/mpl_toolkits/axes_grid1/inset_locator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def draw(self, renderer):
7171
def __call__(self, ax, renderer):
7272
self.axes = ax
7373
bbox = self.get_window_extent(renderer)
74-
px, py = self.get_offset(bbox.width, bbox.height, 0, 0, renderer)
74+
px, py = self.get_offset()
7575
bbox_canvas = Bbox.from_bounds(px, py, bbox.width, bbox.height)
7676
tr = ax.figure.transFigure.inverted()
7777
return TransformedBbox(bbox_canvas, tr)

0 commit comments

Comments
 (0)