Введение
Как я исхожу из 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()
.