Подтвердить что ты не робот

Закройте уже существующие фигуры в matplotlib при работе от затмения

Мой вопрос прост: у меня есть python script, который генерирует цифры, используя matplotlib. Каждый раз, когда я запускаю его, он генерирует новые окна с цифрами. Как я могу открыть окна закрытия script, которые были открыты в предыдущий раз?

аналогичная команда в Matlab должна поставить "закрыть все" в начале вашего matlab script.

Я видел несколько предложений сделать что-то вроде

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

Это решение работает, если вы запустите свой script из оболочки python, например, используя

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

Однако я обнаружил, что это не работает, если я запускаю script с помощью Eclipse/PyDev. Как я могу заставить его работать в Eclipse?

Пример:

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

Это должно построить идеальные сигналы для хорошего 3-фазного источника питания.

4b9b3361

Ответ 1

Вы можете закрыть фигуру, вызвав 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)

Вы также можете закрыть все открытые цифры, вызвав matplotlib.pyplot.close("all")

Ответ 2

См. ответ Bi Rico для общего дела Eclipse.

Для кого-либо, такого как я, - который приземляется здесь, потому что у вас много окон, и вы изо всех сил пытаетесь закрыть их, просто убить питона может быть эффективно, в зависимости от ваших обстоятельств. Вероятно, он работает практически в любых обстоятельствах, в том числе с Eclipse.

Я только породил 60 графиков из emacs (я предпочитаю, чтобы затмить), а затем я думал, что мой script вышел. Запуск close('all') в моем окне ipython не работал у меня, потому что графики не исходили из ipython, поэтому я прибегал к поиску запущенных процессов python.

Когда я убил интерпретатора, запускавшего script, тогда все 60 графиков были закрыты - например,

$ 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

Обратите внимание, что я не убивал мой ipython/pylab и не убивал диспетчера обновлений (убийство менеджера обновлений, вероятно, плохая идея)...

Ответ 3

Это убьет не только все окна графиков, но и все процессы, которые называются python3, кроме текущего скрипта, который вы запускаете. Это работает для python3. Итак, если вы запускаете любой другой скрипт на python3, он будет прерван. Поскольку я запускаю только один скрипт одновременно, он делает всю работу за меня.

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'])