Точная семантика "интерактивного режима" Матплотлиба (ion(), ioff())?
Документация для "интерактивного режима" в pyplot Matplotlib гласит:
Интерактивное свойство интерфейса pyplot определяет, будет ли отображаться холст фигуры в каждой команде pyplot. Если интерактивный имеет значение False, то состояние фигуры обновляется при каждой команде заговора, но будет отображаться только при явных вызовах draw(). Если для параметра Interactive установлено значение True, каждая команда pyplot запускает отрисовку.
Это кажется достаточно ясным: когда интерактивный режим включен, можно plot()
без необходимости делать draw()
, Однако выполнение draw () в следующем коде ничего не делает:
from matplotlib import pyplot as pp
# Interactive mode is off by default
pp.plot([10, 20, 50])
pp.draw()
raw_input('Press enter...') # No graph displayed?!!
(в Windows XP, Matplotlib 1.0.1).
Добавление ion()
в начале заставляет появляться фигуры, ожидая, пока пользователь наберет ввод (что удобно закрывает все фигуры):
from matplotlib import pyplot as pp
ion()
pp.plot([10, 20, 50]) # No draw() is necessary
raw_input('Press enter...') # The graph is interactive *and* the terminal responds to enter
Таким образом, это выглядит как ion()
делает больше, чем просто добавляет автоматические обновления графиков после каждой команды построения, и я, к сожалению, не могу найти ничего в документации. Другая, более важная проблема с последней программой заключается в том, что ion()
заставляет все команды построения графика обновлять график, что занимает много времени, когда один график обновляется несколько раз.
Итак, есть ли способ:
- заставив терминал ждать ввода, после чего все цифры автоматически закрываются,
- имея интерактивные графики Matplotlib,
- … Без принудительного включения интерактивного режима в начале (чтобы не вызывать автоматическое обновление графиков, что может занять много времени)?
2 ответа
Вот краткое изложение интересной дискуссии на эту тему в списке рассылки Matplotlib. Исполнительное резюме:
Интерактивный режим (активируется с помощью
ion()
) автоматизирует многие вещи. Особенно,pyplot.*
Команды автоматически обновляют на экране соответствующие оси. Однако метод вызывает объекты Matplotlib, такие какax.plot()
(ax
будучи объектом Axes), обычно не выполняют автоматические обновления; в этом случае,pyplot.draw()
выполняет необходимое обновление.)Неинтерактивный режим менее удобен.
draw()
обычно не обновляет фигуру на экране. Дело в том, чтоdraw()
Несколько "неактивен" в неинтерактивном режиме, не упоминается в текущей документации, но, будем надеяться, скоро будет там включен.
В то же время, дополнительную информацию об интерактивных и неинтерактивных режимах можно найти в текущей ветке Matplotlib. Лучшая документация для draw()
, show()
и друзья тоже можно найти в той же ветке.
Я бы посоветовал вам следовать последнему комментарию "Томас К.". Я помню похожий вопрос в списке рассылки, но не смог найти его после нескольких минут поиска. Сожалею.
У меня была и эта проблема, и лучший способ для меня был / должен использовать ipython --pylab
, У меня установлена более старая версия matplotlib, у которой есть проблемы с ion()
, Помимо этого, у matplotlib также были некоторые проблемы с draw()
на винде. Возможно, это было исправлено в последних версиях.
PS: Извините, что я не смог вам помочь очень хорошо.
С наилучшими пожеланиями.