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

