for循环中matlabplot中的多个图例

时间:2013-02-12 05:37:25

标签: python matplotlib 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]


for i in [1,2,3,4]:
    plt.plot(xs,dct['list_%s' %i])
    plt.legend(['%s data' %i])

plt.show()

enter image description here

2 个答案:

答案 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(),但我恐怕我不记得为什么。