Guarde la trama en un archivo de imagen en lugar de mostrarla

6 minutos de lectura

Avatar de usuario de Homunculus Reticulli
Homúnculo Retículo

Esto muestra la figura en una GUI:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()

Pero, ¿cómo guardo la figura en un archivo (por ejemplo, foo.png)?

  • Muchas de las respuestas más abajo en la página mencionan plt.close(fig) lo cual es especialmente importante en bucles grandes. De lo contrario, las cifras permanecen abiertas y esperando en la memoria y todas las cifras abiertas se mostrarán al ejecutar plt.show()

    – Timctran

    8 de junio de 2017 a las 4:09

  • pseudo-respuesta interesante, claramente por encima de las respuestas reales: palmada de golf

    – Demis

    21 de marzo a las 5:25

Avatar de usuario de Hooked
Enganchado

Cuando usas matplotlib.pyplot.savefigel formato de archivo se puede especificar mediante la extensión:

from matplotlib import pyplot as plt

plt.savefig('foo.png')
plt.savefig('foo.pdf')

Eso da una salida rasterizada o vectorizada respectivamente. Además, a veces hay espacios en blanco no deseados alrededor de la imagen, que se pueden eliminar con:

plt.savefig('foo.png', bbox_inches="tight")

Tenga en cuenta que si muestra la trama, plt.show() debe seguir plt.savefig(); de lo contrario, la imagen del archivo estará en blanco.

  • ¿Alguien puede explicar por qué mostrar antes de guardar dará como resultado una imagen en blanco guardada?

    – nube silenciosa

    8 de marzo de 2022 a las 15:25

  • @SilentCloud al llamar a show() borra la trama. Tienes que guardarlo antes, pero también hay otras opciones para esto.

    – trinidad420

    13/04/2022 a las 10:50

  • Para Jupyter Notebook, plt.plot(data) y plt.savefig(‘foo.png’) deben estar en la misma celda. Si no, verá un archivo en blanco.

    – Punnerud

    13 oct 2022 a las 11:19

Avatar de usuario de Demis
demis

Como han dicho otros, plt.savefig() o fig1.savefig() es de hecho la forma de guardar una imagen.

Sin embargo, he encontrado que en ciertos casos la figura siempre se muestra. (por ejemplo, con Spyder teniendo plt.ion(): modo interactivo = Activado.) Resuelvo esto forzando el cierre de la ventana de la figura con:

plt.close(figure_object)

(ver documentación). De esta manera, no tengo un millón de cifras abiertas durante un ciclo grande. Ejemplo de uso:

import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 )  # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png')   # save the figure to file
plt.close(fig)    # close the figure window

Debería poder volver a abrir la figura más tarde si es necesario con fig.show() (no me probé).

Avatar de usuario de Lukasz Czerwinski
Lukasz Czerwinski

La solucion es:

pylab.savefig('foo.png')

  • pylab no está definido

    usuario14349917

    6 de enero de 2021 a las 3:42

Avatar de usuario de Demis
demis

Acabo de encontrar este enlace en la documentación de MatPlotLib que aborda exactamente este problema:
http://matplotlib.org/faq/howto_faq.html#generar-imágenes-sin-tener-una-ventana-aparece

Dicen que la forma más fácil de evitar que aparezca la figura es usar un backend no interactivo (por ejemplo, Agg), a través de matplotib.use(<backend>)p.ej:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')

Todavía personalmente prefiero usar plt.close( fig ), desde entonces tiene la opción de ocultar ciertas cifras (durante un bucle), pero seguir mostrando cifras para el procesamiento de datos posterior al bucle. Sin embargo, probablemente sea más lento que elegir un backend no interactivo; sería interesante si alguien probara eso.

ACTUALIZAR: para Spyder, por lo general no puede configurar el backend de esta manera (porque Spyder generalmente carga matplotlib temprano, lo que le impide usar matplotlib.use()).

En su lugar, utilice plt.switch_backend('Agg')o Desactivar “habilitar soporte” en las preferencias de Spyder y ejecute el matplotlib.use('Agg') ordenate a ti mismo.

De estas dos pistas: uno, dos

avatar de usuario de wonder.mice
maravilla.ratones

Si no le gusta el concepto de la figura “actual”, haga lo siguiente:

import matplotlib.image as mpimg

img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)

  • ¿No es esto solo una copia? src.png a out.png?

    – Gerrit

    26 mayo 2016 a las 11:44

  • Eso es solo un ejemplo, que muestra si tiene un objeto de imagen (img), luego puede guardarlo en un archivo con .imsave() método.

    – maravilla.ratones

    26 mayo 2016 a las 23:29

  • @wonder.mice ayudaría a mostrar cómo crear una imagen sin usar la figura actual.

    – adivinar

    10 de agosto de 2016 a las 6:50

  • @wonder.mice Gracias por este ejemplo, es el primero que me mostró cómo guardar un objeto de imagen en .png.

    – Arthur Dent

    24 mayo 2017 a las 21:09

  • @scry No siempre necesita crear una imagen, a veces prueba un código y desea una salida visual, es útil en tales ocasiones.

    – Schutze

    13 de febrero de 2019 a las 15:08


Avatar de usuario de Victor Juliet
Víctor Julieta

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

  • ¿No es esto solo una copia? src.png a out.png?

    – Gerrit

    26 mayo 2016 a las 11:44

  • Eso es solo un ejemplo, que muestra si tiene un objeto de imagen (img), luego puede guardarlo en un archivo con .imsave() método.

    – maravilla.ratones

    26 mayo 2016 a las 23:29

  • @wonder.mice ayudaría a mostrar cómo crear una imagen sin usar la figura actual.

    – adivinar

    10 de agosto de 2016 a las 6:50

  • @wonder.mice Gracias por este ejemplo, es el primero que me mostró cómo guardar un objeto de imagen en .png.

    – Arthur Dent

    24 mayo 2017 a las 21:09

  • @scry No siempre necesita crear una imagen, a veces prueba un código y desea una salida visual, es útil en tales ocasiones.

    – Schutze

    13 de febrero de 2019 a las 15:08


avatar de usuario de afroditi
afrodita

Usé lo siguiente:

import matplotlib.pyplot as plt

p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")  
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")  
plt.legend(loc="upper center", numpoints=1, bbox_to_anchor=(0.5, -0.05),        ncol=2, fancybox=True, shadow=True)

plt.savefig('data.png')  
plt.show() 
plt.close()

Encontré muy importante usar plt.show después de guardar la figura, de lo contrario no funcionará.figura exportada en png

¿Ha sido útil esta solución?