Llamar a pylab.savefig sin mostrar en ipython

111

Necesito crear una figura en un archivo sin mostrarla en el cuaderno IPython. No tengo claro la interacción entre IPythony matplotlib.pylaben este sentido. Pero, cuando llamo a pylab.savefig("test.png")la figura actual, se muestra además de guardarse en formato test.png. Al automatizar la creación de un gran conjunto de archivos de trazado, a menudo esto no es deseable. O en el caso de que se desee un archivo intermedio para el procesamiento externo de otra aplicación.

No estoy seguro si se trata de una matplotlibo IPythonpregunta portátil.

tnt
fuente
La respuesta de @staticfloat funcionó para mí incluso cuando no estaba dentro de un cuaderno, y cuando usaba matplotlib a través de JuliaLang; usandoioff
Vass

Respuestas:

173

Esta es una pregunta de matplotlib, y puede solucionar esto usando un backend que no se muestra al usuario, por ejemplo, 'Agg':

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

EDITAR: Si no desea perder la capacidad de mostrar gráficos, desactive el modo interactivo y solo llame plt.show()cuando esté listo para mostrar los gráficos:

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()
flotador estático
fuente
2
Bien, pero, en general, quiero conservar el trazado en línea dentro de iPython. Lo que sugieres funciona bien si haces un cambio completo en el backend. La pregunta es cómo se permite la situación general del trazado en línea con el caso excepcional de guardar cifras (sin mostrar en línea). Con su sugerencia, intenté recargar los módulos y cambiar el backend temporalmente pero sin éxito. ¿Alguna idea sobre cómo cambiar temporalmente el backend dentro de una sesión de cuaderno iPython?
tnt
1
He actualizado la pregunta para hablar sobre el trazado interactivo y los comandos close()y show(), que deberían resolver su problema. no se admite el cambio de backends sobre la marcha, como ha descubierto.
staticfloat
3
Gracias por los excelentes comentarios. Parece que plt.close (fig) es el comando de teclado para mi necesidad. Todavía no tengo claro el ioff ya que no parece afectar la operación; pero probablemente me esté perdiendo algo. Gracias de nuevo.
tnt
1
La receta que he dado es general; Si no está trabajando en el cuaderno de ipython, plt.ioff () es importante para evitar que las cifras parpadeen dentro y fuera de la pantalla, ya que en la línea de comandos las cifras de ipython se trazan tan pronto como llame plt.plot()si el modo interactivo está activado . Desactivar el modo interactivo retrasa la visualización de los gráficos hasta plt.show(). Debido a que está utilizando el cuaderno ipython, el modo interactivo se trata de manera diferente.
staticfloat
Para mí, matplotlib.use('Agg')solo hizo el truco. No necesitaba ninguno plt.show()o plt.ioff()en mi código en absoluto.
Zhanwen Chen
67

No lo necesitamos plt.ioff()o plt.show()(si lo usamos %matplotlib inline). Puede probar el código anterior sin plt.ioff(). plt.close()tiene el papel fundamental. Prueba este:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

Si ejecuta este código en iPython, mostrará un segundo gráfico, y si lo agrega plt.close(fig2)al final, no verá nada.

En conclusión, si cierra la figura plt.close(fig), no se mostrará.

Mojtaba Khodadadi
fuente
5
¡Mejor solución de hecho! Genero y guardo muchas parcelas en un bucle. Con plt.ioffme pongo RuntimeWarning: More than 20 figures have been opened.... plt.closeresuelto.
Nagasaki45