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

Skip to content

Commit 5025c8b

Browse files
committed
FIX: update
1 parent 8de355d commit 5025c8b

File tree

4 files changed

+67
-61
lines changed

4 files changed

+67
-61
lines changed

lib/matplotlib/_constrained_layout.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -427,17 +427,15 @@ def make_layout_margins(layoutgrids, fig, renderer, *, w_pad=0, h_pad=0,
427427
bbox = inv_trans_fig(leg.get_tightbbox(renderer))
428428
w = bbox.width + 2 * w_pad
429429
h = bbox.height + 2 * h_pad
430-
margin = 'right'
431-
if ((leg._loc in (3, 4) and leg._outside == 'lower') or
432-
(leg._loc == 8)):
433-
layoutgrids[gs].edit_margin_min('bottom', h)
434-
elif ((leg._loc in (1, 2) and leg._outside == 'upper') or
435-
(leg._loc == 9)):
436-
layoutgrids[gs].edit_margin_min('top', h)
437-
elif leg._loc in (1, 4, 5, 7):
438-
layoutgrids[gs].edit_margin_min('right', w)
439-
elif leg._loc in (2, 3, 6):
440-
layoutgrids[gs].edit_margin_min('left', w)
430+
legendloc = leg._outside
431+
if legendloc == 'lower':
432+
layoutgrids[fig].edit_margin_min('bottom', h)
433+
elif legendloc == 'upper':
434+
layoutgrids[fig].edit_margin_min('top', h)
435+
if legendloc == 'right':
436+
layoutgrids[fig].edit_margin_min('right', w)
437+
elif legendloc == 'left':
438+
layoutgrids[fig].edit_margin_min('left', w)
441439

442440

443441
def make_margin_suptitles(layoutgrids, fig, renderer, *, w_pad=0, h_pad=0):

lib/matplotlib/figure.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,10 +1113,27 @@ def legend(self, *args, **kwargs):
11131113
# extra_args = extra_args[1:]
11141114
pass
11151115
transform = kwargs.pop('bbox_transform', self.transSubfigure)
1116+
loc = kwargs.pop('loc', None)
1117+
# handle outside legends:
1118+
outside = None
1119+
if isinstance(loc, str):
1120+
if loc.split()[0] == 'outside':
1121+
loc = loc.replace('outside ', '')
1122+
outside = loc.replace('center ', '')
1123+
outside = outside.split()[0]
1124+
locs = loc.split()
1125+
if len(locs) > 1 and locs[0] in ('right', 'left'):
1126+
# locs doesn't accept "left upper", etc, so swap
1127+
if locs[0] != 'center':
1128+
locs = locs[::-1]
1129+
loc = locs[0] + ' ' + locs[1]
1130+
1131+
kwargs['loc'] = loc
1132+
11161133
# explicitly set the bbox transform if the user hasn't.
11171134
l = mlegend.Legend(self, handles, labels, *extra_args,
11181135
bbox_transform=transform, **kwargs)
1119-
l._outside = kwargs.pop('outside', False)
1136+
l._outside = outside
11201137
self.legends.append(l)
11211138
l._remove_method = self.legends.remove
11221139
self.stale = True

lib/matplotlib/legend.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,6 @@ def _update_bbox_to_anchor(self, loc_in_canvas):
289289
290290
draggable : bool, default: False
291291
Whether the legend can be dragged with the mouse.
292-
293-
outside : bool or string
294-
For `.Figure.legend` when used with `.Figure.set_constrained_layout`.
295-
If True, place the legend outside all the axes in the figure.
296-
loc='upper right/left' wil usually put beside the figure, but if
297-
outside='upper', then place above the axes; if loc='lower right/left'
298-
and outside='lower' then place below the axes.
299292
""")
300293

301294

@@ -354,7 +347,6 @@ def __init__(
354347
*,
355348
ncol=1, # synonym for ncols (backward compatibility)
356349
draggable=False, # whether the legend can be dragged with the mouse
357-
outside=False,
358350
):
359351
"""
360352
Parameters
@@ -403,7 +395,6 @@ def __init__(
403395
self.prop.set_size(mpl.rcParams["legend.fontsize"])
404396

405397
self._fontsize = self.prop.get_size_in_points()
406-
407398
self.texts = []
408399
self.legendHandles = []
409400
self._legend_title_box = None

lib/matplotlib/tests/test_legend.py

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -343,31 +343,35 @@ def test_legend_handle_label(self):
343343
with mock.patch('matplotlib.legend.Legend') as Legend:
344344
fig.legend(lines, ['hello world'])
345345
Legend.assert_called_with(fig, lines, ['hello world'],
346-
bbox_transform=fig.transFigure)
346+
bbox_transform=fig.transFigure,
347+
loc=None)
347348

348349
def test_legend_no_args(self):
349350
fig, ax = plt.subplots()
350351
lines = ax.plot(range(10), label='hello world')
351352
with mock.patch('matplotlib.legend.Legend') as Legend:
352353
fig.legend()
353354
Legend.assert_called_with(fig, lines, ['hello world'],
354-
bbox_transform=fig.transFigure)
355+
bbox_transform=fig.transFigure,
356+
loc=None)
355357

356358
def test_legend_label_arg(self):
357359
fig, ax = plt.subplots()
358360
lines = ax.plot(range(10))
359361
with mock.patch('matplotlib.legend.Legend') as Legend:
360362
fig.legend(['foobar'])
361363
Legend.assert_called_with(fig, lines, ['foobar'],
362-
bbox_transform=fig.transFigure)
364+
bbox_transform=fig.transFigure,
365+
loc=None)
363366

364367
def test_legend_label_three_args(self):
365368
fig, ax = plt.subplots()
366369
lines = ax.plot(range(10))
367370
with mock.patch('matplotlib.legend.Legend') as Legend:
368371
fig.legend(lines, ['foobar'], 'right')
369372
Legend.assert_called_with(fig, lines, ['foobar'], 'right',
370-
bbox_transform=fig.transFigure)
373+
bbox_transform=fig.transFigure,
374+
loc=None)
371375

372376
def test_legend_label_three_args_pluskw(self):
373377
# test that third argument and loc= called together give
@@ -400,47 +404,43 @@ def test_warn_args_kwargs(self):
400404

401405

402406
def test_figure_legend_outside():
403-
outside = [True]*9 + ['upper', 'upper', 'lower', 'lower']
404-
print(outside)
405-
todos = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4]
406-
axbb = [[20.347556, 27.722556, 659.249, 588.833], # upper right
407-
[151.681556, 27.722556, 790.583, 588.833], # upper left
408-
[151.681556, 27.722556, 790.583, 588.833], # lower left
409-
[20.347556, 27.722556, 659.249, 588.833], # lower right
410-
[20.347556, 27.722556, 659.249, 588.833], # right
411-
[151.681556, 27.722556, 790.583, 588.833], # center left
412-
[20.347556, 27.722556, 659.249, 588.833], # center right
413-
[20.347556, 71.056556, 790.583, 588.833], # lower center
414-
[20.347556, 27.722556, 790.583, 545.499], # upper center
415-
[20.347556, 27.722556, 790.583, 545.499], # up-right,'upper'
416-
[20.347556, 27.722556, 790.583, 545.499], # up-left,'upper'
417-
[20.347556, 71.056556, 790.583, 588.833], # low-left,'lower'
418-
[20.347556, 71.056556, 790.583, 588.833], # low-right,'lower'
419-
]
420-
legbb = [[667., 555., 790., 590.], # upper right
421-
[10., 555., 133., 590.], # upper left
422-
[10., 10., 133., 45.], # lower left
423-
[667, 10., 790., 45.], # lower right
424-
[667., 282.5, 790., 317.5],
425-
[10., 282.5, 133., 317.5],
426-
[667., 282.5, 790., 317.5],
427-
[338.5, 10., 461.5, 45.],
428-
[338.5, 555., 461.5, 590.],
429-
[667., 555., 790., 590.], # upper right
430-
[10., 555., 133., 590.], # upper left
431-
[10., 10., 133., 45.], # lower left
432-
[667, 10., 790., 45.], # lower right
433-
]
407+
todos = ['upper ' + pos for pos in ['left', 'center', 'right']]
408+
todos += ['lower ' + pos for pos in ['left', 'center', 'right']]
409+
todos += ['left ' + pos for pos in ['lower', 'center', 'upper']]
410+
todos += ['right ' + pos for pos in ['lower', 'center', 'upper']]
411+
412+
upperext = [20.347556, 27.722556, 790.583, 545.499]
413+
lowerext = [20.347556, 71.056556, 790.583, 588.833]
414+
leftext = [151.681556, 27.722556, 790.583, 588.833]
415+
rightext = [20.347556, 27.722556, 659.249, 588.833]
416+
axbb = [upperext, upperext, upperext,
417+
lowerext, lowerext, lowerext,
418+
leftext, leftext, leftext,
419+
rightext, rightext, rightext]
420+
421+
legbb = [[10., 555., 133., 590.], # upper left
422+
[338.5, 555., 461.5, 590.], # upper center
423+
[667, 555., 790., 590.], # upper right
424+
[10., 10., 133., 45.], # lower left
425+
[338.5, 10., 461.5, 45.], # lower center
426+
[667., 10., 790., 45.], # lower right
427+
[10., 10., 133., 45.], # left lower
428+
[10., 282.5, 133., 317.5], # left center
429+
[10., 555., 133., 590.], # left upper
430+
[667, 10., 790., 45.], # right lower
431+
[667., 282.5, 790., 317.5], # right center
432+
[667., 555., 790., 590.]] # right upper
433+
434434
for nn, todo in enumerate(todos):
435435
print(todo)
436436
fig, axs = plt.subplots(constrained_layout=True, dpi=100)
437437
axs.plot(range(10), label='Boo1')
438-
leg = fig.legend(loc=todo, outside=outside[nn])
439-
renderer = fig.canvas.get_renderer()
440-
fig.canvas.draw()
441-
assert_allclose(axs.get_window_extent(renderer=renderer).extents,
438+
leg = fig.legend(loc='outside ' + todo)
439+
fig.draw_without_rendering()
440+
441+
assert_allclose(axs.get_window_extent().extents,
442442
axbb[nn])
443-
assert_allclose(leg.get_window_extent(renderer=renderer).extents,
443+
assert_allclose(leg.get_window_extent().extents,
444444
legbb[nn])
445445

446446

0 commit comments

Comments
 (0)