Jak powiedzieć matplotlib, że skończyłem z fabułą?


166

Poniższy kod drukuje do dwóch plików PostScript (.ps), ale drugi zawiera oba wiersze.

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

Jak mogę powiedzieć matplotlib, aby zaczął od nowa dla drugiego wykresu?


3
jako punkt stylu nie ma potrzeby używania wykresu podrzędnego, jeśli masz tylko jeden wykres na figurę.
— Autoplectic

Odpowiedzi:


124

Możesz użyć figurena przykład do utworzenia nowego wykresu lub użyć closepo pierwszym wydruku.


19
Samouczek dotyczący pyplota wspomina o clf () w sekcji „wiele figurek”. Zauważ, że jeśli po prostu utworzysz nowy wykres z figure () bez zamykania starego za pomocą close () (nawet jeśli zamkniesz okno GUI), pyplot zachowa odniesienie do twojej starej figury, która może wyglądać jak wyciek pamięci.
— Jouni K. Seppänen

5
Możesz użyć plt.close () / pylab.close (), aby usunąć wszystkie stare dane
— Calvin1602,

1
Po pierwszym spisku, masz na myśli po plt.savefig("first.ps")?
— Sigur

@ JouniK.Seppänen Aby dodać komentarz, Python domyślnie ostrzeże Cię, jeśli otworzysz wiele liczb: „RuntimeWarning: Otwarto ponad 20 figurek.”.
— rph

173

Istnieje wyraźne polecenie dotyczące postaci i powinno to zrobić za Ciebie:

plt.clf()

Jeśli masz wiele działek pomocniczych na tej samej figurze

plt.cla()

czyści bieżące osie.


1
Dzięki! Jeśli korzystasz z zaplecza PDF (który pozwala na zapisanie wielu wykresów), będziesz musiał wywoływać to po każdym wywołaniu plt.save ()
— Ben DeMott

4
W moim przypadku plt.clf () wystarczyło do wyczyszczenia figury, ale niewystarczające do zatrzymania wycieków pamięci, ale najpierw wywołanie plt.close () zatrzymało wyciek pamięci. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.
— DJDuff,

29

Jak podano od Davida Cournapeau, użyj figury ().

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

Lub działka (121) / działka (122) dla tego samego wykresu, w innej pozycji.

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
powinieneś nadal używać plt.clf(), liczby są przechowywane w pamięci do momentu jawnego zamknięcia
— kaveish

13

Po prostu wpisz plt.hold(False)przed pierwszym plt.plot i możesz trzymać się oryginalnego kodu.


6
w matplotlib == 2.0.2, pojawia się następujący komunikat: MatplotlibDeprecationWarning: pyplot.hold jest przestarzały.
— Jonathan,

12

Jeśli używasz Matplotlib interaktywnie, na przykład w aplikacji internetowej (np. Ipython), być może szukasz

plt.show()

zamiast plt.close()lub plt.clf().


właśnie zaoszczędziłeś mi trochę czasu, którego nie musiałem tracić
— powtórz

1

Jeśli żaden z nich nie działa, sprawdź to ... powiedz, czy masz tablice danych xiy wzdłuż odpowiedniej osi. Następnie sprawdź, w której komórce (jupyter) zainicjowałeś x i y do opróżnienia. Dzieje się tak, ponieważ być może dołączasz dane do x i y bez ich ponownej inicjalizacji. Więc fabuła też ma stare dane. Więc sprawdź to ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.