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