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)?
Enganchado
Cuando usas matplotlib.pyplot.savefig
el 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
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é).
-
Tenga en cuenta que los nombres
ax
/fig
/plt
se componen de nombres de variables – llámalos como quieras. De cualquier manera, contienen Objetos. Puedes ver qué objetossubplots
vuelve aquí: matplotlib.org/3.2.1/api/_as_gen/… y lo quepyplot
el modulo esta aqui: matplotlib.org/tutorials/introductory/pyplot.html .– Demis
28 de junio de 2020 a las 22:45
Lukasz Czerwinski
La solucion es:
pylab.savefig('foo.png')
-
pylab no está definido
– usuario14349917
6 de enero de 2021 a las 3:42
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
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
aout.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
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
aout.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
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
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 ejecutarplt.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