2016-03-31 44 views
6

Neden plt.plot etiketi ile ilgili bir hata alıyorum? 'liste' nesne hiçbir özellik 'get_label'Python legend özniteliği hatası

+0

sen Wou soru * Tam traceback * kaydedilerek geliştirilmiştir. Bu, soruna neden olan çizgiyi saptadı ve insanların soruyu cevaplamasına yardımcı oldu. Ayrıca kendi sorununuzu çözmenize yardımcı olurdu. Sorunuz daha dikkatli yazılmış olsaydı, bir not almış olabilir. –

cevap

13

plt.plot kerede birden fazla çizgi çizmek Çünkü, bu line2D nesnelerin bir listesi döndürür vardır:

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

Bu

alıyorum hatayı olduğunu Sadece bir satır çizseniz bile (örneğinizde, uzunluk 1'in bir listesi). Lejandın tutamacını tuttuğunuzda, sadece bu listenin ilk maddesini kullanmak istiyorsunuz (gerçek line2D nesnesi).

iki şekilde (en azından) bu var çözebilirsiniz vardır: Eğer plt.plot çağırdığınızda

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]) 
listeden sadece depolamak ilk öğeye, normplt sonra bir virgül ekleyin Eğer plt.legend ( normplt[0] çağırdığınızda

2)) listesinde sadece ilk öğeyi kullanın:

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