将pandas / matplotlib映像直接写入XLSX文件

时间:2015-06-08 18:54:05

标签: python excel pandas matplotlib xlsxwriter

我在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,它仍然需要文件名/网址等。

1 个答案:

答案 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)