循环中的多个图例
下面这个程序运行得很好,但只显示了一个图例。我该怎么做才能让四个图例都显示出来呢?请看附上的图片。
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()
2 个回答
10
据我所知,你需要一次性调用legend,并把所有参数都传进去。
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))
注意,我在这里把标签作为绘图函数的一个参数包含进去了,这样我们后面就可以调用get_label()了。
labels = [l.get_label() for l in lines]
plt.legend(lines, labels)
plt.show()
如果你有单独的坐标轴(比如twinx),这个方法也能用,而且所有的图例信息都会集中在一个图例里。对了,我好像记得%这种写法比较老旧,应该更倾向于使用str.format(),但我不太记得具体原因了。
34
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
中遍历那些代表要绘制数据的对象(我们称这些对象为艺术家),直到没有标签为止(这就是为什么你的第一条曲线被标记为第四条的原因)。如果你在 plot
命令中包含了 kwarg
label
,那么当你不带任何参数调用 legend
时,它会遍历这些艺术家,并为那些有标签的艺术家生成图例条目。
[*] 这里面有一些例外,关于哪些艺术家会被选中