2009-04-12 9 views
113

Der folgende Code zeichnet zwei PostScript (.ps) Dateien, aber der zweite enthält beide Zeilen.Wie kann ich Matplotlib sagen, dass ich mit einer Handlung fertig bin?

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 sagen, um für die zweite Handlung neu zu beginnen?

+3

als ein Punkt des Stils, ist es nicht notwendig, Subplot zu verwenden, wenn Sie nur ein Diagramm pro Figur haben. – Autoplectic

Antwort

95

Sie können figure verwenden, um beispielsweise ein neues Diagramm zu erstellen oder nach dem ersten Diagramm close zu verwenden.

+7

Großartig! Vielen Dank! Ich finde es schwierig, im aktuellen Dokumentationsformat das zu finden, was ich brauche. Die pyplot-Seite ist sehr lang, und ich konnte den Eintrag für close() beim Scrollen nicht sehen. Ich suchte nach etwas wie clean() clear() oder flush(). –

+15

Das pyplot-Tutorial erwähnt clf() im Abschnitt "multiple figures". Wenn Sie nur ein neues Diagramm mit figure() erstellen, ohne das alte mit close() zu schließen (selbst wenn Sie das GUI-Fenster schließen), behält pyplot einen Verweis auf Ihre alte Figur, die wie ein Speicherleck aussieht. –

+3

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

130

Es gibt eine klare Figur Befehl, und es sollte es für Sie tun:

plt.clf() 

Wenn Sie mehrere Handlungsstränge in derselben Figur

plt.cla() 

löscht die aktuellen Achsen haben.

+2

ty so viel dafür. Ich hatte Balkendiagramme, die in nachfolgenden Graphen "bluten". Dieser Befehl hat perfekt funktioniert !! – anon58192932

+1

Danke! Wenn Sie das PDF-Backend benutzen (welches Ihnen erlaubt, mehrere Plots zu speichern), müssen Sie dies nach jedem Aufruf von plt.save() aufrufen. –

+3

In meinem Fall war plt.clf() ausreichend, um die Zahl zu löschen, aber nicht ausreichend stop Speicherlecks, aber zuerst Aufruf von plt.close() stoppte das Speicherleck. Python 2.7, Matplotlib 1.1.1rc1 (Ubuntu 12.04). FYI. –

27

Wie von David Cournapeau angegeben, verwenden Sie 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)/Teilplot (122) für das gleiche Diagramm, andere 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") 
12

Geben Sie plt.hold(False) vor dem ersten plt.plot, und Sie können zu Ihrem ursprünglichen Code halten.

+1

in Matplotlib == 2.0.2, bekomme ich diese Nachricht: MatplotlibDeprecationWarning: pyplot.hold ist veraltet. – Jonathan

3

Wenn Sie mit Matplotlib interaktiv, zum Beispiel in einer Web-Anwendung (z ipython) Sie vielleicht suchen

plt.show() 

statt plt.close() oder plt.clf().

0

Wenn keiner von ihnen funktioniert, dann überprüfen Sie dies .. sagen Sie, wenn Sie x und y Datenfelder entlang der jeweiligen Achse haben. Überprüfen Sie dann, in welcher Zelle (Jupyter) Sie x und y initialisiert haben, um sie zu leeren. Das liegt daran, dass Sie möglicherweise Daten an x ​​und y anhängen, ohne sie erneut zu initialisieren. Also Plot hat auch alte Daten. Überprüfen Sie also, dass ..