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
相关产品推荐
相关产品推荐

