如何将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
相关产品推荐
相关产品推荐

