使用matplotlib在for循环中保存多图时数据重叠,如何生成每轮独立图表?
循环绘图数据叠加问题的解决方法
问题根源
多轮迭代绘图时出现内容层层叠加的问题,核心原因是matplotlib.pyplot采用全局状态管理机制,默认会复用已创建的活动画布,每次执行plt.plot()时,新的曲线会直接追加到上一轮遗留的画布上,不会自动清空旧的绘图内容,最终会出现最后保存的图像叠加了所有历史迭代曲线的效果。
修复方案
可根据代码场景选择以下两种方式实现每轮迭代的独立绘图:
- 方案1:保存完成后显式释放当前画布状态
在现有函数的plt.savefig()操作后追加画布关闭语句,彻底清除上一轮的绘图上下文,避免状态残留。
相比仅用plt.cla()清空坐标轴的操作,plt.close()会直接销毁整个画布实例,不会因为多轮循环累积造成内存占用持续升高,更适合长周期的迭代绘图场景。
修复后的函数示例:def plotStats(aggr_ep_rewards, i, my_file): '''Plot rewards curves''' DIR = '../Simulations/2_Q_Learning_exploration_explotation/A/' plt.plot(aggr_ep_rewards['ep'], aggr_ep_rewards['avg']) plt.legend(loc=4) plt.title(f"RL Q_Learning TEST:{i}") plt.xlabel('Episodes') plt.ylabel('Rewards') save_path = os.path.join(DIR, my_file) plt.savefig(save_path) # 新增:保存完成后关闭当前画布,清除残留状态 plt.close() - 方案2:每次绘图前新建独立画布
在函数的绘图操作最开头,调用plt.figure()创建全新的独立画布实例,从根源上避免全局画布复用带来的叠加问题。这种写法的代码可读性更强,也更适合包含多组对比图的复杂绘图场景。
注意事项
当前代码中的
plt.plot()语句没有传入label参数,运行时plt.legend()可能会因为找不到有效图例对象抛出警告,可以在plot语句中补充对应标签,例如plt.plot(..., label="average rewards"),才能让图例正常显示。
内容的提问来源于stack exchange,提问作者krm76
相关产品推荐
相关产品推荐

