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

Skip to content

Commit 13149be

Browse files
committed
Add legend.labelcolor in rcParams
1 parent 3bf56aa commit 13149be

File tree

6 files changed

+149
-3
lines changed

6 files changed

+149
-3
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
New rcParams for legend: set legend labelcolor globally
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
4+
A new :rc:`legend.labelcolor` sets the default *labelcolor* argument for
5+
`.Figure.legend`. The special values 'linecolor', 'markerfacecolor'
6+
(or 'mfc'), or 'markeredgecolor' (or 'mec') will cause the legend text to match
7+
the corresponding color of marker.
8+
9+
10+
.. plot::
11+
12+
plt.rcParams['legend.labelcolor'] = 'linecolor'
13+
14+
# Make some fake data.
15+
a = np.arange(0, 3, .02)
16+
c = np.exp(a)
17+
d = c[::-1]
18+
19+
fig, ax = plt.subplots()
20+
ax.plot(a, c, 'g--', label='Model length')
21+
ax.plot(a, d, 'r:', label='Data length')
22+
23+
ax.legend()
24+
25+
plt.show()

lib/matplotlib/legend.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,15 @@ def _update_bbox_to_anchor(self, loc_in_canvas):
173173
absolute font size in points. String values are relative to the current
174174
default font size. This argument is only used if *prop* is not specified.
175175
176-
labelcolor : str or list
176+
labelcolor : str or list, default: :rc:`legend.labelcolor`
177177
The color of the text in the legend. Either a valid color string
178178
(for example, 'red'), or a list of color strings. The labelcolor can
179179
also be made to match the color of the line or marker using 'linecolor',
180180
'markerfacecolor' (or 'mfc'), or 'markeredgecolor' (or 'mec').
181181
182+
Labelcolor can be set globally using :rc:`legend.labelcolor`. If None,
183+
use :rc:`text.color`.
184+
182185
numpoints : int, default: :rc:`legend.numpoints`
183186
The number of marker points in the legend when creating a legend
184187
entry for a `.Line2D` (line).
@@ -539,8 +542,11 @@ def __init__(self, parent, handles, labels,
539542
'mec': ['get_markeredgecolor', 'get_edgecolor'],
540543
}
541544
if labelcolor is None:
542-
pass
543-
elif isinstance(labelcolor, str) and labelcolor in color_getters:
545+
if mpl.rcParams['legend.labelcolor'] is not None:
546+
labelcolor = mpl.rcParams['legend.labelcolor']
547+
else:
548+
labelcolor = mpl.rcParams['text.color']
549+
if isinstance(labelcolor, str) and labelcolor in color_getters:
544550
getter_names = color_getters[labelcolor]
545551
for handle, text in zip(self.legendHandles, self.texts):
546552
for getter_name in getter_names:

lib/matplotlib/mpl-data/matplotlibrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@
530530
#legend.scatterpoints: 1 # number of scatter points
531531
#legend.markerscale: 1.0 # the relative size of legend markers vs. original
532532
#legend.fontsize: medium
533+
#legend.labelcolor: None
533534
#legend.title_fontsize: None # None sets to the same as the default axes.
534535

535536
## Dimensions as fraction of font size:

lib/matplotlib/rcsetup.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,27 @@ def validate_color_for_prop_cycle(s):
289289
return validate_color(s)
290290

291291

292+
def _validate_color_or_linecolor(s):
293+
if cbook._str_equal(s, 'linecolor'):
294+
return s
295+
elif cbook._str_equal(s, 'mfc') or cbook._str_equal(s, 'markerfacecolor'):
296+
return 'markerfacecolor'
297+
elif cbook._str_equal(s, 'mec') or cbook._str_equal(s, 'markeredgecolor'):
298+
return 'markeredgecolor'
299+
elif s is None:
300+
return None
301+
elif isinstance(s, str) and len(s) == 6 or len(s) == 8:
302+
stmp = '#' + s
303+
if is_color_like(stmp):
304+
return stmp
305+
if s.lower() == 'none':
306+
return None
307+
elif is_color_like(s):
308+
return s
309+
310+
raise ValueError(f'{s!r} does not look like a color arg')
311+
312+
292313
def validate_color(s):
293314
"""Return a valid color arg."""
294315
if isinstance(s, str):
@@ -1017,6 +1038,8 @@ def _convert_validator_spec(key, conv):
10171038
"legend.scatterpoints": validate_int,
10181039
"legend.fontsize": validate_fontsize,
10191040
"legend.title_fontsize": validate_fontsize_None,
1041+
# color of the legend
1042+
"legend.labelcolor": _validate_color_or_linecolor,
10201043
# the relative size of legend markers vs. original
10211044
"legend.markerscale": validate_float,
10221045
"legend.shadow": validate_bool,

lib/matplotlib/tests/test_legend.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,85 @@ def test_legend_labelcolor_markerfacecolor():
644644
assert mpl.colors.same_color(text.get_color(), color)
645645

646646

647+
@pytest.mark.parametrize('color', ('red', 'none', (.5, .5, .5)))
648+
def test_legend_labelcolor_rcparam_single(color):
649+
# test the rcParams legend.labelcolor for a single color
650+
fig, ax = plt.subplots()
651+
ax.plot(np.arange(10), np.arange(10)*1, label='#1')
652+
ax.plot(np.arange(10), np.arange(10)*2, label='#2')
653+
ax.plot(np.arange(10), np.arange(10)*3, label='#3')
654+
655+
mpl.rcParams['legend.labelcolor'] = color
656+
leg = ax.legend()
657+
for text in leg.get_texts():
658+
assert mpl.colors.same_color(text.get_color(), color)
659+
660+
661+
def test_legend_labelcolor_rcparam_linecolor():
662+
# test the rcParams legend.labelcolor for a linecolor
663+
fig, ax = plt.subplots()
664+
ax.plot(np.arange(10), np.arange(10)*1, label='#1', color='r')
665+
ax.plot(np.arange(10), np.arange(10)*2, label='#2', color='g')
666+
ax.plot(np.arange(10), np.arange(10)*3, label='#3', color='b')
667+
668+
mpl.rcParams['legend.labelcolor'] = 'linecolor'
669+
leg = ax.legend()
670+
for text, color in zip(leg.get_texts(), ['r', 'g', 'b']):
671+
assert mpl.colors.same_color(text.get_color(), color)
672+
673+
674+
def test_legend_labelcolor_rcparam_markeredgecolor():
675+
# test the labelcolor for labelcolor='markeredgecolor'
676+
fig, ax = plt.subplots()
677+
ax.plot(np.arange(10), np.arange(10)*1, label='#1', markeredgecolor='r')
678+
ax.plot(np.arange(10), np.arange(10)*2, label='#2', markeredgecolor='g')
679+
ax.plot(np.arange(10), np.arange(10)*3, label='#3', markeredgecolor='b')
680+
681+
mpl.rcParams['legend.labelcolor'] = 'markeredgecolor'
682+
leg = ax.legend()
683+
for text, color in zip(leg.get_texts(), ['r', 'g', 'b']):
684+
assert mpl.colors.same_color(text.get_color(), color)
685+
686+
687+
def test_legend_labelcolor_rcparam_markeredgecolor_short():
688+
# test the labelcolor for labelcolor='markeredgecolor'
689+
fig, ax = plt.subplots()
690+
ax.plot(np.arange(10), np.arange(10)*1, label='#1', markeredgecolor='r')
691+
ax.plot(np.arange(10), np.arange(10)*2, label='#2', markeredgecolor='g')
692+
ax.plot(np.arange(10), np.arange(10)*3, label='#3', markeredgecolor='b')
693+
694+
mpl.rcParams['legend.labelcolor'] = 'mec'
695+
leg = ax.legend()
696+
for text, color in zip(leg.get_texts(), ['r', 'g', 'b']):
697+
assert mpl.colors.same_color(text.get_color(), color)
698+
699+
700+
def test_legend_labelcolor_rcparam_markerfacecolor():
701+
# test the labelcolor for labelcolor='markeredgecolor'
702+
fig, ax = plt.subplots()
703+
ax.plot(np.arange(10), np.arange(10)*1, label='#1', markerfacecolor='r')
704+
ax.plot(np.arange(10), np.arange(10)*2, label='#2', markerfacecolor='g')
705+
ax.plot(np.arange(10), np.arange(10)*3, label='#3', markerfacecolor='b')
706+
707+
mpl.rcParams['legend.labelcolor'] = 'markerfacecolor'
708+
leg = ax.legend()
709+
for text, color in zip(leg.get_texts(), ['r', 'g', 'b']):
710+
assert mpl.colors.same_color(text.get_color(), color)
711+
712+
713+
def test_legend_labelcolor_rcparam_markerfacecolor_short():
714+
# test the labelcolor for labelcolor='markeredgecolor'
715+
fig, ax = plt.subplots()
716+
ax.plot(np.arange(10), np.arange(10)*1, label='#1', markerfacecolor='r')
717+
ax.plot(np.arange(10), np.arange(10)*2, label='#2', markerfacecolor='g')
718+
ax.plot(np.arange(10), np.arange(10)*3, label='#3', markerfacecolor='b')
719+
720+
mpl.rcParams['legend.labelcolor'] = 'mfc'
721+
leg = ax.legend()
722+
for text, color in zip(leg.get_texts(), ['r', 'g', 'b']):
723+
assert mpl.colors.same_color(text.get_color(), color)
724+
725+
647726
def test_get_set_draggable():
648727
legend = plt.legend()
649728
assert not legend.get_draggable()

lib/matplotlib/tests/test_rcparams.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
validate_bool,
1818
validate_color,
1919
validate_colorlist,
20+
_validate_color_or_linecolor,
2021
validate_cycler,
2122
validate_float,
2223
validate_fontweight,
@@ -329,6 +330,17 @@ def generate_validator_testcases(valid):
329330
('(0, 1, "0.5")', ValueError), # last one not a float
330331
),
331332
},
333+
{'validator': _validate_color_or_linecolor,
334+
'success': (('linecolor', 'linecolor'),
335+
('markerfacecolor', 'markerfacecolor'),
336+
('mfc', 'markerfacecolor'),
337+
('markeredgecolor', 'markeredgecolor'),
338+
('mec', 'markeredgecolor')
339+
),
340+
'fail': (('line', ValueError),
341+
('marker', ValueError)
342+
)
343+
},
332344
{'validator': validate_hist_bins,
333345
'success': (('auto', 'auto'),
334346
('fd', 'fd'),

0 commit comments

Comments
 (0)