Введение
Как я исхожу из matlab, Я привык к интерактивному интерфейсу, где script может обновлять цифры во время работы. Во время обработки каждая цифра может быть изменена или даже закрыта. Вероятно, это означает, что каждая фигура работает в своем собственном потоке, что, очевидно, не относится к matplotlib.
IPython может имитировать поведение Matlab с помощью волшебной команды %pylab или %matplotlib, которая делает то, что я еще не понимаю, и что является самой точкой моего вопроса.
Моя цель заключается в том, чтобы позволить автономным скриптам Python работать, как это делает Matlab (или как IPython с %matplotlib). Другими словами, я хотел бы, чтобы этот script выполнялся из командной строки. Я ожидаю появления новой фигуры каждые 3 секунды. Во время выполнения я мог бы увеличить, изменить размер или даже закрыть фигуру.
#!/usr/bin/python
import matplotlib.pyplot as plt
import time
def do_some_work():
time.sleep(3)
for i in range(10):
plt.plot([1,2,3,4])
plt.show() # this is way too boilerplate, I'd like to avoid it too.
do_some_work()
Какую альтернативу
%matplotlibя могу использовать для управления фигурами, а script работает в Python (не IPython)?
Какие решения я уже исследовал?
В настоящее время я нашел 3 способа получить сюжетное шоу.
1. %pylab/%matplotlib
Как tom, следует избегать использования %pylab, чтобы предотвратить загрязнение пространства имен.
>>> %pylab
>>> plot([1,2,3,4])
Это решение сладко, график не блокируется, нет необходимости в дополнительном show(), я могу добавить сетку с grid() после этого, и я могу закрыть, изменить размер или увеличить масштаб фигуры без дополнительные проблемы.
К сожалению, команда %matplotlib доступна только на IPython.
2. from pylab import * или from matplotlib.pyplot import plt
>>> from pylab import *
>>> plot([1,2,3,4])
Здесь все совсем другое. Мне нужно добавить команду show(), чтобы отобразить мою фигуру, которая блокирует. Я не могу ничего сделать, кроме закрытия фигуры, чтобы выполнить следующую команду, такую как grid(), которая не будет иметь никакого эффекта, поскольку фигура теперь закрыта...
** 3. from pylab import * или from matplotlib.pyplot import plt + ion() **
В некоторых предложениях рекомендуется использовать команду ion() следующим образом:
>>> from pylab import *
>>> ion()
>>> plot([1,2,3,4])
>>> draw()
>>> pause(0.0001)
К сожалению, даже если график показывает, я не могу закрыть фигуру вручную. Мне нужно выполнить close() на терминале, что не очень удобно. Кроме того, необходимость в двух дополнительных командах, таких как draw(); pause(0.0001), не то, что я ожидаю.
Резюме
С %pylab все замечательно, но я не могу использовать его за пределами IPython
С from pylab import *, за которым следует plot, я получаю поведение блокировки, и вся мощность IPython теряется.
from pylab import *, за которым следует ion, предлагает хорошую альтернативу предыдущей, но я должен использовать команду weird pause(0.0001), которая приводит к тому, что я не могу закрыть окно вручную (я знаю, что pause не нужен с некоторыми backend.Я использую WxAgg, который является единственным, который хорошо работает на Cygwin x64.
В этом question рекомендуется использовать matplotlib.interactive(True). К сожалению, он не работает и дает то же поведение, что и ion().