Quando usare cla (), clf () o close () per cancellare un grafico in matplotlib?


542

Matplotlib offre lì funzioni:

cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window

La documentazione non offre molte informazioni su quale sia la differenza tra queste funzioni. Quando dovrei usare ciascuna funzione e cosa fa esattamente?

Risposte:


714

Fanno tutti cose diverse, dal momento che matplotlib usa un ordine gerarchico in cui una finestra di figura contiene una figura che può essere composta da molti assi. Inoltre, ci sono funzioni dall'interfaccia pyplot e ci sono metodi sulla Figureclasse. Discuterò entrambi i casi di seguito.

interfaccia pyplot

pyplotè un modulo che raccoglie un paio di funzioni che consentono di utilizzare matplotlib in modo funzionale. Suppongo che pyplotsia stato importato come import matplotlib.pyplot as plt. In questo caso, ci sono tre diversi comandi che rimuovono le cose:

plt.cla()cancella un asse , ovvero gli assi attualmente attivi nella figura corrente. Lascia intatti gli altri assi.

plt.clf()cancella l'intera figura corrente con tutti i suoi assi, ma lascia aperta la finestra, in modo che possa essere riutilizzata per altri grafici.

plt.close()chiude una finestra , che sarà la finestra corrente, se non diversamente specificato.

Le funzioni più adatte a te dipendono quindi dal tuo caso d'uso.

La close()funzione consente inoltre di specificare quale finestra deve essere chiusa. L'argomento può essere un numero o un nome dato a una finestra quando è stato creato usando figure(number_or_name)oppure può essere un'istanza di figura figottenuta, cioè usando fig = figure(). Se non viene fornito alcun argomento close(), la finestra attualmente attiva verrà chiusa. Inoltre, c'è la sintassi close('all'), che chiude tutte le cifre.

metodi della classe Figure

Inoltre, la Figureclasse fornisce metodi per cancellare le figure. Presumo in seguito che figsia un'istanza di a Figure:

fig.clf()cancella l'intera figura . Questa chiamata equivale a plt.clf()solo se figè la cifra corrente.

fig.clear() è sinonimo di fig.clf()

Si noti che anche del fignon chiuderà la finestra della figura associata. Per quanto ne so, l'unico modo per chiudere una finestra di figura è usare plt.close(fig)come descritto sopra.


38
Perché close()è un comando non specifico, sono andato alla ricerca di un modo per specificare la chiusura della figura ( fig.close()non è una funzione). La sintassi corretta è: plt.close(fig).
tyleha,

che dire clear(), non ho visto molta differenza con cla()solo che negli assi del parassita cla()è trattata appositamente.
dashesy

1
Non esiste alcuna clear()funzione in my matplotlib.pyplot(versione 1.4.2 su MacOS). Potresti indirizzarmi alla documentazione associata?
David Zwicker,

2
Sia la classe Figure che la classe Axes hanno un clear()metodo. L' Figure.clearequivalente a clfed Axes.clearè equivalente a cla.
SiggyF,

2
Funziona con Jupyter? Continuo a colpire errori di memoria perché le figure non vengono raccolte quando si esegue nuovamente una cella in jupyter.
CMCDragonkai

79

C'è solo un avvertimento che ho scoperto oggi. Se hai una funzione che chiama molte volte una trama, è meglio usarla plt.close(fig)invece che in fig.clf()qualche modo la prima non si accumula in memoria. In breve, se la memoria è un problema, utilizzare plt.close (fig) (anche se sembra che ci siano modi migliori, andare alla fine di questo commento per i collegamenti pertinenti).

Quindi il seguente script produrrà un elenco vuoto:

for i in range(5):
    fig = plot_figure()
    plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums())

Considerando che questo produrrà un elenco con cinque cifre su di esso.

for i in range(5):
    fig = plot_figure()
    fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums())

Dalla documentazione sopra non mi è chiaro quale sia la differenza tra la chiusura di una figura e la chiusura di una finestra. Forse questo chiarirà.

Se vuoi provare uno script completo lì hai:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1000)
y = np.sin(x)

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    plt.close(fig)

print(plt.get_fignums())

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    fig.clf()

print(plt.get_fignums())

Se la memoria è un problema, qualcuno ha già pubblicato una soluzione in SO, vedere: Creare una figura contata come riferimento


26
Grazie per l'utile riferimento incrociato alla domanda di conteggio dei riferimenti. È esattamente come Matplotlib dovrebbe già funzionare. È ugualmente terrificante e spaventoso il fatto che le cifre non vengano mai spazzate via pyplotnell'API standard .
Cecil Curry,

1
Tuttavia, ho scoperto che se si devono realizzare animazioni (ad esempio alcune mappe di contorno / pcolormesh 2D) è meglio cancellare la figura e disegnare nuovi campi invece di chiudere vecchi e creare nuovi pannelli di figure. La velocità sarà completamente diversa.
msi_gerva,

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.