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

如何将matplotlib生成的图表存入变量而非保存为文件?

将matplotlib图表对象跨脚本传递并保存的实现方案

matplotlib.figure.Figure本身就是普通Python实例,可直接作为变量传递,不需要对框架做额外改造,按使用场景分两种情况处理即可:

场景1:两个脚本在同一Python进程内调用(推荐)

直接在绘图脚本中返回Figure实例,在保存脚本中接收后调用savefig即可,不需要中间序列化。

  • 绘图脚本示例(无需配置任何保存路径):
import matplotlib.pyplot as plt
import numpy as np

# 绘图逻辑封装为可返回fig对象的函数
def build_custom_plot():
    # 显式接收subplots返回的fig对象,不要依赖plt.gcf()全局获取
    fig, ax = plt.subplots(figsize=(10, 6))
    # 替换为自身业务绘图逻辑
    x = np.linspace(0, 10, 200)
    ax.plot(x, np.sin(x), label='sin wave')
    ax.scatter([2,4,6], [0.3,-0.2,0.1], c='red')
    ax.legend()
    # 不要在此处调用savefig,也不要提前调用plt.show()阻塞流程
    return fig
  • 独立保存脚本示例(用预设输出参数完成保存):
import os
import matplotlib.pyplot as plt
# 导入绘图逻辑
from plot_script import build_custom_plot

# 自定义输出配置,无需在绘图脚本中维护
OUTPUT_CONFIG = {
    "dir": "./project/result/figures",
    "dpi": 300,
    "formats": ["png", "svg", "pdf"],
    "bbox_inches": "tight"
}

if __name__ == "__main__":
    # 接收传递过来的fig对象
    target_fig = build_custom_plot()
    # 按配置保存
    os.makedirs(OUTPUT_CONFIG["dir"], exist_ok=True)
    for fmt in OUTPUT_CONFIG["formats"]:
        save_path = os.path.join(OUTPUT_CONFIG["dir"], f"analysis_result.{fmt}")
        target_fig.savefig(save_path, dpi=OUTPUT_CONFIG["dpi"], bbox_inches=OUTPUT_CONFIG["bbox_inches"])
    # 保存完成后释放内存
    plt.close(target_fig)
    # 如需预览图片,在保存完成后再调用plt.show()
    # plt.show()

场景2:两个脚本独立启动、跨进程传递

如果两个脚本无法通过import直接调用,可以用pickle序列化Figure对象做中转:

  • 绘图脚本执行完绘图后,序列化对象到临时文件:
import pickle
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,2,3,4], [1,4,9,16])
# 序列化写入临时缓存文件
with open("./temp_fig_cache.pkl", "wb") as f:
    pickle.dump(fig, f)
plt.close(fig)
  • 保存脚本读取临时文件反序列化后,按配置保存:
import pickle
import os
import matplotlib.pyplot as plt

OUTPUT_DIR = "./your/custom/save/path"

# 反序列化拿到fig对象
with open("./temp_fig_cache.pkl", "rb") as f:
    recovered_fig = pickle.load(f)
# 执行保存
os.makedirs(OUTPUT_DIR, exist_ok=True)
recovered_fig.savefig(os.path.join(OUTPUT_DIR, "final_plot.png"), dpi=300)
# 清理临时缓存和内存
os.remove("./temp_fig_cache.pkl")
plt.close(recovered_fig)

注意事项

  • 跨进程序列化传递时,两个运行环境的matplotlib大版本必须保持一致,否则可能出现反序列化失败、图表元素丢失的问题
  • 批量生成图表时,每次保存完成后必须调用plt.close(fig)释放内存,否则会出现内存泄漏
  • 多图并行生成场景下,不要用plt.gcf()获取当前图表对象传递,必须显式接收plt.subplots()返回的fig实例,避免拿错对象
  • 不要在绘图逻辑中提前调用plt.show(),否则会阻塞代码执行,导致后续保存逻辑无法触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:12:18