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

Matplotlib调用savefig保存r.draw()生成的DSR图为空白问题

保存tellurium生成的DSR图表输出空白问题修复

问题现象

通过tellurium的r.draw()方法生成DSR图表后,使用matplotlib保存输出的png、jpg格式图片均为空白,先后替换matplotlib.pylab、matplotlib.pyplot接口保存问题仍存在。

初始错误实现

import tellurium as te
import pygraphviz as pgv
import numpy as np
#import matplotlib.pylab as r

import matplotlib.pylab as r
# 加载模型并生成模拟点
r = te.loada ('S1 -> S2; k1*S1; k1 = 0.1; S1 = 10')
fig = r.draw()

import matplotlib.pylab as fig
fig.gcf()
fig.savefig('DSRgrafic.png', dpi=100)

fig.show()

替换pyplot后仍无效的实现

import tellurium as te
import pygraphviz as pgv
import numpy as np

# 加载模型并生成模拟点
r = te.loada ('S1 -> S2; k1*S1; k1 = 0.1; S1 = 10')
fig = r.draw()

import matplotlib.pyplot as fig
fig.gcf()
fig.savefig('DSRgrafic.png', dpi=100)

fig.show()

错误原因

  • 变量名覆盖:最初将导入的matplotlib.pylab别名为r,后续又将te.loada()加载的模型对象赋值给同名变量r,直接覆盖了matplotlib模块的引用,逻辑完全混乱。
  • 画布句柄获取错误:r.draw()方法本身会直接返回渲染完成的DSR图表对应的matplotlib Figure对象,代码没有直接操作这个返回的有效句柄,反而在绘图逻辑后重新导入matplotlib模块,调用gcf()获取当前活动画布——此时拿到的是新生成的空白画布,保存出来的文件自然没有内容。
  • 导入逻辑不规范:将模块导入语句写在业务执行逻辑中间,大幅提升了变量覆盖、引用错误的出现概率。

修复后正确代码

# 所有依赖统一在代码头部导入,避免中途导入引发的引用问题
import tellurium as te
import matplotlib.pyplot as plt

# 加载反应模型
model = te.loada('S1 -> S2; k1*S1; k1 = 0.1; S1 = 10')
# 生成DSR图,直接接收返回的Figure对象
dsr_figure = model.draw()
# 对有效Figure对象执行保存
dsr_figure.savefig('DSRgrafic.png', dpi=100)
# 展示图表
plt.show()

补充注意点

  • 如果执行上述代码仍偶发空白,可以在savefig前加一行plt.draw(),强制matplotlib完成所有画布元素渲染后再写入文件。
  • 给导入模块起别名时,不要和后续业务逻辑使用的变量重名,避免出现覆盖问题。

内容的提问来源于stack exchange,提问作者Lorand Gabriel Parajdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:36:24