Movatterモバイル変換


[0]ホーム

URL:


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

Sign up
Appearance settings

Commitf263f7d

Browse files
committed
Bugfix for loc legend validation
Co-authored-by: John Paul Jepko <jpjepko@users.noreply.github.com>
1 parent70e0ba8 commitf263f7d

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

‎lib/matplotlib/legend.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
importitertools
2525
importlogging
26+
importnumbers
2627
importtime
2728

2829
importnumpyasnp
@@ -517,6 +518,9 @@ def val_or_rc(val, rc_name):
517518
ifnotself.isaxesandlocin [0,'best']:
518519
loc='upper right'
519520

521+
type_err_message= ("loc must be string, coordinate tuple, or"
522+
f" an integer 0-10, not{loc!r}")
523+
520524
# handle outside legends:
521525
self._outside_loc=None
522526
ifisinstance(loc,str):
@@ -535,6 +539,19 @@ def val_or_rc(val, rc_name):
535539
loc=locs[0]+' '+locs[1]
536540
# check that loc is in acceptable strings
537541
loc=_api.check_getitem(self.codes,loc=loc)
542+
elifnp.iterable(loc):
543+
# coerce iterable into tuple
544+
loc=tuple(loc)
545+
# validate the tuple represents Real coordinates
546+
iflen(loc)!=2ornotall(isinstance(e,numbers.Real)foreinloc):
547+
raiseValueError(type_err_message)
548+
elifisinstance(loc,int):
549+
# validate the integer represents a string numeric value
550+
ifloc<0orloc>10:
551+
raiseValueError(type_err_message)
552+
else:
553+
# all other cases are invalid values of loc
554+
raiseValueError(type_err_message)
538555

539556
ifself.isaxesandself._outside_loc:
540557
raiseValueError(

‎lib/matplotlib/tests/test_legend.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,3 +1219,79 @@ def test_ncol_ncols(fig_test, fig_ref):
12191219
ncols=3
12201220
fig_test.legend(strings,ncol=ncols)
12211221
fig_ref.legend(strings,ncols=ncols)
1222+
1223+
1224+
deftest_loc_invalid_tuple_exception():
1225+
# check that exception is raised if the loc arg
1226+
# of legend is not a 2-tuple of numbers
1227+
fig,ax=plt.subplots()
1228+
withpytest.raises(ValueError,match=('loc must be string, coordinate '
1229+
'tuple, or an integer 0-10, not\\(1.1,\\)')):
1230+
ax.legend(loc=(1.1, ))
1231+
1232+
withpytest.raises(ValueError,match=('loc must be string, coordinate '
1233+
'tuple, or an integer 0-10, not\\(0.481, 0.4227, 0.4523\\)')):
1234+
ax.legend(loc=(0.481,0.4227,0.4523))
1235+
1236+
withpytest.raises(ValueError,match=('loc must be string, coordinate '
1237+
'tuple, or an integer 0-10, not\\(0.481,\'go blue\'\\)')):
1238+
ax.legend(loc=(0.481,"go blue"))
1239+
1240+
1241+
deftest_loc_valid_tuple():
1242+
fig,ax=plt.subplots()
1243+
ax.legend(loc=(0.481,0.442))
1244+
ax.legend(loc=(1,2))
1245+
1246+
1247+
deftest_loc_valid_list():
1248+
fig,ax=plt.subplots()
1249+
ax.legend(loc=[0.481,0.442])
1250+
ax.legend(loc=[1,2])
1251+
1252+
1253+
deftest_loc_invalid_list_exception():
1254+
fig,ax=plt.subplots()
1255+
withpytest.raises(ValueError,match=('loc must be string, coordinate '
1256+
'tuple, or an integer 0-10, not\\[1.1, 2.2, 3.3\\]')):
1257+
ax.legend(loc=[1.1,2.2,3.3])
1258+
1259+
1260+
deftest_loc_invalid_type():
1261+
fig,ax=plt.subplots()
1262+
withpytest.raises(ValueError,match=("loc must be string, coordinate "
1263+
"tuple, or an integer 0-10, not {'not': True}")):
1264+
ax.legend(loc={'not':True})
1265+
1266+
1267+
deftest_loc_validation_numeric_value():
1268+
fig,ax=plt.subplots()
1269+
ax.legend(loc=0)
1270+
ax.legend(loc=1)
1271+
ax.legend(loc=5)
1272+
ax.legend(loc=10)
1273+
withpytest.raises(ValueError,match=('loc must be string, coordinate '
1274+
'tuple, or an integer 0-10, not 11')):
1275+
ax.legend(loc=11)
1276+
1277+
withpytest.raises(ValueError,match=('loc must be string, coordinate '
1278+
'tuple, or an integer 0-10, not -1')):
1279+
ax.legend(loc=-1)
1280+
1281+
1282+
deftest_loc_validation_string_value():
1283+
fig,ax=plt.subplots()
1284+
ax.legend(loc='best')
1285+
ax.legend(loc='upper right')
1286+
ax.legend(loc='best')
1287+
ax.legend(loc='upper right')
1288+
ax.legend(loc='upper left')
1289+
ax.legend(loc='lower left')
1290+
ax.legend(loc='lower right')
1291+
ax.legend(loc='right')
1292+
ax.legend(loc='center left')
1293+
ax.legend(loc='center right')
1294+
ax.legend(loc='lower center')
1295+
ax.legend(loc='upper center')
1296+
withpytest.raises(ValueError,match="'wrong' is not a valid value for"):
1297+
ax.legend(loc='wrong')

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp