Kiedy używać cla (), clf () lub close () do czyszczenia wykresu w matplotlib?

540

Matplotlib oferuje tam funkcje:

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

Dokumentacja nie oferuje dużego wglądu w różnicę między tymi funkcjami. Kiedy powinienem korzystać z każdej funkcji i co ona dokładnie robi?

Southoz
źródło

Odpowiedzi:

713

Wszystkie robią różne rzeczy, ponieważ matplotlib używa hierarchicznej kolejności, w której okno figury zawiera figurę, która może składać się z wielu osi. Dodatkowo istnieją funkcje z interfejsu pyplot i istnieją metody w Figureklasie. Omówię oba przypadki poniżej.

interfejs pyplot

pyplotto moduł, który zbiera kilka funkcji, które umożliwiają funkcjonalne użycie matplotlib. Zakładam, że pyplotzostał zaimportowany jako import matplotlib.pyplot as plt. W tym przypadku istnieją trzy różne polecenia, które usuwają rzeczy:

plt.cla()kasuje osie , tj. aktualnie aktywne osie na bieżącej figurze. Pozostawia pozostałe osie nietknięte.

plt.clf()usuwa całą bieżącą liczbę ze wszystkimi osiami, ale pozostawia otwarte okno, dzięki czemu można go ponownie wykorzystać na innych działkach.

plt.close()zamyka okno , które będzie bieżącym oknem, jeśli nie zostanie określone inaczej.

To, które funkcje najbardziej Ci odpowiadają, zależy od Twojego przypadku użycia.

close()Ponadto funkcja pozwala określić, które okna powinny być zamknięte. Argumentem może być liczba lub nazwa nadana oknu, gdy zostało utworzone za pomocą, figure(number_or_name)lub może być figotrzymana instancja figury , tj fig = figure(). Za pomocą . Jeśli nie podano argumentu close(), aktualnie aktywne okno zostanie zamknięte. Ponadto istnieje składnia close('all'), która zamyka wszystkie liczby.

metody klasy Figure

Dodatkowo Figureklasa zapewnia metody kasowania liczb. Przyjmę, że figjest to instancja Figure:

fig.clf()usuwa całą figurę . To połączenie jest równoważne plt.clf()tylko wtedy, gdy figjest to bieżąca liczba.

fig.clear() jest synonimem fig.clf()

Zauważ, że nawet del fignie zamknie powiązanego okna figury. O ile mi wiadomo, jedynym sposobem zamknięcia okna figury jest użycie plt.close(fig)opisanego powyżej.

David Zwicker
źródło
38
Ponieważ close()jest to niespecyficzne polecenie, szukałem sposobu na określenie zamknięcia figury ( fig.close()nie jest funkcją). Poprawna składnia jest następująca: plt.close(fig).
tyleha
co więcej clear(), nie widziałem dużej różnicy, tyle cla()że tylko w osiach pasożytów cla()traktowane są specjalnie.
dashy
1
Nie ma żadnej clear()funkcji w moim matplotlib.pyplot(wersja 1.4.2 na MacOS). Czy możesz skierować mnie do powiązanej dokumentacji?
David Zwicker
2
Zarówno klasa Figure, jak i Axes mają clear()metodę. Figure.clearRównoważne clfi Axes.clearjest odpowiednikiem cla.
SiggyF,
2
Czy to działa w odniesieniu do jupyter? Ciągle uderzam w błędy pamięci, ponieważ dane nie są zbierane podczas ponownego uruchamiania komórki w jupyter.
CMCDragonkai
79

Jest tylko zastrzeżenie, które dzisiaj odkryłem. Jeśli masz funkcję, która często wywołuje fabułę, lepiej użyj jej plt.close(fig)zamiast w fig.clf()jakiś sposób pierwsza nie gromadzi się w pamięci. Krótko mówiąc, jeśli chodzi o pamięć, użyj plt.close (rys.) (Chociaż wydaje się, że są lepsze sposoby, przejdź do końca tego komentarza, aby znaleźć odpowiednie linki).

Poniższy skrypt wygeneruje pustą listę:

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

Podczas gdy ta utworzy listę z pięcioma cyframi.

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

Z powyższej dokumentacji nie jest dla mnie jasne, jaka jest różnica między zamknięciem figury a zamknięciem okna. Może to wyjaśni.

Jeśli chcesz wypróbować kompletny skrypt, masz:

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

Jeśli problem dotyczy pamięci, ktoś już opublikował obejście w SO. Zobacz: Utwórz liczbę, która jest liczona jako referencja

Ramon Martinez
źródło
26
Dziękujemy za pomocne odsyłacz do pytania liczącego odniesienia. Dokładnie tak powinien już działać Matplotlib . Równie przerażające i przerażające jest to, że dane nigdy nie są zbierane w ramach standardowego pyplotinterfejsu API.
Cecil Curry
1
Niemniej jednak odkryłem, że jeśli trzeba tworzyć animacje (na przykład niektóre mapy konturowe / pcolormesh), lepiej jest wyczyścić figurę i narysować nowe pola zamiast zamykać stare i tworzyć nowe panele figur. Prędkość będzie zupełnie inna.
msi_gerva