Come faccio a dire a matplotlib che ho finito con una trama?


166

Il codice seguente stampa su due file PostScript (.ps), ma il secondo contiene entrambe le righe.

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 la seconda trama?


3
come punto di stile, non è necessario utilizzare la trama secondaria quando si dispone di una sola trama per figura.
Autoplettico,

Risposte:


124

È possibile utilizzare figureper creare una nuova trama, ad esempio, o utilizzare closedopo la prima trama.


19
Il tutorial di pyplot menziona clf () nella sezione "figure multiple". Nota che se crei semplicemente un nuovo grafico con figure () senza chiudere quello vecchio con close () (anche se chiudi la finestra della GUI), pyplot mantiene un riferimento alla tua vecchia figura, che potrebbe apparire come una perdita di memoria.
Jouni K. Seppänen,

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

1
Dopo la prima trama, vuoi dire dopo plt.savefig("first.ps")?
Sigur,

@ JouniK.Seppänen Solo per aggiungere al tuo commento, Python ti avviserà di default se apri molte figure: "RuntimeWarning: sono state aperte più di 20 cifre".
rph

173

C'è un comando di figura chiara, e dovrebbe farlo per te:

plt.clf()

Se hai più sottotrame nella stessa figura

plt.cla()

cancella gli assi correnti.


1
Grazie! Se stai usando il backend PDF (che ti consente di salvare più grafici) dovrai chiamarlo dopo ogni chiamata a plt.save ()
Ben DeMott

4
Nel mio caso, plt.clf () è stato sufficiente per cancellare la cifra ma insufficiente per fermare le perdite di memoria, ma prima chiamare plt.close () ha fermato la perdita di memoria. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.
DJDuff,

29

Come affermato da David Cournapeau, usa 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")

Oppure subplot (121) / subplot (122) per lo stesso diagramma, 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")

3
dovresti ancora usare plt.clf(), le figure sono conservate in memoria fino a quando non vengono esplicitamente chiuse
kaveish,

13

Basta inserire plt.hold(False)prima del primo plt.plot e puoi attenersi al codice originale.


6
in matplotlib == 2.0.2, ricevo questo messaggio: MatplotlibDeprecationWarning: pyplot.hold è obsoleto.
Jonathan,

12

Se stai utilizzando Matplotlib in modo interattivo, ad esempio in un'applicazione Web, (ad esempio ipython) che forse stai cercando

plt.show()

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


mi hai appena risparmiato un sacco di tempo che non ho dovuto perdere
reabow

1

Se nessuno di loro funziona, controllare questo .. dire se si dispone di matrici di dati xey lungo il rispettivo asse. Quindi controlla in quale cella (jupyter) hai inizializzato xey per svuotare. Questo perché, forse stai aggiungendo dati a xey senza reinizializzarli. Quindi anche la trama ha vecchi dati. Quindi controlla che ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.