Python图例属性错误

i s*_*eal 14 matplotlib python-3.x

为什么我在这里遇到与plt.plot标签有关的错误?

fig = plt.figure()
ax = plt.gca()
barplt = plt.bar(bins,frq,align='center',label='Dgr')
normplt = plt.plot(bins_n,frq_n,'--r', label='Norm');
ax.set_xlim([min(bins)-1, max(bins)+1])
ax.set_ylim([0, max(frq)])
plt.xlabel('Dgr')
plt.ylabel('Frequency')
plt.show()
plt.legend(handles=[barplt,normplt])
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误: 'list'对象没有属性'get_label'

tmd*_*son 25

因为plt.plot可以一次绘制多行,所以它返回一个line2D对象列表,即使您只绘制一行(即在您的情况下,长度为1的列表).当您抓取图例的句柄时,您只想使用此列表的第一项(实际line2D对象).

有(至少)两种方法可以解决这个问题:

1)normplt在你打电话后添加一个逗号plt.plot,只存储列表中的第一个项目normplt

barplt = plt.bar(bins,frq,width,align='center',label='Dgr')
normplt, = plt.plot(bins_n,frq_n,'--r', label='Norm')   # note the comma after normplt

print normplt
# Line2D(Norm)    <-- This is the line2D object, not a list, so we can use it in legend
...
plt.legend(handles=[barplt,normplt])
Run Code Online (Sandbox Code Playgroud)

2)当你调用plt.legend(normplt[0])时,只使用列表中的第一项:

barplt = plt.bar(bins,frq,width,align='center',label='Dgr')
normplt = plt.plot(bins_n,frq_n,'--r', label='Norm')

print normplt
# [<matplotlib.lines.Line2D object at 0x112076710>]  
# Note, this is a list containing the Line2D object. We just want the object, 
# so we can use normplt[0] in legend
...
plt.legend(handles=[barplt,normplt[0]])
Run Code Online (Sandbox Code Playgroud)


Kir*_*tov 6

在新的matplotlib 版本( 3.1.0 ) 中添加了 为散点图创建图例的新方法

现在,PathCollection 提供了一个方法 legend_elements() 以自动方式获取散点图的句柄和标签。这使得为​​散点图创建图例变得像

因此,您还可以使用自动图例创建

N = 45
x, y = np.random.rand(2, N)
c = np.random.randint(1, 5, size=N)
s = np.random.randint(10, 220, size=N)

fig, ax = plt.subplots()

scatter = ax.scatter(x, y, c=c, s=s)

# produce a legend with the unique colors from the scatter
legend1 = ax.legend(*scatter.legend_elements(), loc="lower left", title="Classes")
ax.add_artist(legend1)

# produce a legend with a cross section of sizes from the scatter
handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6)
legend2 = ax.legend(handles, labels, loc="upper right", title="Sizes")

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 感谢您让我们知道它刚刚添加 - 我来到这里想知道为什么我在旧版本中得到“PathCollection”对象没有属性“legend_elements”。 (3认同)