web-dev-qa-db-fra.com

Fermer les figurines préexistantes dans matplotlib lors de l'exécution d'éclipse

Ma question est simple: j'ai un script python qui génère des chiffres à l'aide de matplotlib. Chaque fois que je l'exécute, il génère de nouvelles fenêtres avec des chiffres. Comment puis-je faire en sorte que le script ferme les fenêtres qui ont été ouvertes précédemment le temps a-t-il fonctionné?

la commande analogue dans matlab est de mettre "fermer tout" au début de votre script matlab.

J'ai vu plusieurs suggestions pour faire quelque chose comme

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

Cette solution fonctionne si vous exécutez votre script à partir du shell python, par exemple, en utilisant

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

Cependant, j'ai constaté que cela ne fonctionnait pas si j'exécutais le script avec Eclipse/PyDev. Comment puis-je le faire fonctionner dans Eclipse?

exemple:

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

Cela devrait tracer les formes d'onde idéales pour une alimentation triphasée de Nice.

61
AnjoMan

Vous pouvez fermer une figure en appelant matplotlib.pyplot.close, Par exemple:

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)

Vous pouvez également fermer toutes les figures ouvertes en appelant matplotlib.pyplot.close("all")

77
Bi Rico

Voir la réponse de Bi Rico pour le cas général Eclipse.

Pour quiconque - comme moi - qui atterrit ici parce que vous avez beaucoup de fenêtres et que vous avez du mal à les fermer toutes, il suffit de tuer python peut être efficace, selon votre situation. Il fonctionne probablement sous presque toutes les circonstances - y compris avec Eclipse.

Je viens de générer 60 parcelles d’emacs (je préfère cela à Eclipse), puis j’ai pensé que mon script s’était terminé. L'exécution de close('all') dans ma fenêtre ipython ne fonctionnait pas car les tracés ne provenaient pas d'ipython. Je me suis donc tourné vers la recherche de l'exécution python processus.

Lorsque j’ai tué l’interprète exécutant le script, les 60 parcelles ont toutes été fermées - par exemple,

$ 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

Notez que je n'ai pas tué mon ipython/pylab, ni le gestionnaire de mise à jour (tuer le gestionnaire de mise à jour est probablement une mauvaise idée) ...

3
sage

Cela supprimera non seulement toutes les fenêtres de tracé, mais également tous les processus appelés python3, à l'exception du script en cours que vous exécutez. Cela fonctionne pour python3. Donc, si vous utilisez un autre script python3, il sera terminé. Comme je n’exécute qu’un seul script à la fois, le travail est fait pour moi.

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'])
0
Vitor Abella