2016-03-31 29 views
6

ここで、plt.plotラベルに関連するエラーが表示されるのはなぜですか?Pythonの凡例属性エラー

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

これは私が取得エラーです:plt.plotは一度に複数のラインをプロットすることができますので 「リスト」オブジェクトが属性「get_label」

+0

あなたはWOUを疑問視* full tr​​aceback *をポストすることで改善されました。それは問題の原因となった行を特定し、人々がその質問に答えるのを助けました。それはあなた自身の問題を解決するのにも役立ちました。あなたの質問がより慎重に書かれていたら、アップヴォートを受け取っているかもしれません。 –

答えて

13

を持っていない、それはline2Dオブジェクトのリストを返します。あなたが1行だけプロットしたとしても(つまり、あなたの場合、長さ1のリスト)。凡例のハンドルを取得するときは、このリストの最初の項目(実際のline2Dオブジェクト)のみを使用します。

あなたはこの解決することができます(少なくとも)2つの方法があります。あなたはplt.plotを呼び出すとき

1)のみ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]) 
で、リストから最初の項目を保存するために、 normplt後にカンマを追加します

2)あなたはplt.legendnormplt[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]]) 
関連する問題