Guarde las parcelas en un PDF

91

módulo de trazado

def plotGraph(X,Y):
    fignum = random.randint(0,sys.maxint)
    plt.figure(fignum)
    ### Plotting arrangements ###
    return fignum

módulo principal

import matplotlib.pyplot as plt
### tempDLStats, tempDLlabels are the argument
plot1 = plotGraph(tempDLstats, tempDLlabels)
plot2 = plotGraph(tempDLstats_1, tempDLlabels_1)
plot3 = plotGraph(tempDLstats_2, tempDLlabels_2)
plt.show()

Quiero guardar todos los gráficos plot1, plot2, plot3 en un solo archivo PDF. ¿Hay alguna forma de lograrlo? No puedo incluir la plotGraphfunción en el módulo principal.

Hay una función nombrada pylab.savefigpero que parece funcionar solo si se coloca junto con el módulo de trazado. ¿Hay alguna otra forma de lograrlo?

VoodooNiño92
fuente

Respuestas:

209

Si alguien termina aquí desde Google, buscando convertir una sola figura a .pdf (eso era lo que estaba buscando):

import matplotlib.pyplot as plt

f = plt.figure()
plt.plot(range(10), range(10), "o")
plt.show()

f.savefig("foo.pdf", bbox_inches='tight')
Clemente T.
fuente
1
¿Cómo se configura el tamaño de página del pdf?
wherestheforce
2
@wherestheforce No estoy seguro de que pueda establecer el tamaño de página del pdf directamente, pero puede cambiar el tamaño de la figura: f = plt.figure (figsize = (5, 10)) por ejemplo, para cambiar la proporción del pdf.
Clement T.14 de
119

Para múltiples parcelas en un solo archivo pdf, puede usar PdfPages

En la plotGraphfunción debe devolver la figura y luego la llamada savefigdel objeto figura.

------ módulo de trazado ------

def plotGraph(X,Y):
      fig = plt.figure()
      ### Plotting arrangements ###
      return fig

------ módulo de trazado ------

----- mainModule ----

from matplotlib.backends.backend_pdf import PdfPages

plot1 = plotGraph(tempDLstats, tempDLlabels)
plot2 = plotGraph(tempDLstats_1, tempDLlabels_1)
plot3 = plotGraph(tempDLstats_2, tempDLlabels_2)

pp = PdfPages('foo.pdf')
pp.savefig(plot1)
pp.savefig(plot2)
pp.savefig(plot3)
pp.close()
arjenve
fuente
3
"Disposición de gráficos" merece un ejemplo para explicar cómo agregar gráficos a las figuras.
user2127595
1
@ user2127595 Esto me funciona: def plot_graph (x, y1, y2): fig = plt.figure () axes1 = fig.add_subplot (2, 1, 1) axes2 = fig.add_subplot (2, 1, 2) axes1. plot (x, y1) axes2.plot (x, y2) return fig
DeanM
22
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt

# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
    plt.figure(figsize=(3, 3))
    plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
    plt.title('Page One')
    pdf.savefig()  # saves the current figure into a pdf page
    plt.close()

    plt.rc('text', usetex=True)
    plt.figure(figsize=(8, 6))
    x = np.arange(0, 5, 0.1)
    plt.plot(x, np.sin(x), 'b-')
    plt.title('Page Two')
    pdf.savefig()
    plt.close()

    plt.rc('text', usetex=False)
    fig = plt.figure(figsize=(4, 5))
    plt.plot(x, x*x, 'ko')
    plt.title('Page Three')
    pdf.savefig(fig)  # or you can pass a Figure object to pdf.savefig
    plt.close()

    # We can also set the file's metadata via the PdfPages object:
    d = pdf.infodict()
    d['Title'] = 'Multipage PDF Example'
    d['Author'] = u'Jouni K. Sepp\xe4nen'
    d['Subject'] = 'How to create a multipage pdf file and set its metadata'
    d['Keywords'] = 'PdfPages multipage keywords author title subject'
    d['CreationDate'] = datetime.datetime(2009, 11, 13)
    d['ModDate'] = datetime.datetime.today()
Víctor Julieta
fuente
3
Si está usando, plt.show()póngalo después pdf.savefig().
de keras import michael
-23

No importa la manera de hacerlo.

def plotGraph(X,Y):
     fignum = random.randint(0,sys.maxint)
     fig = plt.figure(fignum)
     ### Plotting arrangements ###
     return fig

------ módulo de trazado ------

----- mainModule ----

 import matplotlib.pyplot as plt
 ### tempDLStats, tempDLlabels are the argument
 plot1 = plotGraph(tempDLstats, tempDLlabels)
 plot2 = plotGraph(tempDLstats_1, tempDLlabels_1)
 plot3 = plotGraph(tempDLstats_2, tempDLlabels_2)
 plt.show()
 plot1.savefig('plot1.png')
 plot2.savefig('plot2.png')
 plot3.savefig('plot3.png')

----- mainModule -----

VoodooNiño92
fuente
19
Espera, pensé que querías guardar los trazados en un solo archivo PDF. Su solución guarda las imágenes en tres archivos PNG separados, lo que parece ser la respuesta a una pregunta diferente.
DSM
2
Lo siento extremadamente. Me estaba concentrando más en guardar el archivo de alguna manera. Sabía lo del pdf del backend ... pero seguí con mi trabajo y me olvidé de agregarlo. De todos modos, gracias por señalarlo.
VoodooChild92
5
Al ver el número de votos negativos, puede pensar en eliminar esta respuesta para dejar "espacio" para las otras respuestas.
PatrickT