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

Matplotlib savefig保存多图时部分图片空白问题求助

解决Matplotlib保存部分绘图空白的问题

我之前也碰到过类似的情况,大概率是这几个原因导致的,给你几个排查和解决的方向:

1. 没有关闭已保存的Figure对象

Matplotlib的Figure如果一直驻留在内存中,后续的绘图可能会出现资源冲突或者内容覆盖的问题。你可以在每次保存后关闭对应的Figure,释放资源:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt  # 记得导入plt模块

for i in range(len(plots)):
    p1 = plots[i]
    p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100)
    plt.close(p1)  # 保存后关闭当前Figure

2. 检查plots列表中的Figure是否真的包含内容

有可能某个plots[i]虽然是Figure对象,但实际上没有添加任何轴(Axes)或者绘图元素(比如折线、柱状图等)。你可以在保存前先做个简单检查:

for i in range(len(plots)):
    p1 = plots[i]
    # 检查Figure是否包含Axes对象
    if len(p1.axes) == 0:
        print(f"提示:第{i}个绘图没有轴对象!")
    # 进一步检查Axes是否有实际绘图数据
    for ax in p1.axes:
        if len(ax.lines) == 0 and len(ax.patches) == 0:
            print(f"提示:第{i}个绘图的轴中没有数据!")
    p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100)

3. 避免重复使用同一个Figure对象

如果你的plots列表里存在重复的Figure引用(比如同一个对象被多次添加进列表),第一次保存后,后续保存可能会因为Figure已被修改或清空而出现空白。你可以先给列表去重:

# 检查并去重plots中的Figure对象
unique_plots = []
seen_obj_ids = set()
for p in plots:
    obj_id = id(p)
    if obj_id not in seen_obj_ids:
        seen_obj_ids.add(obj_id)
        unique_plots.append(p)
    else:
        print(f"发现重复的Figure对象:{p}")

# 使用去重后的列表保存绘图
for i in range(len(unique_plots)):
    p1 = unique_plots[i]
    p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100)
    plt.close(p1)

4. 强制渲染绘图内容

有时候绘图元素没有被正确渲染,你可以在保存前调用canvas.draw()强制完成渲染:

for i in range(len(plots)):
    p1 = plots[i]
    p1.canvas.draw()  # 强制渲染绘图内容
    p1.savefig("/sample/plots{}.png".format(i), bbox_inches='tight', pad_inches=0, dpi=100)
    plt.close(p1)

内容的提问来源于stack exchange,提问作者Ravi Kiran G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:48