Kit*_*Kit 48 label matplotlib legend
我有以下数据集:
x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[9, 8, 7, 6, 5] ]
Run Code Online (Sandbox Code Playgroud)
现在我绘制它:
import matplotlib.pyplot as plt
plt.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
但是,我想用这个命令标记3个y数据集,这会在.legend()调用时引发错误:
lineObjects = plt.plot(x, y, label=['foo', 'bar', 'baz'])
plt.legend()
File "./plot_nmos.py", line 33, in <module>
plt.legend()
...
AttributeError: 'list' object has no attribute 'startswith'
Run Code Online (Sandbox Code Playgroud)
当我检查lineObjects:
>>> lineObjects[0].get_label()
['foo', 'bar', 'baz']
>>> lineObjects[1].get_label()
['foo', 'bar', 'baz']
>>> lineObjects[2].get_label()
['foo', 'bar', 'baz']
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方法来通过使用.plot()方法分配多个标签?
gca*_*tes 46
您可以遍历线对象列表,因此可以单独分配标签.内置python iter函数的一个例子:
lineObjects = plt.plot(x, y)
plt.legend(iter(lineObjects), ('foo', 'bar', 'baz'))`
Run Code Online (Sandbox Code Playgroud)
编辑:在更新到matplotlib 1.1.1之后,它看起来像是plt.plot(x, y),作为列表列表(由问题的作者提供),不再起作用.在将y作为y numpy.array假设(假设(numpy)[http://numpy.scipy.org/]之前已导入)之后,仍然可以考虑在y数组上没有迭代的一步绘图.
在这种情况下,使用plt.plot(x, y)(如果2D y阵列中的数据排列为列[轴1])或plt.plot(x, y.transpose())(如果2D y阵列中的数据排列为行[轴0])
编辑2:正如@pelson指出的那样(见下面的评论),这个iter函数是不必要的,一个简单的plt.legend(lineObjects, ('foo', 'bar', 'baz'))工作就完美了
pel*_*son 37
不可能直接相互映射这两个数组(至少版本为1.1.1),因此必须在y数组上循环.我的建议是同时循环标签:
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 7, 6, 5] ]
labels = ['foo', 'bar', 'baz']
for y_arr, label in zip(y, labels):
plt.plot(x, y_arr, label=label)
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
编辑:@gcalmettes指出,作为numpy数组,可以同时绘制所有行(通过转置它们).有关详细信息,请参阅@gcalmettes answer和comments.
Mil*_*ell 29
我遇到了同样的问题,现在我找到了一个最简单的解决方案!希望对你来说还不算太晚.没有迭代器,只需将结果分配给结构......
from numpy import *
from matplotlib.pyplot import *
from numpy.random import *
a = rand(4,4)
a
>>> array([[ 0.33562406, 0.96967617, 0.69730654, 0.46542408],
[ 0.85707323, 0.37398595, 0.82455736, 0.72127002],
[ 0.19530943, 0.4376796 , 0.62653007, 0.77490795],
[ 0.97362944, 0.42720348, 0.45379479, 0.75714877]])
[b,c,d,e] = plot(a)
legend([b,c,d,e], ["b","c","d","e"], loc=1)
show()
Run Code Online (Sandbox Code Playgroud)
看起来像这样:

您可以在绘制曲线时给出标签
import pylab as plt
x = [0, 1, 2, 3, 4]
y = [ [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [9, 8, 7, 6, 5] ]
labels=['foo', 'bar', 'baz']
colors=['r','g','b']
# loop over data, labels and colors
for i in range(len(y)):
plt.plot(x,y[i],'o-',color=colors[i],label=labels[i])
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

目前最好的解决方案是:
lineObjects = plt.plot(x, y) # y describes 3 lines
plt.legend(['foo', 'bar', 'baz'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59772 次 |
| 最近记录: |