ti-enxame.com

Feche figuras pré-existentes no matplotlib ao executar a partir do eclipse

Minha pergunta é simples: eu tenho um script python que gera figuras usando o matplotlib. Toda vez que eu executo isso gera novas janelas com figuras. Como posso fazer com que o script feche as janelas que foram abertas na última vez que ele foi executado?

o comando análogo no matlab é colocar 'close all' no início do seu script matlab.

Eu vi várias sugestões para fazer algo como

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

Esta solução funciona se você executar seu script a partir de python Shell, por exemplo, usando

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

No entanto, descobri que isso não funciona se eu executar o script usando o Eclipse/PyDev. Como posso fazê-lo funcionar no Eclipse?

exemplo:

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

Isso deve plotar as formas de onda ideais para uma fonte de alimentação trifásica agradável.

59
AnjoMan

Você pode fechar uma figura chamando matplotlib.pyplot.close, por exemplo:

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)

Você também pode fechar todos os números abertos chamando matplotlib.pyplot.close("all")

75
Bi Rico

Veja a resposta de Bi Rico para o caso geral do Eclipse.

Para qualquer um - como eu - que chega aqui porque você tem muitas janelas e está com dificuldades para fechá-las, apenas matar python pode ser efetivo, dependendo das circunstâncias. Provavelmente funciona sob quase todas as circunstâncias - inclusive com o Eclipse.

Eu acabei de gerar 60 parcelas de emacs (eu prefiro isso para Eclipse) e então eu pensei que meu script tinha saído. A execução de close('all') na minha janela do ipython não funcionou para mim porque as plotagens não vieram do ipython, então eu procurei executar processos python.

Quando matei o intérprete que estava executando o roteiro, todas as 60 parcelas foram fechadas - por exemplo,

$ 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

Note que eu não matei meu ipython/pylab, nem matei o gerenciador de atualização (matar o gerenciador de atualização é provavelmente uma má idéia) ...

3
sage

Ele matará não apenas todas as janelas de plotagem, mas todos os processos que são chamados python3, exceto o script atual que você executa. Ele funciona para python3. Portanto, se você estiver executando qualquer outro script python3, ele será finalizado. Como eu só executo um script de uma só vez, faz o trabalho para mim.

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