2016-03-31 40 views
6

Tại sao tôi gặp lỗi ở đây liên quan đến nhãn plt.plot?Lỗi thuộc tính chú giải 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]) 

Đây là lỗi mà tôi nhận được: 'danh sách' đối tượng không có thuộc tính 'get_label'

+0

bạn hỏi wou ld đã được cải tiến bằng cách đăng * toàn bộ dấu trang *. Điều đó sẽ xác định chính xác dòng gây ra vấn đề và giúp mọi người trả lời câu hỏi. Nó cũng sẽ giúp bạn giải quyết vấn đề của riêng bạn. Nếu câu hỏi của bạn đã được viết cẩn thận hơn, nó có thể đã nhận được một upvote. –

Trả lời

13

plt.plot có thể vẽ nhiều hơn một dòng cùng một lúc, nó sẽ trả về một danh sách các line2D đối tượng , ngay cả khi bạn chỉ vẽ một dòng (ví dụ trong trường hợp của bạn, một danh sách độ dài 1). Khi bạn lấy tay cầm của nó cho chú giải, bạn chỉ muốn sử dụng mục đầu tiên của danh sách này (đối tượng line2D thực tế).

Có (ít nhất) hai cách bạn có thể giải quyết này:

1) thêm một dấu phẩy sau normplt khi bạn gọi plt.plot, chỉ lưu trữ các mục đầu tiên trong danh sách trong 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) Sử dụng chỉ mục đầu tiên trong danh sách khi bạn gọi 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]]) 
Các vấn đề liên quan