2009-04-12 9 views
113

Il seguente codice traccia due file PostScript (.ps), ma il secondo contiene entrambe le linee.Come faccio a dire a matplotlib che ho finito 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") 

Come posso dire a matplotlib di ricominciare da capo per il secondo grafico?

+3

come punto di riferimento, non è necessario utilizzare la sottotrama quando si dispone di un solo grafico per figura. – Autoplectic

risposta

95

È possibile utilizzare figure per creare un nuovo grafico, ad esempio, oppure utilizzare close dopo il primo grafico.

+7

Ottimo! Grazie! Trovo difficile trovare ciò di cui ho bisogno nel formato di documentazione corrente. La pagina di Pyplot è molto lunga e non ho potuto vedere la voce per close() durante lo scorrimento. Stavo cercando qualcosa come clean() clear() o flush(). –

+15

Il tutorial pyplot fa menzione clf() nella sezione "figure multiple". Si noti che se si crea un nuovo grafico con figure() senza chiudere quello vecchio con close() (anche se si chiude la finestra della GUI), pyplot conserva un riferimento alla vecchia figura, che può sembrare una perdita di memoria. –

+3

Puoi usare plt.close()/pylab.close() per rimuovere tutte le vecchie figure – Calvin1602

130

c'è un comando chiara figura, e dovrebbe farlo per voi:

plt.clf() 

Se si dispone di più sottotrame nella stessa figura

plt.cla() 

cancella gli assi attuali.

+2

tanto per questo. Avevo i grafici a barre che "sanguinavano" nei grafici successivi. Questo comando ha funzionato perfettamente !! – anon58192932

+1

Grazie! Se si utilizza il back-end PDF (che consente di salvare più trame) è necessario chiamare questo dopo ogni chiamata a plt.save() –

+3

Nel mio caso, plt.clf() è stato sufficiente per cancellare la figura ma insufficiente per interrompere la perdita di memoria, ma prima chiamare plt.close() ha interrotto la perdita di memoria. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI. –

27

Come dichiarato da David Cournapeau, utilizzare 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") 

Oppure sottotrama (121)/sottotrama (122) per lo stesso grafico, posizione diversa.

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

basta inserire plt.hold(False) prima della prima plt.plot, e si può attaccare al vostro codice originale.

+1

in matplotlib == 2.0.2, ottengo questo messaggio: MatplotlibDeprecationWarning: pyplot.hold è deprecato. – Jonathan

3

Se stai usando Matplotlib in modo interattivo, ad esempio in un'applicazione web, (per esempio ipython) si forse alla ricerca di

plt.show() 

invece di plt.close() o plt.clf().

0

Se nessuno di questi funziona, controllare questo .. dire se si dispone di array x e y di dati lungo il rispettivo asse. Quindi verifica in quale cella (jupyter) hai inizializzato xey per svuotare. Questo perché, forse stai aggiungendo dati a xey senza re-inizializzarli. Quindi la trama ha anche vecchi dati. Quindi verifica che ..