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 24ba7a8

Browse filesBrowse files
authored
Merge pull request #9644 from matplotlib/auto-backport-of-pr-9324
Backport PR #9324 on branch v2.1.x
2 parents 9f767f0 + 6d97d06 commit 24ba7a8
Copy full SHA for 24ba7a8

File tree

Expand file treeCollapse file tree

5 files changed

+754
-250
lines changed
Filter options
Expand file treeCollapse file tree

5 files changed

+754
-250
lines changed

‎lib/matplotlib/axes/_axes.py

Copy file name to clipboardExpand all lines: lib/matplotlib/axes/_axes.py
+17-81Lines changed: 17 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -252,27 +252,6 @@ def set_ylabel(self, ylabel, fontdict=None, labelpad=None, **kwargs):
252252
self.yaxis.labelpad = labelpad
253253
return self.yaxis.set_label_text(ylabel, fontdict, **kwargs)
254254

255-
def _get_legend_handles(self, legend_handler_map=None):
256-
"""
257-
Return a generator of artists that can be used as handles in
258-
a legend.
259-
260-
"""
261-
handles_original = (self.lines + self.patches +
262-
self.collections + self.containers)
263-
handler_map = mlegend.Legend.get_default_handler_map()
264-
265-
if legend_handler_map is not None:
266-
handler_map = handler_map.copy()
267-
handler_map.update(legend_handler_map)
268-
269-
has_handler = mlegend.Legend.get_legend_handler
270-
271-
for handle in handles_original:
272-
label = handle.get_label()
273-
if label != '_nolegend_' and has_handler(handler_map, handle):
274-
yield handle
275-
276255
def get_legend_handles_labels(self, legend_handler_map=None):
277256
"""
278257
Return handles and labels for legend
@@ -283,16 +262,13 @@ def get_legend_handles_labels(self, legend_handler_map=None):
283262
ax.legend(h, l)
284263
285264
"""
286-
handles = []
287-
labels = []
288-
for handle in self._get_legend_handles(legend_handler_map):
289-
label = handle.get_label()
290-
if label and not label.startswith('_'):
291-
handles.append(handle)
292-
labels.append(label)
293265

266+
# pass through to legend.
267+
handles, labels = mlegend._get_legend_handles_labels([self],
268+
legend_handler_map)
294269
return handles, labels
295270

271+
@docstring.dedent_interpd
296272
def legend(self, *args, **kwargs):
297273
"""
298274
Places a legend on the axes.
@@ -328,6 +304,7 @@ def legend(self, *args, **kwargs):
328304
329305
Parameters
330306
----------
307+
331308
loc : int or string or pair of floats, default: 'upper right'
332309
The location of the legend. Possible codes are:
333310
@@ -352,8 +329,7 @@ def legend(self, *args, **kwargs):
352329
corner of the legend in axes coordinates (in which case
353330
``bbox_to_anchor`` will be ignored).
354331
355-
bbox_to_anchor : :class:`matplotlib.transforms.BboxBase` instance \
356-
or tuple of floats
332+
bbox_to_anchor : `~.BboxBase` or pair of floats
357333
Specify any arbitrary location for the legend in `bbox_transform`
358334
coordinates (default Axes coordinates).
359335
@@ -498,6 +474,11 @@ def legend(self, *args, **kwargs):
498474
handler. This `handler_map` updates the default handler map
499475
found at :func:`matplotlib.legend.Legend.get_legend_handler_map`.
500476
477+
Returns
478+
-------
479+
480+
:class:`matplotlib.legend.Legend` instance
481+
501482
Notes
502483
-----
503484
@@ -510,57 +491,12 @@ def legend(self, *args, **kwargs):
510491
.. plot:: gallery/api/legend.py
511492
512493
"""
513-
handlers = kwargs.get('handler_map', {}) or {}
514-
515-
# Support handles and labels being passed as keywords.
516-
handles = kwargs.pop('handles', None)
517-
labels = kwargs.pop('labels', None)
518-
519-
if (handles is not None or labels is not None) and len(args):
520-
warnings.warn("You have mixed positional and keyword "
521-
"arguments, some input will be "
522-
"discarded.")
523-
524-
# if got both handles and labels as kwargs, make same length
525-
if handles and labels:
526-
handles, labels = zip(*zip(handles, labels))
527-
528-
elif handles is not None and labels is None:
529-
labels = [handle.get_label() for handle in handles]
530-
for label, handle in zip(labels[:], handles[:]):
531-
if label.startswith('_'):
532-
warnings.warn('The handle {!r} has a label of {!r} which '
533-
'cannot be automatically added to the '
534-
'legend.'.format(handle, label))
535-
labels.remove(label)
536-
handles.remove(handle)
537-
538-
elif labels is not None and handles is None:
539-
# Get as many handles as there are labels.
540-
handles = [handle for handle, label
541-
in zip(self._get_legend_handles(handlers), labels)]
542-
543-
# No arguments - automatically detect labels and handles.
544-
elif len(args) == 0:
545-
handles, labels = self.get_legend_handles_labels(handlers)
546-
if not handles:
547-
return None
548-
549-
# One argument. User defined labels - automatic handle detection.
550-
elif len(args) == 1:
551-
labels, = args
552-
# Get as many handles as there are labels.
553-
handles = [handle for handle, label
554-
in zip(self._get_legend_handles(handlers), labels)]
555-
556-
# Two arguments:
557-
# * user defined handles and labels
558-
elif len(args) == 2:
559-
handles, labels = args
560-
561-
else:
562-
raise TypeError('Invalid arguments to legend.')
563-
494+
handles, labels, extra_args, kwargs = mlegend._parse_legend_args(
495+
[self],
496+
*args,
497+
**kwargs)
498+
if len(extra_args):
499+
raise TypeError('legend only accepts two non-keyword arguments')
564500
self.legend_ = mlegend.Legend(self, handles, labels, **kwargs)
565501
self.legend_._remove_method = lambda h: setattr(self, 'legend_', None)
566502
return self.legend_

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.