Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3541148

Browse filesBrowse files
committed
Make OffsetBox.set_offset callables nullary.
1 parent a68dfad commit 3541148
Copy full SHA for 3541148

File tree

Expand file treeCollapse file tree

3 files changed

+33
-16
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+33
-16
lines changed

‎lib/matplotlib/legend.py

Copy file name to clipboardExpand all lines: lib/matplotlib/legend.py
+7-1Lines 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

Copy file name to clipboardExpand all lines: lib/matplotlib/offsetbox.py
+25-14Lines 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

Copy file name to clipboardExpand all lines: lib/mpl_toolkits/axes_grid1/inset_locator.py
+1-1Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.