Skip to content

Commit 2a1a1a6

Browse files
oscargustacaswell
authored andcommitted
API/DOC: Document legend_handles and legend_handlers
- deprecate legendHandles
1 parent c1588e6 commit 2a1a1a6

File tree

5 files changed

+73
-23
lines changed

5 files changed

+73
-23
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
``legend.legendHandles``
2+
~~~~~~~~~~~~~~~~~~~~~~~~
3+
4+
... was undocumented and has been renamed to ``legend_handles``. Using the
5+
old name is deprecated.

lib/matplotlib/legend.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,19 @@ def __init__(
360360
labels : list of str
361361
A list of labels to show next to the artists. The length of handles
362362
and labels should be the same. If they are not, they are truncated
363-
to the smaller of both lengths.
363+
to the shortest of both lengths.
364364
365365
Other Parameters
366366
----------------
367367
%(_legend_kw_doc)s
368368
369+
Attributes
370+
----------
371+
legend_handles
372+
A list of legend handles used by the legend.
373+
374+
.. versionadded:: 3.7
375+
369376
Notes
370377
-----
371378
Users can specify any arbitrary location for the legend using the
@@ -397,7 +404,7 @@ def __init__(
397404
self._fontsize = self.prop.get_size_in_points()
398405

399406
self.texts = []
400-
self.legendHandles = []
407+
self.legend_handles = []
401408
self._legend_title_box = None
402409

403410
#: A dictionary with the extra handler mappings for this Legend
@@ -561,7 +568,7 @@ def val_or_rc(val, rc_name):
561568
labelcolor = mpl.rcParams['text.color']
562569
if isinstance(labelcolor, str) and labelcolor in color_getters:
563570
getter_names = color_getters[labelcolor]
564-
for handle, text in zip(self.legendHandles, self.texts):
571+
for handle, text in zip(self.legend_handles, self.texts):
565572
try:
566573
if handle.get_array() is not None:
567574
continue
@@ -594,6 +601,9 @@ def val_or_rc(val, rc_name):
594601
else:
595602
raise ValueError(f"Invalid labelcolor: {labelcolor!r}")
596603

604+
legendHandles = _api.deprecated('3.7', alternative="legend_handles")(
605+
property(lambda self: self.legend_handles))
606+
597607
def _set_artist_props(self, a):
598608
"""
599609
Set the boilerplate props for artists added to axes.
@@ -838,7 +848,7 @@ def _init_legend_box(self, handles, labels, markerfirst=True):
838848
self._legend_box.set_figure(self.figure)
839849
self._legend_box.axes = self.axes
840850
self.texts = text_list
841-
self.legendHandles = handle_list
851+
self.legend_handles = handle_list
842852

843853
def _auto_legend_data(self):
844854
"""
@@ -885,12 +895,12 @@ def get_frame(self):
885895

886896
def get_lines(self):
887897
r"""Return the list of `~.lines.Line2D`\s in the legend."""
888-
return [h for h in self.legendHandles if isinstance(h, Line2D)]
898+
return [h for h in self.legend_handles if isinstance(h, Line2D)]
889899

890900
def get_patches(self):
891901
r"""Return the list of `~.patches.Patch`\s in the legend."""
892902
return silent_list('Patch',
893-
[h for h in self.legendHandles
903+
[h for h in self.legend_handles
894904
if isinstance(h, Patch)])
895905

896906
def get_texts(self):

lib/matplotlib/legend_handler.py

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
</tutorials/intermediate/legend_guide>` before reading this documentation.
1010
1111
Legend handlers are expected to be a callable object with a following
12-
signature. ::
12+
signature::
1313
1414
legend_handler(legend, orig_handle, fontsize, handlebox)
1515
1616
Where *legend* is the legend itself, *orig_handle* is the original
17-
plot, *fontsize* is the fontsize in pixels, and *handlebox* is a
18-
OffsetBox instance. Within the call, you should create relevant
17+
plot, *fontsize* is the fontsize in pixels, and *handlebox* is an
18+
`.OffsetBox` instance. Within the call, you should create relevant
1919
artists (using relevant properties from the *legend* and/or
20-
*orig_handle*) and add them into the handlebox. The artists need to
21-
be scaled according to the fontsize (note that the size is in pixel,
20+
*orig_handle*) and add them into the *handlebox*. The artists need to
21+
be scaled according to the *fontsize* (note that the size is in pixel,
2222
i.e., this is dpi-scaled value).
2323
2424
This module includes definition of several legend handler classes
@@ -49,7 +49,7 @@ class HandlerBase:
4949
A base class for default legend handlers.
5050
5151
The derived classes are meant to override *create_artists* method, which
52-
has a following signature.::
52+
has the following signature::
5353
5454
def create_artists(self, legend, orig_handle,
5555
xdescent, ydescent, width, height, fontsize,
@@ -61,6 +61,18 @@ def create_artists(self, legend, orig_handle,
6161
6262
"""
6363
def __init__(self, xpad=0., ypad=0., update_func=None):
64+
"""
65+
Parameters
66+
----------
67+
68+
xpad : float, optional
69+
Padding in x-direction.
70+
ypad : float, optional
71+
Padding in y-direction.
72+
update_func : callable, optional
73+
Function for updating the legend handler properties from another
74+
legend handler, used by `~HandlerBase.update_prop`.
75+
"""
6476
self._xpad, self._ypad = xpad, ypad
6577
self._update_prop_func = update_func
6678

@@ -133,6 +145,24 @@ def legend_artist(self, legend, orig_handle,
133145
def create_artists(self, legend, orig_handle,
134146
xdescent, ydescent, width, height, fontsize,
135147
trans):
148+
"""
149+
Return the legend artists generated.
150+
151+
Parameters
152+
----------
153+
legend : `~matplotlib.legend.Legend`
154+
The legend for which these legend artists are being created.
155+
orig_handle : `~matplotlib.artist.Artist` or similar
156+
The object for which these legend artists are being created.
157+
xdescent, ydescent, width, height : int
158+
The rectangle (*xdescent*, *ydescent*, *width*, *height*) that the
159+
legend artists being created should fit within.
160+
fontsize : int
161+
The fontsize in pixels. The legend artists being created should
162+
be scaled according to the given fontsize.
163+
trans : `~matplotlib.transforms.Transform`
164+
The transform that is applied to the legend artists being created.
165+
"""
136166
raise NotImplementedError('Derived must override')
137167

138168

@@ -217,7 +247,7 @@ class HandlerLine2DCompound(HandlerNpoints):
217247
def create_artists(self, legend, orig_handle,
218248
xdescent, ydescent, width, height, fontsize,
219249
trans):
220-
250+
# Doc-string inherited
221251
xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
222252
width, height, fontsize)
223253

@@ -276,7 +306,7 @@ class HandlerLine2D(HandlerNpoints):
276306
def create_artists(self, legend, orig_handle,
277307
xdescent, ydescent, width, height, fontsize,
278308
trans):
279-
309+
# Doc-string inherited
280310
xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
281311
width, height, fontsize)
282312

@@ -341,6 +371,7 @@ def _create_patch(self, legend, orig_handle,
341371

342372
def create_artists(self, legend, orig_handle,
343373
xdescent, ydescent, width, height, fontsize, trans):
374+
# Doc-string inherited
344375
p = self._create_patch(legend, orig_handle,
345376
xdescent, ydescent, width, height, fontsize)
346377
self.update_prop(p, orig_handle, legend)
@@ -374,6 +405,7 @@ def _create_line(orig_handle, width, height):
374405

375406
def create_artists(self, legend, orig_handle,
376407
xdescent, ydescent, width, height, fontsize, trans):
408+
# Doc-string inherited
377409
if orig_handle.get_fill() or (orig_handle.get_hatch() is not None):
378410
p = self._create_patch(orig_handle, xdescent, ydescent, width,
379411
height)
@@ -404,7 +436,7 @@ def _default_update_prop(self, legend_handle, orig_handle):
404436

405437
def create_artists(self, legend, orig_handle,
406438
xdescent, ydescent, width, height, fontsize, trans):
407-
439+
# Doc-string inherited
408440
xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
409441
width, height, fontsize)
410442
ydata = np.full_like(xdata, (height - ydescent) / 2)
@@ -471,6 +503,7 @@ def create_collection(self, orig_handle, sizes, offsets, offset_transform):
471503
def create_artists(self, legend, orig_handle,
472504
xdescent, ydescent, width, height, fontsize,
473505
trans):
506+
# Doc-string inherited
474507
xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
475508
width, height, fontsize)
476509

@@ -534,7 +567,7 @@ def get_err_size(self, legend, xdescent, ydescent,
534567
def create_artists(self, legend, orig_handle,
535568
xdescent, ydescent, width, height, fontsize,
536569
trans):
537-
570+
# Doc-string inherited
538571
plotlines, caplines, barlinecols = orig_handle
539572

540573
xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
@@ -653,6 +686,7 @@ def get_ydata(self, legend, xdescent, ydescent, width, height, fontsize):
653686
def create_artists(self, legend, orig_handle,
654687
xdescent, ydescent, width, height, fontsize,
655688
trans):
689+
# Doc-string inherited
656690
markerline, stemlines, baseline = orig_handle
657691
# Check to see if the stemcontainer is storing lines as a list or a
658692
# LineCollection. Eventually using a list will be removed, and this
@@ -730,7 +764,7 @@ def __init__(self, ndivide=1, pad=None, **kwargs):
730764
def create_artists(self, legend, orig_handle,
731765
xdescent, ydescent, width, height, fontsize,
732766
trans):
733-
767+
# Doc-string inherited
734768
handler_map = legend.get_legend_handler_map()
735769

736770
if self._ndivide is None:
@@ -797,6 +831,7 @@ def get_first(prop_array):
797831

798832
def create_artists(self, legend, orig_handle,
799833
xdescent, ydescent, width, height, fontsize, trans):
834+
# Doc-string inherited
800835
p = Rectangle(xy=(-xdescent, -ydescent),
801836
width=width, height=height)
802837
self.update_prop(p, orig_handle, legend)

lib/matplotlib/tests/test_legend.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ def test_legend_label_with_leading_underscore():
147147
with pytest.warns(UserWarning,
148148
match=r"starts with '_'.*excluded from the legend."):
149149
legend = ax.legend(handles=[line])
150-
assert len(legend.legendHandles) == 0
150+
assert len(legend.legend_handles) == 0
151151

152152

153153
@image_comparison(['legend_labels_first.png'], remove_text=True)
@@ -550,7 +550,7 @@ def test_linecollection_scaled_dashes():
550550
ax.add_collection(lc3)
551551

552552
leg = ax.legend([lc1, lc2, lc3], ["line1", "line2", 'line 3'])
553-
h1, h2, h3 = leg.legendHandles
553+
h1, h2, h3 = leg.legend_handles
554554

555555
for oh, lh in zip((lc1, lc2, lc3), (h1, h2, h3)):
556556
assert oh.get_linestyles()[0] == lh._dash_pattern
@@ -970,7 +970,7 @@ def test_legend_draggable(draggable):
970970
def test_alpha_handles():
971971
x, n, hh = plt.hist([1, 2, 3], alpha=0.25, label='data', color='red')
972972
legend = plt.legend()
973-
for lh in legend.legendHandles:
973+
for lh in legend.legend_handles:
974974
lh.set_alpha(1.0)
975975
assert lh.get_facecolor()[:-1] == hh[1].get_facecolor()[:-1]
976976
assert lh.get_edgecolor()[:-1] == hh[1].get_edgecolor()[:-1]
@@ -1102,7 +1102,7 @@ def test_handlerline2d():
11021102
ax.scatter([0, 1], [0, 1], marker="v")
11031103
handles = [mlines.Line2D([0], [0], marker="v")]
11041104
leg = ax.legend(handles, ["Aardvark"], numpoints=1)
1105-
assert handles[0].get_marker() == leg.legendHandles[0].get_marker()
1105+
assert handles[0].get_marker() == leg.legend_handles[0].get_marker()
11061106

11071107

11081108
def test_subfigure_legend():

lib/mpl_toolkits/mplot3d/tests/test_legend3d.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def test_linecollection_scaled_dashes():
5555
ax.add_collection(lc3)
5656

5757
leg = ax.legend([lc1, lc2, lc3], ['line1', 'line2', 'line 3'])
58-
h1, h2, h3 = leg.legendHandles
58+
h1, h2, h3 = leg.legend_handles
5959

6060
for oh, lh in zip((lc1, lc2, lc3), (h1, h2, h3)):
6161
assert oh.get_linestyles()[0] == lh._dash_pattern
@@ -67,7 +67,7 @@ def test_handlerline3d():
6767
ax.scatter([0, 1], [0, 1], marker="v")
6868
handles = [art3d.Line3D([0], [0], [0], marker="v")]
6969
leg = ax.legend(handles, ["Aardvark"], numpoints=1)
70-
assert handles[0].get_marker() == leg.legendHandles[0].get_marker()
70+
assert handles[0].get_marker() == leg.legend_handles[0].get_marker()
7171

7272

7373
def test_contour_legend_elements():

0 commit comments

Comments
 (0)