You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Matplotlib保存序列图并正确清理画布避免异常?

解决Matplotlib批量保存图像时画布清理的问题

问题场景与代码

需要批量保存Matplotlib图像,原代码如下:

fig = plt.figure(figsize=(10.,5.))
spec = fig.add_gridspec(ncols=1, nrows=2)
grid = [fig.add_subplot(spec[0, 0]),fig.add_subplot(spec[1, 0])]
for i in 10:
    mu1 = <SOME IMAGE>
    mu2 = <SOME IMAGE>
    # First subplot
    ax = grid[0]
    ax.imshow(mu,cmap='copper')
    # Second subplot
    ax = grid[1]
    ax.imshow(mu2,cmap='copper')    
    ax.text(0.5, 1.15,f"Title for this fig {i}",fontsize=18, transform=ax.transAxes,ha='center')
    # save the figure
    f = open(f"frames/snap_t{i:04d}.png",'wb')
    plt.savefig(f)
    f.close()
    plt.close()

遇到的问题:不清理画布会导致图像重叠、标题混乱且内存占用过高;但调用plt.close()后,除第一张图外其余均为空图。

问题原因

你把画布(fig)和子图(grid)的创建放在了循环外面,第一次循环执行plt.close()后,这个画布对象已经被销毁,后续循环里再调用grid里的子图对象绘图,实际上是在已经关闭的画布上操作,自然无法生成有效图像。

解决方法

把画布、网格布局、子图的创建逻辑移到循环内部,每次循环都新建一套绘图对象,保存完成后再关闭画布,这样既避免了图像重叠,也不会出现空图问题。修正后的代码如下:

import matplotlib.pyplot as plt

# 替换为你的实际循环范围,比如range(10)
for i in range(10):
    # 每次循环新建画布和子图
    fig = plt.figure(figsize=(10.,5.))
    spec = fig.add_gridspec(ncols=1, nrows=2)
    grid = [fig.add_subplot(spec[0, 0]), fig.add_subplot(spec[1, 0])]
    
    mu1 = <SOME IMAGE>  # 替换为你的图像数据
    mu2 = <SOME IMAGE>
    
    # 绘制第一个子图
    ax = grid[0]
    ax.imshow(mu1, cmap='copper')
    # 绘制第二个子图
    ax = grid[1]
    ax.imshow(mu2, cmap='copper')    
    ax.text(0.5, 1.15, f"Title for this fig {i}", fontsize=18, transform=ax.transAxes, ha='center')
    
    # 直接传入文件名保存,无需手动打开文件句柄
    plt.savefig(f"frames/snap_t{i:04d}.png")
    # 关闭当前画布,释放内存
    plt.close(fig)

额外优化提示

  • 不需要手动打开文件句柄,plt.savefig()直接接收文件名参数即可完成保存,代码更简洁。
  • 关闭画布时指定具体的fig对象,避免误关其他可能存在的画布(如果有多个的话)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:23:09