Il existe plusieurs graphiques matplotlib. Il est nécessaire de les enregistrer dans un seul fichier pdf. Que faire?
Méthode I.Enregistrer un graphique sur une page à l'aide de PdfPages
Cette méthode peut être implémentée en utilisant deux options.
Utilisation de la magie de matplotlib:
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np
# .
pdf = PdfPages("Figures.pdf")
# .
FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2]
X = np.linspace(-5, 5, 100)
for function in FUNCTIONS:
plt.plot(X, function(X))
pdf.savefig()
plt.close()
#
pdf.close()
Utilisation de l'accès direct aux formes:
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np
# .
FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2]
X = np.linspace(-5, 5, 100)
figures = []
for function in FUNCTIONS:
figure = plt.figure()
axes = figure.subplots()
axes.plot(X, function(X))
figures.append(figure)
# .
# figures = []
# .
pdf = PdfPages("Figures.pdf")
for figure in figures:
pdf.savefig(figure)
#
pdf.close()
On a:
Méthode II. Enregistrement de plusieurs graphiques sur une page à l'aide de PdfPages
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np
#
FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2, np.tan]
X = np.linspace(-5, 5, 100)
#
ROWS = 2
COLUMNS = 2
# .
pdf = PdfPages("Figures.pdf")
#
index = 0
for page in range(len(FUNCTIONS)//(ROWS*COLUMNS)+1):
# .
figure = plt.figure(figsize=(12, 12))
axes = figure.subplots(ROWS, COLUMNS)
#
for row in range(ROWS):
for column in range(COLUMNS):
if index < len(FUNCTIONS):
axes[row, column].plot(X, FUNCTIONS[index](X))
index += 1
#
pdf.savefig(figure)
#
pdf.close()
On a:
Cela ne fonctionnera pas si nous avons un éventail de formes déjà concrètes. Pour cette simple raison, la figure a déjà été dessinée ce qui est nécessaire et comme il se doit. Et en plus, chaque forme a ses propres dpi et taille, ce qui affecte le rendu. Bien sûr, tout cela peut être pris en compte en compliquant l'algorithme, mais il est beaucoup plus facile de passer à la méthode 3.
Méthode III. Utilisation de reportlab
La manière la plus polyvalente.
import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.lib.utils import ImageReader
# .
FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2]
X = np.linspace(-5, 5, 100)
figures = []
for function in FUNCTIONS:
figure = plt.figure()
axes = figure.subplots()
axes.plot(X, function(X))
figures.append(figure)
# .
# figures = []
#
indent = 1.5
# canvas
c = canvas.Canvas("Figures.pdf")
c.setTitle("Figures")
height = indent
# .
for figure in figures:
# dpi ( )
dpi = figure.get_dpi()
figureSize = figure.get_size_inches()
# .
# , .
figure.patches.extend(
[plt.Rectangle((0, 1/(dpi*figureSize[1])), width=1-2/(dpi*figureSize[0]),
height=1-2/(dpi*figureSize[1]),
transform=figure.transFigure, figure=figure, clip_on=False,
edgecolor="black",
facecolor="none", linewidth=1)])
# .
image = BytesIO()
figure.savefig(image, format="png")
image.seek(0)
image = ImageReader(image)
# .
figureSize = figure.get_size_inches()*2.54
# A4 210×297
# ,
if height + figureSize[1] + indent > 29.7:
height = indent
c.showPage()
# image pdf
c.drawImage(image, (10.5-figureSize[0]/2)*cm, height*cm,
figureSize[0]*cm, figureSize[1]*cm)
height += figureSize[1]
# .
c.save()
On a:
Merci d'avoir lu l'article. Bonne chance!