以下程序执行正常,但只显示一个图例。如何显示所有四个图例?请看附上的图片。
import matplotlib.pyplot as plt
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]}
xs = [0,1,2,3,4]
for i in [1,2,3,4]:
plt.plot(xs,dct['list_%s' %i])
plt.legend(['%s data' %i])
plt.show()
答案 0 :(得分:15)
import matplotlib.pyplot as plt
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]}
xs = [0,1,2,3,4]
for i in [1,2,3,4]:
plt.plot(xs,dct['list_%s' %i], label='%s data' % i)
plt.legend()
plt.show()
你正在遇到legend
的工作方式,每次调用它都会破坏当前的图例并用新的图例替换它。如果你只给legend
一个字符串列表,它会在axes
中遍历艺术家(代表要绘制数据的对象),直到标签用完为止(这就是为什么你的第一条曲线被贴上标签的原因)作为第4个)。如果您在kwarg
命令中包含label
plot
,则在没有任何参数的情况下调用legend
时,它将遍历艺术家*并为艺术家生成图例条目带标签。
[*]有一些例外,艺术家会选择
答案 1 :(得分:7)
AFAIK,您需要使用所有参数调用一次图例。
import matplotlib.pyplot as plt
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],
'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]}
xs = [0,1,2,3,4]
lines = []
for i in range(1,5):
lines += plt.plot(xs,dct['list_%s' %i], label="{} data".format(i))
请注意,我在此处将标签作为plot函数的参数之一包含在内,以便稍后我们可以调用get_label()。
labels = [l.get_label() for l in lines]
plt.legend(lines, labels)
plt.show()
如果您有单独的轴(例如twinx),并且所有图例信息都将在一个图例上显示,则此功能也可以使用。 顺便说一句,我似乎记得%符号是旧的,一个应该更喜欢str.format(),但我恐怕我不记得为什么。