2016-03-31 5 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]) 

Это ошибка, я получаю: «список» объект не имеет атрибута «get_label»

+0

Ваш вопрос WOU ld были улучшены, разместив * full traceback *. Это определило бы линию, которая вызвала проблему, и помогла людям ответить на вопрос. Это также помогло бы вам решить свою проблему. Если бы ваш вопрос был написан более тщательно, он, возможно, получил бы возвышение. –

ответ

13

Поскольку 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]) 

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]]) 
Смежные вопросы