2009-04-12 24 views
113

El siguiente código traza dos archivos PostScript (.ps), pero el segundo contiene ambas líneas.¿Cómo le digo a matplotlib que he terminado con una trama?

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 empiece de nuevo por la segunda trama?

+3

como un punto de estilo, no hay necesidad de utilizar subtramas cuando solo tiene una gráfica por figura. – Autoplectic

Respuesta

95

Puede usar figure para crear una nueva gráfica, por ejemplo, o usar close después del primer diagrama.

+7

¡Genial! ¡Gracias! Me resulta difícil encontrar lo que necesito en el formato de documentación actual. La página de pyplot es muy larga y no pude ver la entrada de close() mientras se desplazaba. Estaba buscando algo como clean() clear() o flush(). –

+15

El tutorial de pyplot menciona clf() en la sección "figuras múltiples". Tenga en cuenta que si solo crea un nuevo trazado con figure() sin cerrar el 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. –

+3

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

130

Hay una orden clara figura, y debe hacerlo por usted:

plt.clf() 

Si tiene varias tramas secundarias en la misma figura

plt.cla() 

borra los ejes actuales.

+2

mucho para esto. Tenía gráficos de barras que estaban "sangrando" en gráficos posteriores. ¡Este comando funcionó perfectamente! – anon58192932

+1

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

+3

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

27

Según lo indicado por David Cournapeau, use la figura().

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 subtrama (121)/subtrama (122) para el mismo trazado, 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") 
12

Solo tienes que introducir plt.hold(False) antes de la primera plt.plot, y se puede cumplir con su código original.

+1

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

3

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

plt.show() 

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

0

Si ninguno de ellos funciona, verifique esto ... diga si tiene matrices xey de datos a lo largo del eje respectivo. Luego, compruebe en qué celda (jupyter) ha inicializado xey para vaciar. Esto se debe a que tal vez esté agregando datos a xey sin reinicializarlos. Entonces la trama también tiene datos viejos. Así que compruebe que ...

Cuestiones relacionadas