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

person Eric O Lebigot    schedule 25.05.2011    source источник
comment
Я думаю, вам нужно позвонить pp.show(), а не pp.draw() там.   -  person Thomas K    schedule 26.05.2011
comment
@Thomas K: цель состоит в том, чтобы программа ждала, пока пользователь наберет ввод, поэтому show() исключено.   -  person Eric O Lebigot    schedule 26.05.2011
comment
Насколько я знаю, интерактивный режим — единственный способ добиться этого. Но я не эксперт - вы можете спросить в списке рассылки пользователей matplotlib.   -  person Thomas K    schedule 26.05.2011


Ответы (2)


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

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

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

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

person Eric O Lebigot    schedule 22.06.2011
comment
Не могли бы вы объяснить, как использовать axe так, чтобы его понял начинающий пользователь matplotlib? - person AturSams; 14.03.2014
comment
ax в объекте Axes: это, по сути, прямоугольник (или круг) с координатами (таким образом, фигура может содержать много осей). На практике объект Axes возвращается, когда вы создаете оси на фигуре. Таким образом, вы обычно получаете Оси с такими командами, как: fig = pyplot.figure(); ax = fig.add_subplot(111) и fig, (ax_scatter, ax_log_hist) = pyplot.subplots(1, 2). - person Eric O Lebigot; 15.03.2014
comment
@EricOLebigot, ссылка на ветку мертва - person ComputerScientist; 16.01.2019

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

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

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

С наилучшими пожеланиями.

person ahelm    schedule 25.05.2011
comment
Мне также не удалось найти подходящий ответ в списке рассылки пользователя matplotlib. Я только что разместил там новое сообщение. Спасибо за предложение. - person Eric O Lebigot; 29.05.2011
comment
PS: Вот ветка: старая .nabble.com/. Я подведу итоги интересного обсуждения, которое у нас там состоялось, как только получу подтверждение по некоторым пунктам. - person Eric O Lebigot; 01.06.2011