¿Cómo le digo a matplotlib que he terminado con una trama?


165

El siguiente código traza dos archivos PostScript (.ps), pero el segundo contiene ambas líneas.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(111)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.subplot(111)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

¿Cómo puedo decirle a matplotlib que comience de nuevo para la segunda trama?


3
Como punto de estilo, no es necesario usar una subtrama cuando solo tiene una gráfica por figura.
Autoplectic

Respuestas:


123

Puede usar figurepara crear una nueva trama, por ejemplo, o usar closedespués de la primera trama.


19
El tutorial de pyplot menciona clf () en la sección "figuras múltiples". Tenga en cuenta que si solo crea una nueva gráfica con figure () sin cerrar la anterior con close () (incluso si cierra la ventana de la GUI), pyplot conserva una referencia a su figura anterior, que puede parecer una pérdida de memoria.
Jouni K. Seppänen

55
Puede usar plt.close () / pylab.close () para eliminar todas las figuras antiguas
Calvin1602

1
Después de la primera trama, ¿quieres decir después plt.savefig("first.ps")?
Sigur

@ JouniK.Seppänen Solo para agregar a su comentario, Python le advertirá por defecto si abre muchas figuras: "RuntimeWarning: se han abierto más de 20 figuras".
rph

173

Hay un comando de figura clara, y debería hacerlo por usted:

plt.clf()

Si tiene varias subtramas en la misma figura

plt.cla()

borra los ejes actuales.


1
¡Gracias! Si está utilizando el backend PDF (que le permite guardar varias parcelas), deberá llamar a esto después de cada llamada a plt.save ()
Ben DeMott

44
En mi caso, plt.clf () fue suficiente para borrar la figura pero insuficiente para detener las pérdidas de memoria, pero al llamar primero a plt.close () se detuvo la pérdida de memoria. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.
DJDuff

29

Como lo indica David Cournapeau, use figure ().

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.figure()
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.figure()
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

O subplot (121) / subplot (122) para el mismo diagrama, posición diferente.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(121)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")

plt.subplot(122)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

3
también debe utilizar plt.clf(), las cifras se mantienen en la memoria hasta que explícitamente cerrados
kaveish

13

Simplemente ingrese plt.hold(False)antes de la primera plt.plot, y puede apegarse a su código original.


66
en matplotlib == 2.0.2, recibo este mensaje: MatplotlibDeprecationWarning: pyplot.hold está en desuso.
Jonathan

12

Si está utilizando Matplotlib de forma interactiva, por ejemplo, en una aplicación web (por ejemplo, ipython), tal vez esté buscando

plt.show()

en lugar de plt.close()o plt.clf().



1

Si ninguno de ellos funciona, verifique esto ... diga si tiene matrices x e y de datos a lo largo del eje respectivo. Luego verifique en qué celda (jupyter) ha inicializado x e y para vaciar. Esto se debe a que quizás esté agregando datos a x e y sin reinicializarlos. Entonces la trama también tiene datos antiguos. Así que revisa eso ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.