我在pandas / matplotlib中生成图并希望将它们写入XLSX文件。我不打算创建原生Excel图表;我只是把这些情节写成非交互式图像。我使用的是XlsxWriter library/engine。
我找到的最接近的解决方案是the answer to this SO question,建议使用XlsxWriter.write_image()方法。但是,此方法似乎将文件名作为输入。我试图以编程方式传递pandas / matplotlib plot()
调用的直接输出,例如像这样的东西:
h = results.resid.hist()
worksheet.insert_image(row, 0, h) # doesn't work
或者这个:
s = df.plot(kind="scatter", x="some_x_variable", y="resid")
worksheet.insert_image(row, 0, s) # doesn't work
有没有办法实现这一点,缺少首先将图像写入磁盘文件的解决方法?
下面的回答让我走上正轨并接受了。我需要进行一些更改,主要是(我认为),因为我使用的是Python 3,也许还有一些API更改。这是解决方案:
from io import BytesIO
import matplotlib.pyplot as plt
imgdata = BytesIO()
fig, ax = plt.subplots()
results.resid.hist(ax=ax)
fig.savefig(imgdata, format="png")
imgdata.seek(0)
worksheet.insert_image(
row, 0, "",
{'image_data': imgdata}
)
""
代码中的insert_image()
会欺骗Excel,它仍然需要文件名/网址等。
答案 0 :(得分:10)
您可以将图像作为文件对象(而不是磁盘)保存到内存中,然后在插入Excel文件时使用它:
import matplotlib.pyplot as plt
from cStringIO import StringIO
imgdata = StringIO()
fig, ax = plt.subplots()
# Make your plot here referencing ax created before
results.resid.hist(ax=ax)
fig.savefig(imgdata)
worksheet.insert_image(row, 0, imgdata)