我想使用Matplotlib和pyplot生成SVG图像,并在Django框架中使用。目前,我已经生成了与页面链接的图像文件,但有没有一种方法可以直接获得SVG图像作为Unicode字符串,而无需写入文件系统?
我想使用Matplotlib和pyplot生成SVG图像,并在Django框架中使用。目前,我已经生成了与页面链接的图像文件,但有没有一种方法可以直接获得SVG图像作为Unicode字符串,而无需写入文件系统?
使用StringIO
可以避免将任何文件对象写入磁盘。
import matplotlib.pyplot as plt
import StringIO
from matplotlib import numpy as np
x = np.arange(0,np.pi*3,.1)
y = np.sin(x)
fig = plt.figure()
plt.plot(x,y)
imgdata = StringIO.StringIO()
fig.savefig(imgdata, format='svg')
imgdata.seek(0) # rewind the data
svg_dta = imgdata.buf # this is svg data
file('test.htm', 'w').write(svg_dta) # test it
这是Python3版本。
import matplotlib.pyplot as plt
import numpy as np
import io
f = io.BytesIO()
a = np.random.rand(10)
plt.bar(range(len(a)), a)
plt.savefig(f, format = "svg")
print(f.getvalue()) # svg string
f = io.BytesIO()
替换为 f = io.StringIO()
,那么一切都可以正常工作。 - Martin CR根据{{link1:abasar的回答}},我提出以下片段:
from io import StringIO
import matplotlib.pyplot as plt
def plot_to_svg() -> str:
"""
Saves the last plot made using ``matplotlib.pyplot`` to a SVG string.
Returns:
The corresponding SVG string.
"""
s = StringIO()
plt.savefig(s, format="svg")
plt.close() # https://dev59.com/v2Ml5IYBdhLWcg3wDzZG#18718162
return s.getvalue()
a = [10, 20, 5]
plt.bar(range(len(a)), a)
svg = plot_to_svg()
print(svg)
cStringIO.StringIO()
提供了一个更快但不太灵活的版本。如果 OP 实际上要在生产代码中使用它,这可能会有所影响(也可能没有!)。无论如何,StringIO
文件对象绝对是最好的选择。http://docs.python.org/library/stringio.html#module-cStringIO - Joe Kington