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

Commit63b9b04

Browse files
authored
Merge pull request#25281 from robrighter/bugfix-for-loc-legend-validation
Bugfix for loc legend validation
2 parents5aee26d +f263f7d commit63b9b04

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
@@ -509,6 +510,9 @@ def val_or_rc(val, rc_name):
509510
ifnotself.isaxesandlocin [0,'best']:
510511
loc='upper right'
511512

513+
type_err_message= ("loc must be string, coordinate tuple, or"
514+
f" an integer 0-10, not{loc!r}")
515+
512516
# handle outside legends:
513517
self._outside_loc=None
514518
ifisinstance(loc,str):
@@ -527,6 +531,19 @@ def val_or_rc(val, rc_name):
527531
loc=locs[0]+' '+locs[1]
528532
# check that loc is in acceptable strings
529533
loc=_api.check_getitem(self.codes,loc=loc)
534+
elifnp.iterable(loc):
535+
# coerce iterable into tuple
536+
loc=tuple(loc)
537+
# validate the tuple represents Real coordinates
538+
iflen(loc)!=2ornotall(isinstance(e,numbers.Real)foreinloc):
539+
raiseValueError(type_err_message)
540+
elifisinstance(loc,int):
541+
# validate the integer represents a string numeric value
542+
ifloc<0orloc>10:
543+
raiseValueError(type_err_message)
544+
else:
545+
# all other cases are invalid values of loc
546+
raiseValueError(type_err_message)
530547

531548
ifself.isaxesandself._outside_loc:
532549
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