¿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?

Stefano Borini
fuente
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.

David Cournapeau
fuente
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.

randlet
fuente
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")
lmount
fuente
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.

Dirklinux
fuente
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().

Damo
fuente
me
ahorraste
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 ...

Seenivasan
fuente