Закройте уже существующие фигуры в 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-фазного источника питания.
Ответы
Ответ 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'])