使用 PyFPDF 将 Matplotlib 子图保存为 PDF
Save Matplotlib subplot as PDF using PyFPDF
我正在尝试创建两个图形,每个图形中有两个图,然后用其中一个图形创建一个 PDF 文件。我想选择将哪个图形保存在 PDF 文件中。
我有这个简单的代码。这只是一个例子:
from fpdf import FPDF
from matplotlib import pyplot as plt
import tempfile
import io
# Examples
X = [0, 1, 2, 3, 4, 5, 6]
Y = [0, 1, 0, 1, 0, 1, 0]
X1 = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
Y1 = [1, 4, 6, 4, 2, 12, 4, 6, 3, 12]
X2 = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
Y2 = [1, 1, 1, 3, 6, 12, 18, 24, 30, 36]
X3 = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
Y3 = [1, 30, 20, 30, 10, 30, 40, 40, 50, 20]
def plot(x,y, x1, y1):
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(x, y)
ax2.plot(x1, y1)
return fig
def pdf_generator():
fig = io.BytesIO()
plt.savefig(fig, format="png")
saved_fig = tempfile.NamedTemporaryFile()
with open(f"{saved_fig.name}.png", 'wb') as sf:
sf.write(fig.getvalue())
pdf = FPDF('P', 'mm', 'A4')
pdf.add_page(orientation='P', format='A4')
pdf.set_xy(30, 50)
pdf.image(fig, w=140, h=110)
fig.close()
return pdf.output('pdf_plot.pdf')
figA = plot(X1,Y1, X2,Y2)
figB = plot(X,Y, X3,Y3)
pdf_generator()
我创建了 figA
和 figB
。但是,始终“转换”为 PDF 的数字是 figB
。我已经尝试创建一个 pdf_generator 函数来接受图形名称作为参数,但它不起作用。
有什么解决这个问题的建议吗?
你就快完成了,你只需要更改你的函数定义,将你想要绘制的图形作为参数,并使用 figure.savefig()
而不是 plt.savefig
保存它:
#...
def pdf_generator(figure):
fig = io.BytesIO()
figure.savefig(fig, format="png")
#...
pdf_generator(figA)
pdf_generator(figB)
我正在尝试创建两个图形,每个图形中有两个图,然后用其中一个图形创建一个 PDF 文件。我想选择将哪个图形保存在 PDF 文件中。 我有这个简单的代码。这只是一个例子:
from fpdf import FPDF
from matplotlib import pyplot as plt
import tempfile
import io
# Examples
X = [0, 1, 2, 3, 4, 5, 6]
Y = [0, 1, 0, 1, 0, 1, 0]
X1 = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
Y1 = [1, 4, 6, 4, 2, 12, 4, 6, 3, 12]
X2 = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
Y2 = [1, 1, 1, 3, 6, 12, 18, 24, 30, 36]
X3 = [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
Y3 = [1, 30, 20, 30, 10, 30, 40, 40, 50, 20]
def plot(x,y, x1, y1):
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(x, y)
ax2.plot(x1, y1)
return fig
def pdf_generator():
fig = io.BytesIO()
plt.savefig(fig, format="png")
saved_fig = tempfile.NamedTemporaryFile()
with open(f"{saved_fig.name}.png", 'wb') as sf:
sf.write(fig.getvalue())
pdf = FPDF('P', 'mm', 'A4')
pdf.add_page(orientation='P', format='A4')
pdf.set_xy(30, 50)
pdf.image(fig, w=140, h=110)
fig.close()
return pdf.output('pdf_plot.pdf')
figA = plot(X1,Y1, X2,Y2)
figB = plot(X,Y, X3,Y3)
pdf_generator()
我创建了 figA
和 figB
。但是,始终“转换”为 PDF 的数字是 figB
。我已经尝试创建一个 pdf_generator 函数来接受图形名称作为参数,但它不起作用。
有什么解决这个问题的建议吗?
你就快完成了,你只需要更改你的函数定义,将你想要绘制的图形作为参数,并使用 figure.savefig()
而不是 plt.savefig
保存它:
#...
def pdf_generator(figure):
fig = io.BytesIO()
figure.savefig(fig, format="png")
#...
pdf_generator(figA)
pdf_generator(figB)