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

