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?

Stefano Borini
źródło
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.

David Cournapeau
źródło
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.

randlet
źródło
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")
lmount
źródło
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.

Dirklinux
źródło
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().

Damo
źródło
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 ...

Seenivasan
źródło