Подтвердить что ты не робот

Точная семантика "интерактивного режима" Matplotlib (ion(), ioff())?

Документация для "интерактивного режима" в 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,
  • ... без принудительного включения интерактивного режима в начале (чтобы не форсировать автоматическое обновление графиков, что может занять много времени)?
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

С уважением.