Estoy escribiendo un script rápido y sucio para generar tramas sobre la marcha. Estoy usando el siguiente código (de la documentación de Matplotlib ) como punto de partida:
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
No quiero mostrar el diagrama en una GUI, en cambio, quiero guardar el diagrama en un archivo (por ejemplo, foo.png), para que, por ejemplo, pueda usarse en scripts por lotes. ¿Cómo puedo hacer eso?
python
matplotlib
plot
Homunculus Reticulli
fuente
fuente
savefig
método. Entonces puedes llamarfig = plt.figure()
entoncesfig.savefig(...)
.plt.close(fig)
que es especialmente importante en los bucles grandes. De lo contrario, las cifras se mantienen abiertos a la espera en la memoria y todas las figuras abiertas se le aparecen al momento de celebrarplt.show()
Respuestas:
Si bien la pregunta ha sido respondida, me gustaría agregar algunos consejos útiles al usar matplotlib.pyplot.savefig . El formato de archivo puede especificarse mediante la extensión:
Dará una salida rasterizada o vectorizada respectivamente, ambas que podrían ser útiles. Además, encontrará que
pylab
deja un espacio en blanco generoso, a menudo indeseable, alrededor de la imagen. Eliminarlo con:fuente
plt.savefig
puedes cambiar el dpi, mira el enlace en la respuesta. Las dimensiones se pueden controlar al crear la figura, verfigsize
en matplotlib.org/api/figure_api.html#matplotlib.figure.Figureplt.ioff()
que debería desactivar la interactividad en losmatplotlib.pyplot
comandos.foo.png
es el camino. Podría, por ejemplo, ponerlo en un directorio como estesavefig("mydir/foo.png")
.Como han dicho otros,
plt.savefig()
o defig1.savefig()
hecho es la forma de guardar una imagen.Sin embargo, he descubierto que en ciertos casos la figura siempre se muestra . (por ejemplo, con Spyder teniendo
plt.ion()
: modo interactivo = Encendido). Trabajo alrededor de esto forzando el cierre de la ventana de la figura en mi bucle gigante conplt.close(figure_object)
(ver documentación ), por lo que no tengo un millón de figuras abiertas durante el bucle:Debería poder volver a abrir la figura más tarde si es necesario con
fig.show()
(no me probé).fuente
plt.ioff() # turn of interactive plotting mode
, pero eso puede deshabilitar el comportamiento que desea utilizar si su código sale con un error.plt.close(fig)
resueltoLa solucion es:
fuente
Acabo de encontrar este enlace en la documentación de MatPlotLib que aborda exactamente este problema: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Dicen que la forma más fácil de evitar que la figura aparezca es usar un backend no interactivo (por ejemplo, Agg), a través de
matplotib.use(<backend>)
, por ejemplo:Todavía prefiero usarlo personalmente
plt.close( fig )
, desde entonces tienes la opción de ocultar ciertas figuras (durante un ciclo), pero aún así mostrar las cifras para el procesamiento de datos posterior al ciclo. Sin embargo, probablemente sea más lento que elegir un backend no interactivo; sería interesante si alguien lo probara.ACTUALIZACIÓN : para Spyder, generalmente no puede configurar el back-end de esta manera (porque Spyder generalmente carga matplotlib temprano, evitando que lo use
matplotlib.use()
).En su lugar, use
plt.switch_backend('Agg')
o desactive " habilitar soporte " en las preferencias de Spyder y ejecute elmatplotlib.use('Agg')
comando usted mismo.De estos dos consejos: uno , dos
fuente
.plot()
arrojará un error sios.environ['DISPLAY']
no está configurado correctamente.Si no le gusta el concepto de la figura "actual", haga lo siguiente:
fuente
src.png
aout.png
?img
), puede guardarlo en un archivo con el.imsave()
método.Las otras respuestas son correctas. Sin embargo, a veces encuentro que quiero abrir el objeto de la figura más tarde. Por ejemplo, podría querer cambiar los tamaños de las etiquetas, agregar una cuadrícula o hacer otro procesamiento. En un mundo perfecto, simplemente volvería a ejecutar el código que genera la trama y adaptaría la configuración. Por desgracia, el mundo no es perfecto. Por lo tanto, además de guardar en PDF o PNG, agrego:
De esta manera, luego puedo cargar el objeto de la figura y manipular la configuración como me plazca.
También escribo la pila con el código fuente y el
locals()
diccionario para cada función / método en la pila, para que luego pueda decir exactamente qué generó la figura.NB: Tenga cuidado, ya que a veces este método genera archivos enormes.
fuente
fuente
Después de usar plot () y otras funciones para crear el contenido que desea, puede usar una cláusula como esta para seleccionar entre trazar en la pantalla o archivar:
fuente
fig = plt.figure(figuresize=4, 5)
podría serfig = plt.figure(figsize=(4, 5)) #figure sizes in inches
Usé lo siguiente:
Me pareció muy importante usar plt.show después de guardar la figura, de lo contrario no funcionará. figura exportada en png
fuente
f= plt.savefig('data.png')
Puedes hacer:
y recuerde dejar que savefig termine antes de cerrar el diagrama de la GUI. De esta manera puedes ver la imagen de antemano.
Alternativamente, puede mirarlo con
plt.show()
Luego cierre la GUI y ejecute el script nuevamente, pero esta vez reempláceloplt.show()
conplt.savefig()
.Alternativamente, puedes usar
fuente
Si, como yo, usa Spyder IDE, debe deshabilitar el modo interactivo con:
plt.ioff()
(este comando se inicia automáticamente con el inicio científico)
Si desea habilitarlo nuevamente, use:
plt.ion()
fuente
La solución :
Si desea mostrar la imagen y guardarla, use:
después
import matplotlib
fuente
De acuerdo con la pregunta Matplotlib (pyplot) savefig genera una imagen en blanco .
Una cosa debe tener en cuenta: si usa
plt.show
y debería despuésplt.savefig
, o le dará una imagen en blanco.Un ejemplo detallado:
fuente
En Jupyter Notebook, debe eliminar
plt.show()
y agregarplt.savefig()
, junto con el resto del código plt en una celda. La imagen seguirá apareciendo en su cuaderno.fuente
Dado que hoy (no estaba disponible cuando se hizo esta pregunta) muchas personas usan Jupyter Notebook como consola de Python, hay una manera extremadamente fácil de guardar las tramas ya que
.png
, simplemente llame a la clasematplotlib
'spylab
de Jupyter Notebook, trace la figura' en línea 'jupyter celdas, y luego arrastre esa figura / imagen a un directorio local. ¡No te olvides%matplotlib inline
en la primera línea!fuente
Además de los anteriores, agregué
__file__
el nombre para que la imagen y el archivo Python obtengan los mismos nombres. También agregué algunos argumentos para que se vea mejor:fuente
Al usar
matplotlib.pyplot
, primero debe guardar su trama y luego cerrarla usando estas 2 líneas:fuente
Como se sugirió anteriormente, puede usar:
Para guardar cualquier imagen de IPhython que esté mostrando. O en una nota diferente (mirando desde un ángulo diferente), si alguna vez puede trabajar con cv abierto, o si ha importado cv abierto, puede optar por:
importar cv2
cv2.imwrite ("myfig.png", imagen)
Pero esto es solo por si necesitas trabajar con Open CV. De lo contrario, plt.savefig () debería ser suficiente.
fuente
Puede guardar su imagen con cualquier extensión (png, jpg, etc.) y con la resolución que desee. Aquí hay una función para guardar tu figura.
'fig_id' es el nombre con el que desea guardar su figura. Espero eso ayude:)
fuente
Puedes hacerlo así:
fuente