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

Skip to content

Commit eb23290

Browse files
legend-loc-compass-notation
1 parent 41f72fb commit eb23290

File tree

3 files changed

+62
-31
lines changed

3 files changed

+62
-31
lines changed

lib/matplotlib/legend.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -112,23 +112,24 @@ def _update_bbox_to_anchor(self, loc_in_canvas):
112112
_legend_kw_doc = '''
113113
loc : int or string or pair of floats, default: :rc:`legend.loc` ('best' for \
114114
axes, 'upper right' for figures)
115-
The location of the legend. Possible codes are:
116-
117-
=============== =============
118-
Location String Location Code
119-
=============== =============
120-
'best' 0
121-
'upper right' 1
122-
'upper left' 2
123-
'lower left' 3
124-
'lower right' 4
125-
'right' 5
126-
'center left' 6
127-
'center right' 7
128-
'lower center' 8
129-
'upper center' 9
130-
'center' 10
131-
=============== =============
115+
The location of the legend.
116+
Possible (case-insensitive) strings and codes are:
117+
118+
=============== ============== =============
119+
Location String Compass String Location Code
120+
=============== ============== =============
121+
'best' 0
122+
'upper right' 'NE' 1
123+
'upper left' 'NW' 2
124+
'lower left' 'SW' 3
125+
'lower right' 'SE' 4
126+
'right' 5
127+
'center left' 'W' 6
128+
'center right' 'E' 7
129+
'lower center' 'S' 8
130+
'upper center' 'N' 9
131+
'center' 'C' 10
132+
=============== ============== =============
132133
133134
134135
Alternatively can be a 2-tuple giving ``x, y`` of the lower-left
@@ -320,7 +321,9 @@ class Legend(Artist):
320321
'upper center': 9,
321322
'center': 10,
322323
}
323-
324+
compasscodes = {'nw': 2, 'n': 9, 'ne': 1, 'w': 6, 'c': 10, 'e': 7,
325+
'sw': 3, 's': 8, 'se': 4})
326+
allcodes = {**codes, **compasscodes}
324327
zorder = 5
325328

326329
def __str__(self):
@@ -489,23 +492,23 @@ def __init__(self, parent, handles, labels,
489492
if not self.isaxes and loc in [0, 'best']:
490493
loc = 'upper right'
491494
if isinstance(loc, str):
492-
if loc not in self.codes:
495+
if loc.lower() not in self.allcodes:
493496
if self.isaxes:
494497
cbook.warn_deprecated(
495498
"3.1", message="Unrecognized location {!r}. Falling "
496499
"back on 'best'; valid locations are\n\t{}\n"
497500
"This will raise an exception %(removal)s."
498-
.format(loc, '\n\t'.join(self.codes)))
501+
.format(loc, '\n\t'.join(self.allcodes)))
499502
loc = 0
500503
else:
501504
cbook.warn_deprecated(
502505
"3.1", message="Unrecognized location {!r}. Falling "
503506
"back on 'upper right'; valid locations are\n\t{}\n'"
504507
"This will raise an exception %(removal)s."
505-
.format(loc, '\n\t'.join(self.codes)))
508+
.format(loc, '\n\t'.join(self.allcodes)))
506509
loc = 1
507510
else:
508-
loc = self.codes[loc]
511+
loc = self.allcodes[loc.lower()]
509512
if not self.isaxes and loc == 0:
510513
cbook.warn_deprecated(
511514
"3.1", message="Automatic legend placement (loc='best') not "

lib/matplotlib/rcsetup.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -585,16 +585,16 @@ def validate_markevery(s):
585585
validate_legend_loc = ValidateInStrings(
586586
'legend_loc',
587587
['best',
588-
'upper right',
589-
'upper left',
590-
'lower left',
591-
'lower right',
588+
'upper right', 'ne',
589+
'upper left', 'nw',
590+
'lower left', 'sw',
591+
'lower right', 'se',
592592
'right',
593-
'center left',
594-
'center right',
595-
'lower center',
596-
'upper center',
597-
'center'], ignorecase=True)
593+
'center left', 'w',
594+
'center right', 'e',
595+
'lower center', 's',
596+
'upper center', 'n',
597+
'center', 'c'], ignorecase=True)
598598

599599

600600
def validate_svg_fonttype(s):

lib/matplotlib/tests/test_legend.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,3 +563,31 @@ def test_alpha_handles():
563563
lh.set_alpha(1.0)
564564
assert lh.get_facecolor()[:-1] == hh[1].get_facecolor()[:-1]
565565
assert lh.get_edgecolor()[:-1] == hh[1].get_edgecolor()[:-1]
566+
567+
568+
def test_legend_loc_compass_codes():
569+
locs = ['NW', 'N', 'NE', 'W', 'C', 'E', 'SW', 'S', 'SE']
570+
codes = [2, 9, 1, 6, 10, 7, 3, 8, 4]
571+
572+
for loc in locs:
573+
plt.rcParams["legend.loc"] = loc
574+
assert plt.rcParams["legend.loc"] == loc.lower()
575+
576+
fig1, axes1 = plt.subplots(3, 3)
577+
fig2, axes2 = plt.subplots(3, 3)
578+
579+
locs = ['NW', 'N', 'NE', 'W', 'C', 'E', 'SW', 'S', 'SE']
580+
codes = [2, 9, 1, 6, 10, 7, 3, 8, 4]
581+
582+
for ax, loc in zip(axes1.flat, locs):
583+
ax.plot([1, 2], label=loc)
584+
ax.legend(loc=loc)
585+
586+
for ax, loc in zip(axes2.flat, codes):
587+
ax.plot([1, 2], label=loc)
588+
ax.legend(loc=loc)
589+
590+
for ax1, ax2 in zip(axes1.flat, axes2.flat):
591+
leg1 = ax1.get_legend()
592+
leg2 = ax2.get_legend()
593+
assert leg1._get_loc() == leg2._get_loc()

0 commit comments

Comments
 (0)