2013-02-21 10 views
43

Moje pytanie jest proste: Mam skrypt Pythona, który generuje dane przy użyciu matplotlib. Za każdym razem, gdy go uruchamiam, generuje nowe okna z liczbami. Jak mogę zamknąć okno, które zostało otwarte po poprzednim uruchomieniu skryptu?Zamknij wcześniej istniejących liczb w matplotlib podczas uruchamiania z Eclipse

Analogiczne polecenie w Matlab polega na umieszczeniu "close all" na początku skryptu matlab.

Widziałem kilka sugestii, aby zrobić coś takiego

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

to rozwiązanie działa, jeśli uruchomić skrypt z powłoki Python, na przykład za pomocą

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

Mam jednak okazało się, że to nie robi działa, jeśli uruchomię skrypt za pomocą Eclipse/PyDev. Jak mogę go uruchomić w Eclipse?

przykład:

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

Należy wykreślić idealne przebiegi na miły 3-fazowym zasilaniem.

Odpowiedz

56

Można zamknąć figurę wywołując matplotlib.pyplot.close, na przykład:

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) 

Można również zamknąć wszystkie otwarte dane wywołując odpowiedź matplotlib.pyplot.close("all")

+2

Działa to z poziomu konsoli (np. "uruchamia" >> execfile ("script.py") w powłoce Pythona), ale nie w Eclipse/PyDev. Jaka jest różnica? – AnjoMan

+0

Nice. Dodaj losowy wektor do cos (w * t-4 * pi/3) dla szumu. – Andrew

+4

@AjjoMan dlaczego zaakceptowałeś tę odpowiedź? wyraźnie nie odpowiada na twoje pytanie. – dbliss

3

Zobacz Bi Rico dla przypadku ogólnego Eclipse.

Dla każdego - jak ja - który ląduje tutaj, ponieważ masz dużo okien i starasz się je wszystkie zamknąć, po prostu zabicie Pythona może być skuteczne, w zależności od okoliczności. Prawdopodobnie działa prawie w każdych okolicznościach - w tym w Eclipse.

Zrobiłem tylko 60 działek od emacs (wolę to do zaćmienia) i wtedy myślałem, że mój skrypt się zakończył. Uruchomienie close('all') w moim oknie ipython nie zadziałało, ponieważ działki nie pochodziły z ipython, więc uciekłem się do uruchamiania procesów Pythona.

Kiedy zabił tłumacza uruchomieniem skryptu, a następnie wszystkie 60 Działki zostały zamknięte - np

$ 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 

Zauważ, że nie zabiłem mojego ipython/pylab, ani nie zabiję menedżera aktualizacji (zabijanie menedżer aktualizacji jest prawdopodobnie złym pomysłem) ...

+0

+1 Miałem podobne problemy przy użyciu PyCharm, kluczowym punktem dla mnie było zabicie procesu Pythona, który jest wywoływany przez edytor PyCharm i odgadywanie w innych Emacs/Eclipse/PyDev. W PyCharm jest to kliknięcie czerwonego "X" w dolnym oknie. – shev72