Matplotlib SVG作为字符串而不是文件

18

我想使用Matplotlib和pyplot生成SVG图像,并在Django框架中使用。目前,我已经生成了与页面链接的图像文件,但有没有一种方法可以直接获得SVG图像作为Unicode字符串,而无需写入文件系统?

3个回答

23

使用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

1
值得一提的是,cStringIO.StringIO() 提供了一个更快但不太灵活的版本。如果 OP 实际上要在生产代码中使用它,这可能会有所影响(也可能没有!)。无论如何,StringIO 文件对象绝对是最好的选择。http://docs.python.org/library/stringio.html#module-cStringIO - Joe Kington

7

这是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

3
我无法让浏览器呈现这个结果,但如果我将 f = io.BytesIO() 替换为 f = io.StringIO(),那么一切都可以正常工作。 - Martin CR
真希望我一个小时前就看到这个评论!解决了我的问题。 - undefined

0

根据{{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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接