如何在sympy-plot-backends库中获取SVG格式的绘图字符串?
问题:使用sympy-plot-backends生成SVG字符串时避免显示绘图
我使用sympy的sympy-plot-backends库(基于matplotlib后端)直接从sympy表达式创建绘图,该库相比标准sympy绘图模块提供更多绘图微调选项。我的目标是以编程方式获取绘图的SVG格式字符串,以便后续插入网页。
我使用的代码如下:
from spb import plot, MB import io from sympy import symbols, sin, cos x = symbols("x") # create plot p1 = plot( (sin(x), "a", dict(color="k", linestyle=":")), (cos(x), "b"), backend=MB, show=False) # buffer: f = io.StringIO() # save plot in buffer as svg string: p1._fig.savefig(f, format = "svg") # return result as svg string to insert it in web page later: return f.getvalue()
运行时出现异常:
'NoneType' object has no attribute 'savefig' p1._fig.savefig(f, format = "svg")
如果先调用p1.show()再执行savefig就能正常运行,但我不想显示绘图,只需要获取SVG字符串,请问该如何解决?
解决方案
问题出在设置show=False后,matplotlib的Figure对象还未被初始化(此时p1._fig为None),而p1.show()会触发Figure的创建,但同时会弹出绘图窗口。
你可以调用p1.process_series()方法来初始化Figure并完成绘图元素的渲染,这个方法不会弹出窗口,之后就能正常调用savefig()了。修改后的代码如下:
from spb import plot, MB import io from sympy import symbols, sin, cos x = symbols("x") # create plot p1 = plot( (sin(x), "a", dict(color="k", linestyle=":")), (cos(x), "b"), backend=MB, show=False) # 初始化figure并处理绘图数据,不显示窗口 p1.process_series() # buffer: f = io.StringIO() # save plot in buffer as svg string: p1._fig.savefig(f, format = "svg") # return result as svg string to insert it in web page later: return f.getvalue()
process_series()是sympy-plot-backends内部用于处理绘图数据、创建Figure和Axes对象的核心方法,执行后p1._fig会被正确赋值为matplotlib的Figure实例,后续的保存操作就能正常执行了。
内容的提问来源于stack exchange,提问作者Anton Makarov
相关产品推荐
相关产品推荐

