使用matplotlib实现单x轴双y轴同图绘制训练验证精度与损失曲线
修正后可直接复用的绘图实现
核心问题定位
原代码通过叠加3个同位置无框子图的方式实现多曲线绘制,属于冗余操作:既打乱了预设的左右y轴分配逻辑,还会强制清空中间层轴的x轴刻度标签,最后调用的plt.legend()仅能收集到最上层子图的曲线标签,无法完整展示4条曲线的说明信息。
修正实现逻辑
- 减少冗余子图操作:仅初始化1个基础左轴,专门承载两类误差(训练/验证损失),不再叠加多个同位置无框子图。
- 通过
twinx()方法自动生成和左轴完全共享x轴的右侧独立y轴,专门承载两类精度值(训练/验证精度),从根本上避免x轴错位、重复刻度的问题。 - 跨轴统一收集所有曲线的句柄和标签,在同一位置渲染全量图例,避免单条曲线标签漏显示的问题。
完整可运行代码
import matplotlib.pyplot as plt # 初始化画布与左侧基础轴(绑定损失/误差类数值) fig, ax_loss = plt.subplots(figsize=(8, 5)) # 左轴绘制两条误差曲线 train_loss_curve, = ax_loss.plot(e_t_x, e_t_y, color='#d62728', linestyle='-', linewidth=1.5, label='Training Error') val_loss_curve, = ax_loss.plot(e_v_x, e_v_y, color='#2ca02c', linestyle='--', linewidth=1.5, label='Validation Error') # 左轴样式配置 ax_loss.set_xlabel('Iteration Count') ax_loss.set_ylabel('Error / Loss Value', color='#d62728') ax_loss.tick_params(axis='y', labelcolor='#d62728') # 生成共享x轴的右侧独立轴(绑定精度类数值) ax_acc = ax_loss.twinx() # 右轴绘制两条精度曲线 train_acc_curve, = ax_acc.plot(a_t_x, a_t_y, color='#1f77b4', linestyle='-', linewidth=1.5, label='Training Accuracy') val_acc_curve, = ax_acc.plot(a_v_x, a_v_y, color='#ff7f0e', linestyle='--', linewidth=1.5, label='Validation Accuracy') # 右轴样式配置 ax_acc.set_ylabel('Accuracy Value', color='#1f77b4') ax_acc.tick_params(axis='y', labelcolor='#1f77b4') # 统一收集所有曲线生成完整图例 total_curves = [train_loss_curve, val_loss_curve, train_acc_curve, val_acc_curve] total_labels = [curve.get_label() for curve in total_curves] ax_loss.legend(total_curves, total_labels, loc='best', framealpha=0.9) # 自动适配布局避免标签被画布裁切 fig.tight_layout() plt.show()
实现效果说明
最终画布中x轴统一展示迭代次数,左侧y轴的刻度范围完全匹配两类误差的数值区间,右侧y轴的刻度范围完全匹配两类精度的数值区间,四条曲线无遮挡、全量显示图例,完全匹配预设的双y轴布局要求。
内容的提问来源于stack exchange,提问作者johnnn123
相关产品推荐
相关产品推荐

