Vì 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]])
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. –