Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib图形转换为PDF而不保存_Python_Pandas_Matplotlib_Reportlab - Fatal编程技术网

Python Matplotlib图形转换为PDF而不保存

Python Matplotlib图形转换为PDF而不保存,python,pandas,matplotlib,reportlab,Python,Pandas,Matplotlib,Reportlab,我必须创建一组matplotlib图,我想直接将其显示在PDF报告中,而不将其保存为文件 我的绘图数据存储在一个数据框中: 现在我不知道还有什么比先保存图像,然后再使用它更好的选择 我正在做这样的事情: import matplotlib.pylab as plt from reportlab.platypus import BaseDocTemplate, Image for index, row in myDataFrame.iterrows(): fig = plt.figure

我必须创建一组matplotlib图,我想直接将其显示在PDF报告中,而不将其保存为文件

我的绘图数据存储在一个数据框中:

现在我不知道还有什么比先保存图像,然后再使用它更好的选择

我正在做这样的事情:

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

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

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)

以下是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) 


在此处找到完整示例:

使用我的软件包autobasedoc,您的示例如下所示:

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

我现在的工作流程是这样的:1。创建一组图2。将这些数字另存为.png 3。将.png图形发送到PDF,那么问题是我是否可以跳过步骤2,从创建图形到在PDF上显示它们。您可能可以使用内存映射文件来实现这一点,但我不确定Matplotlib和Platypus是否支持这些:sry,但这不是最好的解决方案,正如您所说,但也许它是最短的,也是非常好的,但下次请注意,问题是:“在PDF报告中直接显示”报告涉及的不仅仅是matplotlib,您需要表格、段落、连字号、连贯的字体类型等