You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib图例显示异常:Seaborn折线图图例出现方框问题

解决Seaborn折线图图例显示异常(带方框)的问题

首先咱们来拆解下你遇到的问题:你分三次调用sns.lineplot绘制三条折线,之后手动用plt.legend()设置图例却出现了异常方框,这大概率是手动设置图例时和Seaborn自动生成的图例元素产生了冲突——每次调用sns.lineplot都会默认生成对应图例条目,当你再手动传入字符串列表给plt.legend()时,Matplotlib无法正确匹配这些字符串与已有的绘图元素,最终导致异常显示。

下面给你两种实用的解决方案:

方案1:用Seaborn的hue参数自动处理图例(推荐)

这是更贴合Seaborn设计逻辑的做法,无需多次调用lineplot,直接用hue区分不同激活函数,让Seaborn自动生成正确的图例:

plt.figure(dpi=150)
# 先筛选出需要的激活函数数据
filtered_df = df[df["Activation"].isin(["tanh", "silu", "swish"])]
sns.lineplot(x="Training time", y="Relative L2 error", hue="Activation", data=filtered_df)
plt.xlabel("Training time  (sec)")
plt.yscale('log', base=10)
plt.legend(title="Activation")  # 可按需设置图例标题,也可以省略
plt.show()

这种方法不仅代码更简洁,还能彻底避免手动设置图例带来的匹配问题,Seaborn会自动把每个激活函数的折线和对应图例绑定到位。

方案2:给每个lineplot指定label参数

如果你偏好分开调用三次lineplot,可以在每次调用时设置label参数,之后直接调用plt.legend()无需传参,让Matplotlib自动识别标签:

plt.figure(dpi=150)
# 给每个lineplot添加对应的label参数
sns.lineplot(x="Training time", y="Relative L2 error", data=df[df["Activation"]=="tanh"], label="tanh")
sns.lineplot(x="Training time", y="Relative L2 error", data=df[df["Activation"]=="silu"], label="silu")
sns.lineplot(x="Training time", y="Relative L2 error", data=df[df["Activation"]=="swish"], label="swish")
plt.xlabel("Training time  (sec)")
plt.yscale('log', base=10)
plt.legend()  # 直接调用,无需传字符串列表
plt.show()

这样每个lineplot会把label参数和自身绘图元素关联,plt.legend()会自动收集这些标签生成正确的图例,不会再出现异常方框。

你的工具版本都是稳定兼容的,排除了版本适配问题,主要就是图例设置的逻辑冲突导致的异常,试试上面的方法应该就能解决啦~

内容的提问来源于stack exchange,提问作者Prakhar Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:22:54