Wann sollte cla (), clf () oder close () zum Löschen eines Diagramms in matplotlib verwendet werden?

541

Matplotlib bietet dort Funktionen:

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

Die Dokumentation bietet nicht viel Einblick in den Unterschied zwischen diesen Funktionen. Wann sollte ich jede Funktion verwenden und was genau macht sie?

Southoz
quelle

Antworten:

713

Sie alle machen unterschiedliche Dinge, da matplotlib eine hierarchische Reihenfolge verwendet, in der ein Figurenfenster eine Figur enthält, die aus vielen Achsen bestehen kann. Darüber hinaus gibt es Funktionen von der Pyplot-Schnittstelle und Methoden für die FigureKlasse. Ich werde beide Fälle unten diskutieren.

Pyplot-Schnittstelle

pyplotist ein Modul, das einige Funktionen sammelt, mit denen matplotlib auf funktionale Weise verwendet werden kann. Ich gehe hier davon aus, dass pyplotals importiert wurde import matplotlib.pyplot as plt. In diesem Fall gibt es drei verschiedene Befehle, mit denen Inhalte entfernt werden:

plt.cla()löscht eine Achse , dh die aktuell aktiven Achsen in der aktuellen Abbildung. Die anderen Achsen bleiben unberührt.

plt.clf()Löscht die gesamte aktuelle Figur mit all ihren Achsen, lässt jedoch das Fenster geöffnet, sodass es für andere Diagramme wiederverwendet werden kann.

plt.close()schließt ein Fenster , das das aktuelle Fenster ist, sofern nicht anders angegeben.

Welche Funktionen am besten zu Ihnen passen, hängt also von Ihrem Anwendungsfall ab.

Mit der close()Funktion kann außerdem festgelegt werden, welches Fenster geschlossen werden soll. Das Argument kann entweder eine Nummer oder ein Name sein, die einem Fenster beim Erstellen mit verwendet wurden, figure(number_or_name)oder es kann eine Figureninstanz sein, die figerhalten wurde, dh mit fig = figure(). Wenn kein Argument angegeben wird, close()wird das aktuell aktive Fenster geschlossen. Darüber hinaus gibt es die Syntax close('all'), die alle Zahlen schließt.

Methoden der Figure-Klasse

Darüber hinaus bietet die FigureKlasse Methoden zum Löschen von Zahlen. Ich gehe im Folgenden davon aus, dass figes sich um eine Instanz von a handelt Figure:

fig.clf()löscht die gesamte Figur . Dieser Aufruf entspricht plt.clf()nur dann, wenn figes sich um die aktuelle Zahl handelt.

fig.clear() ist ein Synonym für fig.clf()

Beachten Sie, dass del figdas zugehörige Figurenfenster nicht einmal geschlossen wird. Soweit ich weiß, kann ein Figurenfenster nur plt.close(fig)wie oben beschrieben geschlossen werden.

David Zwicker
quelle
38
Da close()es sich um einen unspezifischen Befehl handelt, habe ich nach einer Möglichkeit gesucht, das Schließen von Figuren anzugeben ( fig.close()ist keine Funktion). Die korrekte Syntax lautet : plt.close(fig).
Tyleha
Was ist mit clear(), ich habe keinen großen Unterschied gesehen, cla()nur dass nur in Parasitenäxten cla()speziell behandelt wird.
Bindestrich
1
Es gibt keine clear()Funktion in meinem matplotlib.pyplot(Version 1.4.2 unter MacOS). Könnten Sie mich auf die zugehörige Dokumentation verweisen?
David Zwicker
2
Sowohl die Figure- als auch die Axes-Klasse haben eine clear()Methode. Das Figure.clearÄquivalent zu clfund Axes.clearist äquivalent zu cla.
SiggyF
2
Funktioniert das in Bezug auf Jupiter? Ich treffe immer wieder auf Speicherfehler, weil Zahlen nicht als Müll gesammelt werden, wenn ich eine Zelle in Jupyter erneut ausführe.
CMCDragonkai
79

Es gibt nur eine Einschränkung, die ich heute entdeckt habe. Wenn Sie eine Funktion haben, die häufig einen Plot aufruft, verwenden Sie diese besser, plt.close(fig)anstatt fig.clf()dass sich die erste nicht im Speicher ansammelt. Kurz gesagt, wenn der Speicher ein Problem darstellt, verwenden Sie plt.close (Abb.) (Obwohl es anscheinend bessere Möglichkeiten gibt, finden Sie am Ende dieses Kommentars relevante Links).

Das folgende Skript erzeugt also eine leere Liste:

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

In diesem Fall wird eine Liste mit fünf Ziffern erstellt.

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

Aus der obigen Dokumentation ist mir nicht klar, was der Unterschied zwischen dem Schließen einer Figur und dem Schließen eines Fensters ist. Vielleicht wird das klarstellen.

Wenn Sie dort ein vollständiges Skript ausprobieren möchten, haben Sie:

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())

Wenn der Speicher ein Problem darstellt, hat bereits jemand eine Problemumgehung in SO veröffentlicht. Siehe: Erstellen Sie eine Zahl, die als Referenz gezählt wird

Ramon Martinez
quelle
26
Vielen Dank für den hilfreichen Querverweis auf die Frage zur Referenzzählung. Genau so sollte Matplotlib bereits funktionieren. Es ist ebenso erschreckend und entsetzlich, dass Zahlen niemals Müll sind, der unter der Standard- pyplotAPI gesammelt wird .
Cecil Curry
1
Trotzdem habe ich festgestellt, dass es besser ist, die Figur zu löschen und neue Felder zu zeichnen, wenn man Animationen machen muss (zum Beispiel einige 2D-Kontur- / Farbnetzkarten), als alte zu schließen und neue Figurentafeln zu erstellen. Die Geschwindigkeit wird völlig anders sein.
msi_gerva