Python for循环中matplotlib中的多个图例

Python for循环中matplotlib中的多个图例,python,matplotlib,legend,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]) p

以下程序执行正常,但只显示一个图例。如何显示所有四个图例?请看附件中的图片

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()

您遇到的是
legend
的工作方式,每次调用它时,它都会销毁当前图例,并用新图例替换它。如果只给
legend
一个字符串列表,它将在
轴中通过艺术家(表示要绘制的数据的对象)迭代,直到标签用完(因此第一条曲线被标记为第四条曲线)。如果在
plot
命令中包含
kwarg
标签
,则在不带任何参数的情况下调用
legend
时,它将遍历艺术家*并为带标签的艺术家生成图例条目


[*]有些例外情况下,它会选择艺术家。好吧,您需要调用一次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))
请注意,我在这里将标签作为plot函数的参数之一,以便稍后调用get_label()

如果您有单独的轴(如twinx),并且所有图例信息都将在一个图例上显示,则此操作也会起作用。
顺便说一句,我似乎记得%表示法很旧,人们应该更喜欢str.format(),但我恐怕不记得为什么了

运行此操作时是否只显示最后一个图例?我假设您确实需要一个包含所有条目的图例(即浮动框)。您不需要手动拉出标签,它会为您完成此操作。
%
符号最终将从该语言中删除,但它有一个庞大的安装基础(在标准库中),并且需要很长时间才能删除。事实上,你是对的,我只是碰巧这样做,因为我在那段代码中有多个轴。见问题。谢谢你提醒我关于%的事!谢谢你,太快了!
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))
labels = [l.get_label() for l in lines]
plt.legend(lines, labels)
plt.show()