Schließen Sie bereits vorhandene Figuren in matplotlib, wenn Sie vor Eclipse laufen

68

Meine Frage ist einfach: Ich habe ein Python-Skript, das mit matplotlib Zahlen generiert. Jedes Mal, wenn ich es starte, werden neue Fenster mit Zahlen generiert. Wie kann ich das Skript Fenster schließen lassen, die beim letzten Ausführen geöffnet wurden?

Der analoge Befehl in matlab besteht darin, 'close all' am Anfang Ihres matlab-Skripts zu setzen.

Ich habe mehrere Vorschläge gesehen, um so etwas zu tun

import matplotlib.pyplot as plt
plt.close("all")

Diese Lösung funktioniert, wenn Sie Ihr Skript über die Python-Shell ausführen, z

>>>> execfile("myScript.py")

Ich habe jedoch festgestellt, dass dies nicht funktioniert, wenn ich das Skript mit Eclipse / PyDev ausführe. Wie kann ich es in Eclipse zum Laufen bringen?

Beispiel:

from numpy import *
from matplotlib.pyplot import *
from scipy import *

close("all") 
    #close any previously open plots - this doesn't work when running via Eclipse

t = linspace(0, 0.1,1000)
w = 60*2*pi

figure()
plot(t,cos(w*t))
plot(t,cos(w*t-2*pi/3))
plot(t,cos(w*t-4*pi/3))
show()

Dies sollte die idealen Wellenformen für eine schöne 3-Phasen-Stromversorgung darstellen.

AnjoMan
quelle

Antworten:

87

Sie können eine Figur schließen, indem Sie beispielsweise Folgendes aufrufen matplotlib.pyplot.close:

from numpy import *
import matplotlib.pyplot as plt
from scipy import *

t = linspace(0, 0.1,1000)
w = 60*2*pi


fig = plt.figure()
plt.plot(t,cos(w*t))
plt.plot(t,cos(w*t-2*pi/3))
plt.plot(t,cos(w*t-4*pi/3))
plt.show()
plt.close(fig)

Sie können auch alle offenen Zahlen schließen, indem Sie anrufen matplotlib.pyplot.close("all")

Bi Rico
quelle
3
Dies funktioniert von einer Konsole aus (z. B. Ausführen von '>>> execfile ("script.py")' in der Python-Shell), jedoch nicht in Eclipse / PyDev. Was ist der Unterschied?
AnjoMan
Nett. Fügen Sie cos (w * t-4 * pi / 3) einen Zufallsvektor für Rauschen hinzu.
Andrew
8
@AnjoMan warum hast du diese Antwort akzeptiert? es beantwortet Ihre Frage eindeutig nicht.
Dbliss
5
@dbliss Ich kann mich ehrlich gesagt nicht erinnern. Ich denke, die Art und Weise, wie ich dieses Problem gelöst habe, war "Eclipse nicht verwenden".
AnjoMan
3

Siehe Bi Ricos Antwort für den allgemeinen Fall Eclipse.

Für jeden - wie mich - der hier landet, weil Sie viele Fenster haben und Schwierigkeiten haben, alle zu schließen, kann es abhängig von Ihren Umständen effektiv sein, nur Python zu töten. Es funktioniert wahrscheinlich unter fast allen Umständen - auch mit Eclipse.

Ich habe gerade 60 Plots von Emacs erzeugt (ich bevorzuge das Eclipse) und dann dachte ich, mein Skript wäre beendet worden. Das Ausführen close('all')in meinem Ipython-Fenster funktionierte bei mir nicht, da die Plots nicht von Ipython stammten. Daher suchte ich nach laufenden Python-Prozessen.

Als ich den Interpreter tötete, der das Skript ausführte, waren alle 60 Handlungen geschlossen - z.

$ ps aux | grep python
rsage    11665  0.1  0.6 649904 109692 ?       SNl  10:54   0:03 /usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-map
rsage    12111  0.9  0.5 390956 88212 pts/30   Sl+  11:08   0:17 /usr/bin/python /usr/bin/ipython -pylab
rsage    12410 31.8  2.4 576640 406304 pts/33  Sl+  11:38   0:06 python3 ../plot_motor_data.py
rsage    12431  0.0  0.0   8860   648 pts/32   S+   11:38   0:00 grep python

$ kill 12410

Beachten Sie, dass ich weder mein Ipython / Pylab noch den Update-Manager beendet habe (das Beenden des Update-Managers ist wahrscheinlich eine schlechte Idee) ...

Salbei
quelle
+1 Ich hatte ähnliche Probleme mit PyCharm. Der wichtigste Punkt für mich war, den Python-Prozess zu beenden, der vom PyCharm-Editor erzeugt wird, und in anderen Emacs / Eclipse / PyDev zu raten. In PyCharm klicken Sie einfach auf das rote "X" im unteren Fenster.
Shelbypereira
0

Es werden nicht nur alle Plotfenster, sondern alle Prozesse mit dem Namen python3 beendet, mit Ausnahme des aktuellen Skripts, das Sie ausführen. Es funktioniert für Python3. Wenn Sie also ein anderes Python3-Skript ausführen, wird es beendet. Da ich nur ein Skript gleichzeitig ausführe, erledigt es den Job für mich.

import os
import subprocess
subprocess.call(["bash","-c",'pyIDs=($(pgrep python3));for x in "${pyIDs[@]}"; do if [ "$x" -ne '+str(os.getpid())+' ];then  kill -9 "$x"; fi done'])
Vitor Abella
quelle
-1

In meinem Fall funktioniert mit den obigen Skripten nichts, aber ich konnte diese Zahlen über die Eclipse-Konsolenleiste schließen, indem ich auf ALLE beenden (Symbol mit zwei roten verschachtelten Quadraten) klickte.

Ibraheem
quelle
Lesen Sie die Frage sorgfältig durch. Der Autor fragt nach einer Möglichkeit, das Skript zu schließen. > Wie kann ich das Skript Fenster schließen lassen, die beim letzten Ausführen geöffnet wurden?
Liastre
Du kannst nicht. Ich denke, die Person, die die Frage gestellt hat, muss diese Fenster schließen, ohne die Sonnenfinsternis zu schließen.
Ibraheem