Python Matplotlib图形转换为PDF而不保存
我必须创建一组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
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,您需要表格、段落、连字号、连贯的字体类型等