You need to enable JavaScript to run this app. 使用matplotlib在for循环中保存多图时数据重叠,如何生成每轮独立图表?
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 00:54:01