繁体   English   中英

Matplotlib 图形转换为 PDF 无需保存

[英]Matplotlib figure to PDF without saving

我必须创建一组 matplotlib 图形,我想直接在 PDF 报告中呈现,而不将它们保存为文件。

我的绘图数据存储在 Pandas DataFrame 中:

现在我不知道除了先保存图像并稍后使用它之外还有其他更好的选择。

我正在做这样的事情:

import matplotlib.pylab as plt
from reportlab.platypus import BaseDocTemplate, Image

for index, row in myDataFrame.iterrows():
    fig = plt.figure()
    plt.plot(row['Xvalues'], row['Yvalues'],'o', color='r')
    fig.savefig('figure_%s.png' % (row['ID']))
    plt.close(fig)

text = []
doc = BaseDocTemplate(pageName, pagesize=landscape(A4))

for f in listdir(myFolder):
    if f.endswith('png'):
        image1 = Image(f)
        text.append(image1)

doc.build(text)

这是 matplotlib 本身提供的最佳解决方案:

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

with PdfPages('foo.pdf') as pdf:
    #As many times as you like, create a figure fig and save it:
    fig = plt.figure()
    pdf.savefig(fig)

    ....
    fig = plt.figure()
    pdf.savefig(fig) 

在这里找到一个完整的例子: 多页 pdf matplotlib

我认为您可以使用io.BytessIO将图形保存到缓冲区中并在鸭嘴兽中使用它。 也许是这样的?

import io
import matplotlib.pylab as plt
from reportlab.platypus import BaseDocTemplate, Image

buffers = []

for index, row in myDataFrame.iterrows():
    fig = plt.figure()
    plt.plot(row['Xvalues'], row['Yvalues'],'o', color='r')

    mybuffer = io.BytesIO()
    fig.savefig(mybuffer, format = 'pdf')
    mybuffer.seek(0)
    buffers.append(mybuffer)
    plt.close(fig)

text = []
doc = BaseDocTemplate(pageName, pagesize=landscape(A4))

doc.build(buffers)

使用我的包 autobasedoc https://pypi.org/project/autobasedoc/你的例子看起来像这样:

from autobasedoc import autorpt as ar
from autobasedoc import autoplot as ap

@ap.autoPdfImg
def my_plot(index, row, canvaswidth=5): #[inch]
    fig, ax = ap.plt.subplots(figsize=(canvaswidth,canvaswidth))
    fig.suptitle(f"My simple plot {index}", fontproperties=fontprop)
    ax.plot(row['Xvalues'], row['Yvalues'],label=f"legendlabel{index}")
    return fig

doc = ar.AutoDocTemplate(pageName)

content = []

for index, row in myDataFrame.iterrows():
    content.append(my_plot(index, row))

doc.build(content)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM