20

以下程序执行良好,但只显示一个图例。如何显示所有四个图例?请看附图。

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

在此处输入图像描述

4

2 回答 2

31
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直到它用完标签(因此你的第一条曲线被标记为第四条曲线)。如果您kwarg labelplot命令中包含 ,当您legend不带任何参数调用时,它将遍历艺术家*并为带有标签的艺术家生成图例条目。

[*] 它会挑选哪些艺术家有一些例外

于 2013-02-12T05:50:35.193 回答
10

AFAIK,您需要使用所有参数调用 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(),但恐怕我不记得为什么了。

于 2013-02-12T05:54:27.223 回答