Точная семантика "интерактивного режима" Матплотлиба (ion (), ioff ())? - PullRequest
21 голосов
/ 26 мая 2011

Документация по «интерактивному режиму» в pyplot Matplotlib гласит:

Интерактивное свойство интерфейса pyplot определяет, рисуется ли холст фигуры при каждой команде pyplot.Если интерактивный имеет значение False, то состояние фигуры обновляется при каждой команде заговора, но будет отображаться только при явных вызовах draw ().Когда интерактив имеет значение 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 ]

15 голосов
/ 23 июня 2011

Вот краткое изложение интересного обсуждения на эту тему в списке рассылки Matplotlib. Краткое содержание:

  • Интерактивный режим (активируется с помощью ion()) автоматизирует многие вещи. В частности, команды pyplot.* автоматически обновляют на экране соответствующие оси. Однако вызовы методов для объектов Matplotlib, таких как ax.plot() (ax является объектом Axes), обычно не выполняют автоматическое обновление; в этом случае pyplot.draw() выполняет необходимое обновление.)

  • Неинтерактивный режим менее удобен. draw() не не обычно обновляет фигуру на экране. Тот факт, что draw() несколько «неактивен» в неинтерактивном режиме, не упоминается в текущей документации, но, будем надеяться, скоро будет там включен.

В то же время, дополнительную информацию об интерактивных и неинтерактивных режимах можно найти в текущей ветке Matplotlib. Лучшую документацию для draw(), show() и друзей также можно найти в той же ветке.

4 голосов
/ 26 мая 2011

Я бы посоветовал вам следовать последнему комментарию «Томас К.». Я помню похожий вопрос в списке рассылки, но не смог найти его после нескольких минут поиска. К сожалению.

У меня тоже была эта проблема, и лучший способ был для меня - использовать ipython --pylab. У меня установлена ​​более старая версия matplotlib, у которой есть проблемы с ion(). Помимо этого, у matplotlib также были некоторые проблемы с draw() в Windows. Возможно, это было исправлено в последних версиях.

p.s .: Извините, что я не мог помочь вам очень хорошо.

С уважением.

...