Matplotlib: No handles with labels found to put in legend. 如何解决?
plt.legend()提示 No handles with labels found to put in legend,不能正常显示 legend,不知哪里出问题,使用环境为 Spyder。
Matplotlib: No handles with labels found to put in legend. 如何解决?
这个报错是因为你试图创建图例(legend),但图表中的元素(比如线条、散点)没有设置 label 属性。Matplotlib 的 legend() 函数是靠这些 label 来生成图例条目的。
核心原因:你调用 plt.legend() 时,当前图形(figure)中所有带有 label 的图形元素(artists)数量为0。
最常见和直接的解决方案:在绘制数据时(如 plt.plot(), plt.scatter()),通过 label 参数明确指定每个数据系列的标签。
错误示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1) # 没有设置 label
plt.plot(x, y2) # 没有设置 label
plt.legend() # 这里会报错:No handles with labels found to put in legend.
plt.show()
正确修改:
只需在 plot() 函数中添加 label 参数即可。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)') # 添加 label
plt.plot(x, y2, label='cos(x)') # 添加 label
plt.legend() # 现在可以正确创建图例
plt.show()
其他可能情况及解决:
- 使用面向对象接口时:确保在
ax.plot(),ax.scatter()等方法中也传入了label参数。fig, ax = plt.subplots() ax.plot(x, y1, label='My Label') # 这里也要加 label ax.legend() - 动态添加标签:如果图形元素已经创建,可以事后用
set_label()方法为其设置标签,然后再调用legend()。line, = plt.plot(x, y1) # 获取返回的线条对象 line.set_label('sin(x)') # 事后设置标签 plt.legend() - 手动指定图例(不推荐为常规用法):如果你就是不想在绘图时设置
label,可以手动向legend()传入句柄(handles)和标签(labels)。line1, = plt.plot(x, y1) line2, = plt.plot(x, y2) plt.legend(handles=[line1, line2], labels=['Series A', 'Series B'])
一句话总结:检查你的绘图代码,确保每个需要出现在图例里的图形对象都通过 label 参数或 set_label() 方法设置了标签。
没有代码看不出问题
这是书上的一个例子,我发现不用 plt.show()就能显示,但是 plt.legend(loc=(0.64,0.1))就显示上面的提示。
import matplotlib.pyplot as plt
d = [11,12,13,14,15,16,17]
t0 = [15.3,12.6,12.7,13.2,12.3,11.4,12.8]
t1 = [26.1,26.2,24.3,25.1,26.7,27.8,26.9]
t2 = [22.3,20.6,19.8,21.6,21.3,19.4,21.4]
plt.plot(d,t0,label=‘Tokyo’)
plt.plot(d,t1,label=‘Hawaii’)
plt.plot(d,t2,label=‘Hong Kong’)
plt.xlim(11,15)
plt.ylim(0,30)
plt.xlabel(‘Date’,size=12,fontweight=‘semibold’)
plt.ylabel(‘Temperature (°C)’,size=12,fontweight=‘semibold’)
plt.grid(True,linewidth=0.5,color=’#aaaaaa’,linestyle=’-’)
plt.title(“Daily temperature of 3 cities in the second week of December”, size=14, fontweight=‘bold’)
plt.legend(loc=(0.64,0.1))
plt.show()

