循环中的多个图例

24 投票
2 回答
70237 浏览
提问于 2025-04-17 15:35

下面这个程序运行得很好,但只显示了一个图例。我该怎么做才能让四个图例都显示出来呢?请看附上的图片。

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 时,它会遍历这些艺术家,并为那些有标签的艺术家生成图例条目。

[*] 这里面有一些例外,关于哪些艺术家会被选中

撰写回答