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. 如何解决?

3 回复

这个报错是因为你试图创建图例(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()

其他可能情况及解决

  1. 使用面向对象接口时:确保在 ax.plot(), ax.scatter() 等方法中也传入了 label 参数。
    fig, ax = plt.subplots()
    ax.plot(x, y1, label='My Label')  # 这里也要加 label
    ax.legend()
    
  2. 动态添加标签:如果图形元素已经创建,可以事后用 set_label() 方法为其设置标签,然后再调用 legend()
    line, = plt.plot(x, y1)  # 获取返回的线条对象
    line.set_label('sin(x)')  # 事后设置标签
    plt.legend()
    
  3. 手动指定图例(不推荐为常规用法):如果你就是不想在绘图时设置 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()

回到顶部