Wie sage ich matplotlib, dass ich mit einer Handlung fertig bin?


164

Der folgende Code wird in zwei PostScript- Dateien (.ps) dargestellt, die zweite enthält jedoch beide Zeilen.

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

Wie kann ich matplotlib anweisen, für die zweite Handlung neu zu beginnen?


3
Als Stilpunkt ist es nicht erforderlich, eine Nebenhandlung zu verwenden, wenn Sie nur eine Handlung pro Figur haben.
Autoplektischer

Antworten:


122

Sie können figurebeispielsweise ein neues Diagramm erstellen oder closenach dem ersten Diagramm verwenden.


19
Das Pyplot-Tutorial erwähnt clf () im Abschnitt "Mehrere Figuren". Beachten Sie, dass Pyplot einen Verweis auf Ihre alte Figur beibehält, wenn Sie nur ein neues Diagramm mit figure () erstellen, ohne das alte mit close () zu schließen (auch wenn Sie das GUI-Fenster schließen), was wie ein Speicherverlust aussehen kann.
Jouni K. Seppänen

5
Sie können plt.close () / pylab.close () verwenden, um alle alten Zahlen zu entfernen
Calvin1602

1
Meinst du nach der ersten Handlung danach plt.savefig("first.ps")?
Sigur

@ JouniK.Seppänen Um Ihren Kommentar zu ergänzen, warnt Python Sie standardmäßig, wenn Sie viele Abbildungen öffnen: "RuntimeWarning: Es wurden mehr als 20 Abbildungen geöffnet."
rph

173

Es gibt einen eindeutigen Zahlenbefehl, der für Sie ausgeführt werden sollte:

plt.clf()

Wenn Sie mehrere Nebenhandlungen in derselben Abbildung haben

plt.cla()

löscht die aktuellen Achsen.


1
Vielen Dank! Wenn Sie das PDF-Backend verwenden (mit dem Sie mehrere Diagramme speichern können), müssen Sie dies nach jedem Aufruf von plt.save ()
Ben DeMott

4
In meinem Fall war plt.clf () ausreichend, um die Zahl zu löschen, aber nicht ausreichend, um Speicherverluste zu stoppen, aber der erste Aufruf von plt.close () stoppte den Speicherverlust. Python 2.7, matplotlib 1.1.1rc1 (Ubuntu 12.04). Zu Ihrer Information.
DJDuff

29

Verwenden Sie, wie von David Cournapeau angegeben, Abbildung ().

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

Oder Teilplot (121) / Unterplot (122) für denselben Plot, unterschiedliche Position.

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
Sie sollten immer noch verwenden plt.clf(), Zahlen werden im Speicher gehalten, bis sie explizit geschlossen werden
kaveish

13

plt.hold(False)Geben Sie einfach vor dem ersten plt.plot ein und Sie können sich an Ihren ursprünglichen Code halten.


6
In matplotlib == 2.0.2 wird folgende Meldung angezeigt: MatplotlibDeprecationWarning: pyplot.hold ist veraltet.
Jonathan

12

Wenn Sie Matplotlib interaktiv verwenden, beispielsweise in einer Webanwendung (z. B. Ipython), nach der Sie möglicherweise suchen

plt.show()

anstelle von plt.close()oder plt.clf().


Sie haben mir nur eine Menge Zeit gespart, die ich nicht verlieren musste
Reabow

1

Wenn keiner von ihnen funktioniert, überprüfen Sie dies. Sagen Sie, ob Sie x- und y-Datenfelder entlang der jeweiligen Achse haben. Überprüfen Sie dann, in welcher Zelle (Jupiter) Sie x und y zum Leeren initialisiert haben. Dies liegt daran, dass Sie möglicherweise Daten an x ​​und y anhängen, ohne sie neu zu initialisieren. Die Handlung enthält also auch alte Daten. Also überprüfe das ..

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.