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.