【问题标题】:Matplotlib figure to PDF without savingMatplotlib 图形转 PDF 不保存
【发布时间】:2015-09-16 12:08:57
【问题描述】:

我必须创建一组 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)

【问题讨论】:

  • 我现在的工作流程是这样的: 1. 创建一堆图形 2. 将图形另存为 .png 3. 将 .png 图形发送到 PDF 所以问题是我是否可以跳过这一步2 并从创建图形到在 PDF 上呈现它们
  • 您也许可以为此使用内存映射文件,但我不确定 Matplotlib 和 Platypus 是否支持这些:docs.python.org/2/library/mmap.html

标签: python pandas matplotlib reportlab


【解决方案1】:

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

在此处查找完整示例:multipage pdf matplotlib

【讨论】:

  • sry to say,但这不是最好的解决方案,正如你所说,但也许它是最短的,也很好,但下次要多注意,问题是:“直接呈现在 PDF 报告中”报告涉及的不仅仅是 matplotlib,您还需要表格、段落、连字符、连贯的字体类型等
【解决方案2】:

我认为您可以使用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)

【讨论】:

    【解决方案3】:

    使用我的包 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)
    

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 2015-05-21
      • 2020-07-16
      • 1970-01-01
      • 2012-12-18
      • 2019-12-10
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多