2016-03-31 9 views
6

Perché viene visualizzato un errore relativo all'etichetta plt.plot?Errore attributo legenda 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]) 

Questo è l'errore che ottengo: 'lista' oggetto non ha attributo 'get_label'

+0

si domanda wou Sono stato migliorato pubblicando il * traceback completo *. Ciò avrebbe individuato la linea che ha causato il problema e ha aiutato le persone a rispondere alla domanda. Inoltre ti avrebbe aiutato a risolvere il tuo problema. Se la tua domanda fosse stata scritta con più attenzione, potrebbe aver ricevuto un upvote. –

risposta

13

Perché plt.plot può tracciare più di una riga alla volta, restituisce una lista di line2D oggetti , anche se si traccia una sola riga (cioè nel tuo caso, una lista di lunghezza 1). Quando si prende il suo handle per la legenda, si desidera utilizzare solo la prima voce di questo elenco (l'oggetto effettivo line2D).

ci sono (almeno) due modi in cui è possibile risolvere questo:

1) aggiungere una virgola dopo normplt quando si chiama plt.plot, per memorizzare solo il primo elemento dall'elenco nel 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]) 

2) Utilizzare solo il primo elemento della lista quando si chiama 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]])