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

Matplotlib.pyplot/pylab не обновляет фигуру while isinteractive(), используя ipython -pylab

Есть много вопросов о matplotlib, pylab, pyplot, ipython, так что извините, если вам надоело видеть, как это спрашивается. Я постараюсь быть настолько конкретным, насколько могу, потому что я просматривал вопросы людей и смотрел документацию на pyplot и pylab, и я до сих пор не уверен, что я делаю неправильно. Включить с кодом:

Цель: нарисуйте фигуру каждые 0,5 секунды и обновите фигуру, как только вызывается команда plot.

Моя попытка кодирования этого следует (выполняется на ipython -pylab):


import time
ion()
x=linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    #see **
    print i
    time.sleep(1)
print 'Done'

Он правильно отображает каждую строку, но не до выхода из цикла for. Я попытался сделать перерисовку, поставив draw() где **, но это тоже не работает. В идеале, я бы хотел, чтобы он просто добавлял каждую строку, а не выполнял полную перерисовку. Если требуется повторная перерисовка, это прекрасно.

Дополнительные попытки решения:
сразу после ion(), попробовал добавить hold(True) безрезультатно.
для ударов пробовал show() для ** Самый близкий ответ, который я нашел, что я пытаюсь сделать, - это построение строк без блокировки выполнения, но show() ничего не делает.

Извиняюсь, если это простой запрос, и я смотрю мимо чего-то столь очевидного. Для чего это стоит, это произошло, когда я пытался преобразовать код matlab из класса в некоторый python для моего собственного использования. Исходный matlab (удаленные инициализации), который я пытался преобразовать, следует:


for i=1:time
    plot(u)
    hold on
    pause(.01)
    for j=2:n-1
        v(j)=u(j)-2*u(j-1)
    end
    v(1)= pi
    u=v
end

Любая помощь, даже если она просто "ищет этот метод", будет отличной, поэтому я могу хотя бы сузить свои усилия, чтобы понять, как использовать этот метод. Если у вас будет больше информации, которая была бы полезной, сообщите мне.

4b9b3361

Ответ 1

Второй ответ на связанный с вами вопрос дает ответ: вызовите draw() после каждого plot(), чтобы он появился немедленно; например:

import time
ion()
x = linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    # make it appear immediately
    draw()
    time.sleep(1)

Если это не сработает... попробуйте, что они делают на этой странице: http://www.scipy.org/Cookbook/Matplotlib/Animations

import time

ion()

tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas

print 'FPS:' , 200/(time.time()-tstart)

На странице указано, что функция line.set_ydata() является ключевой частью.

Ответ 2

from pylab import *
import time
ion()
tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas
    pause(0.01)
print 'FPS:' , 200/(time.time()-tstart)
ioff()
show()
#

Выше работало для меня красиво. Я запустил его в редакторе spyder в pythonxy2.7.3 под win7 OS. Обратите внимание на инструкцию pause() после draw(), за которой следуют ioff() и show().

Ответ 3

имел ту же самую проблему с ipython, запущенным на моем mac. (Enthought Распределение python 2.7 32bit на Macbook pro работает с снежным барсом).

Получил отзыв от друга на работе. Запустите ipython из терминала со следующими аргументами:

"ipython -wthread -pylab"

Это работает для меня. Вышеупомянутый код Python от "Daniel G" работает без инцидентов, тогда как ранее он не обновлял график.

В соответствии с документацией на ipython: "[-gthread, -qthread, -q4thread, -wthread, -pylab:...] Они обеспечивают поддержку потоков для наборов GTK, Qt (версии 3 и 4) и WXPython и для библиотеки matplotlib." Я не знаю, почему это важно, но оно работает.

надеюсь, что это полезно, labjunky

Ответ 4

См. ответ . Я разместил здесь аналогичный вопрос. Я мог бы генерировать анимацию без проблем, используя только GTKAgg. Для этого вам нужно добавить эту строку в свой script (я думаю, перед импортом pylab):

matplotlib.use('GTkAgg')

а также установить PyGTK.