You need to enable JavaScript to run this app. Matplotlib共享Y轴双子图绘图未显示图例的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib共享Y轴双子图绘图未显示图例的问题咨询

双轴训练曲线图例缺失问题的解决

问题根源

代码中每个子图通过twiny()创建了独立的共享Y轴副坐标轴(对应验证集曲线的绘制),但仅对底层主坐标轴调用了legend()方法。Matplotlib的legend()默认只会收集当前被调用方法的坐标轴上带label参数的绘图元素,副坐标轴上标记为Validation的曲线完全不在收集范围内,因此最终图例只会显示主坐标轴上的Train项,无法展示完整的两类曲线标识。

修复操作

  • 对每个子图,分别提取主坐标轴、副坐标轴的所有绘图句柄与对应标签
  • 将两组句柄、标签拼接后,传入主坐标轴的legend()方法,实现全元素的图例渲染

修正后的核心代码段

第一幅Dice分数子图的图例修正:

# 原ax[0].legend(...) 代码替换为以下逻辑
# 收集主坐标轴元素
main_handles, main_labels = ax[0].get_legend_handles_labels()
# 收集twiny副坐标轴元素
twiny_handles, twiny_labels = ax1.get_legend_handles_labels()
# 合并元素生成统一图例
ax[0].legend(main_handles + twiny_handles, main_labels + twiny_labels, 
             loc='lower right', fontsize=20)

第二幅损失曲线子图的图例修正:

# 原ax[1].legend(...) 代码替换为以下逻辑
# 收集主坐标轴元素
main_handles, main_labels = ax[1].get_legend_handles_labels()
# 收集twiny副坐标轴元素
twiny_handles, twiny_labels = ax2.get_legend_handles_labels()
# 合并元素生成统一图例
ax[1].legend(main_handles + twiny_handles, main_labels + twiny_labels, 
             loc='upper right', fontsize=20)

补充说明

  • 代码中绘制的平滑曲线没有传入label参数,不会被自动纳入图例,这部分逻辑不需要额外调整
  • 因为使用了共享Y轴的双轴布局,副坐标轴的内容不会自动继承主坐标轴的图例渲染规则,必须手动合并元素才能完整显示所有曲线的图例项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 11:06:09