Анимация Matplotlib либо зависает через несколько кадров, либо просто не работает - PullRequest
6 голосов
/ 09 августа 2010

Я часами пытался заставить этот простой скрипт работать, но ничего, что я делаю, похоже, не помогает.Это небольшая модификация самого базового примера кода анимированного сюжета с сайта Matplotlib, который должен показывать только несколько кадров шума (у меня та же проблема с неизмененным кодом с их сайта BTW).

На моемкомпьютер с бэкэндом TkAgg Я получаю около 20 кадров (из 60), пока окно графика не замерзнет.С Qt4Agg я просто получаю замороженное черное окно, и никакие рамки вообще не отображаются.Я пробовал несколько комбинаций разных версий NumPy, PyQt, Python и Matplotlib, но всегда получал один и тот же результат.

Пожалуйста, дайте мне знать, если это работает для вас или если что-то выглядит неправильно.Я почти уверен, что это работало в прошлом, поэтому я думаю, что это может быть проблема с Windows или что-то, связанное с ion().

К вашему сведению, я использую Windows 7 (32-разрядную версию), и яПротестировано с Python 2.6 / 2.7, MPL 1.0.0 / 0.9.9.8, PyQt 4.6 / 4.7, Numpy 1.4 / 1.5b.

import matplotlib
matplotlib.use('TkAgg') # Qt4Agg gives an empty, black window
from pylab import *
import time

ion()
hold(False)

# create initial plot
z = zeros(10)
line, = plot(z)
ylim(-3, 3)

for i in range(60):
    print 'frame:', i

    d = randn(10)
    line.set_ydata(d)

    draw()
    time.sleep(10e-3)

Эта более простая версия также зависает после первой пары кадров:

from pylab import *

ion()
hold(False)

for i in range(40):
    plot(randn(10))
    draw()

show()

Спасибо!

РЕДАКТИРОВАТЬ : Эти люди, похоже, имеют ту же или похожую проблему, что и я:

  • mail-archive.com/matplotlib-users@lists.sourceforge.net/msg10844.html
  • stackoverflow.com / questions / 2604119 / matplotlib-pyplot-pylab-not-update-figure-while-isinteractive-using-ipython
  • mail-archive.com/matplotlib-users@lists.sourceforge.net/msg01283.html

Не похоже, что кто-либо из них смог это исправить либо :(

Ответы [ 7 ]

5 голосов
/ 09 августа 2010

Как правило, GUI-фреймворки должны «владеть» основным циклом программы. Пребывание в узком цикле с засыпанием для задержки итераций обычно «ломает» приложения с графическим интерфейсом (описание вашей проблемы соответствует типичному разрыву по этим направлениям). Вполне возможно, что разработчики matplotlib внедрили некоторую закулисную логику, чтобы предотвратить эти блокировки для определенных наборов инструментов, но небольшая реструктуризация вашей программы должна устранить любые шансы на владение mainloop, что является проблемой (что, как мне кажется, очень вероятно ). Matplotlib animation wiki также предлагает использовать собственные циклы событий для чего-то нетривиального (вероятно, по этой причине)

Вместо того, чтобы сидеть в цикле со сном, я предлагаю вместо этого использовать инструментарий GUI для планирования вызова функции после определенной задержки.

def update_function():
    # do frame calculation here

refresh_timer = QtCore.QTimer()
QtCore.QObject.connect( refresh_timer, QtCore.SIGNAL('timeout()'), update_function )
refresh_timer.start( 1.0 / 30 ) # have update_function called at 30Hz

Глядя на документацию по matplotlib, можно предположить, что можно использовать их API изначально, но я не смог найти хороших примеров с помощью простого поиска.

1 голос
/ 02 октября 2014

вызов time.sleep () или plt.pause () вызывает мерцание в окне графика при использовании блитинга, но я получил хорошие результаты, просто вызвав цикл событий явно:

1 голос
/ 13 августа 2013

У меня была (как мне кажется) та же проблема, когда окно зависало, если я убрал фокус или попытался перетащить его, используя Python 2.7 в Windows 7 с Matplotlib 1.3 и бэкэнд TKAgg.У меня был вызов time.sleep (1) в моем основном цикле while, и когда я заменил его на plt.pause (1), это решило проблему.Итак, попробуйте использовать функцию паузы в matplotlib, а не функцию спящего модуля времени, у меня это сработало.

1 голос
/ 08 сентября 2010

После многих часов борьбы с этой же проблемой, я думаю, я нашел ответ: Чтобы сделать эти простые анимации с помощью matplotlib, вы можете только использовать GTKAgg backend . Это указано в мимолетном замечании в scipy cookbook , но я думаю, что это следует подчеркнуть более четко. Когда я использую его, я могу запустить анимацию до конца без зависаний или каких-либо других проблем.

Помните, что для использования этого бэкэнда вам необходимо установить PyGTK. Я не знаю, что еще вам нужно в Windows (потому что я в Linux), но это кажется минимумом. Кроме того, если вы хотите использовать его по умолчанию, вам нужно добавить эту строку в ваш matplotlibrc (в Linux он находится в ~ / .matplotlib / matplotlibrc):

backend      : GTKAgg

Чтобы использовать другие бэкэнды, вам нужно следовать официальным примерам matplotlib , но это означает, что вам нужно создать приложение для мини-графического интерфейса, чтобы запустить простую анимацию, и я нахожу это довольно ужасным! 1014 *

1 голос
/ 17 августа 2010

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

1 голос
/ 09 августа 2010

Когда вы говорите, что зависает после первой пары кадров, вы имеете в виду 2 или 3, или, скажем, 40 или 60, поскольку это верхние пределы вашего цикла?

Если вы хотите, чтобы анимация продолжаласьбесконечно вам нужно что-то вроде

while True:
    d = randn(10)
    line.set_ydata(d)
    draw()
    time.sleep(10e-3)

Но вам придется принудительно завершать свою программу.

0 голосов
/ 29 июня 2012

Я долго боролся с этой же проблемой.Я бы посоветовал взглянуть на этот пример: http://matplotlib.sourceforge.net/examples/animation/strip_chart_demo.html

Я думал, что точно следую этому примеру, но он не работает.Это только запустит функцию «обновления» один раз.Оказывается, единственная разница в моем коде заключалась в том, что animation.FuncAnimation() не был присвоен переменной.Как только я присвоил значение, возвращаемое animation.FuncAnimation(), все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...