2010-04-08 3 views
16

Есть много вопросов о matplotlib, pylab, pyplot, ipython, так что я сожалею, если вам стало больно видеть это. Я постараюсь быть настолько конкретным, насколько могу, потому что я просматривал вопросы людей и смотрел документацию на pyplot и pylab, и я до сих пор не уверен, что я делаю неправильно. Вкл. С кодом:matplotlib.pyplot/pylab не обновляет фигуру while isinteractive(), используя ipython -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' 
 

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

Дополнительные попытки решения:
сразу после ion(), попытался добавить hold(True) безрезультатно.
для пинков попытался show() для **
Ближайший ответ я нашел то, что я пытаюсь сделать, это в plotting lines without blocking execution, но 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 

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

+1

[Вы должны использовать 'pyplot.pause', а не' time.sleep'.] (Http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1- 1-and-update-of-the-plot-while-the-pro) –

+0

У меня была такая же проблема с использованием бэкэнда QT4Agg в Windows, я считаю, что он связан с этой проблемой [github] (https://github.com/matplotlib/matplotlib/issues/1646), используя pyplot.pause() исправил его. – seumas

ответ

10

Второй ответ на вопрос, который вы связываете, дает ответ: звоните 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

По какой-то причине это не работает для меня. Я не сомневаюсь, что это правильно, я просто не знаю, почему это не работает для меня. Как только первый печатает, я вижу пустое окно в течение 10 секунд; после чего появятся все графики. Но draw(), похоже, не форсирует обновление, пока он не вышел из цикла for. Я только начал (пытаюсь) использовать matplotlib - может ли это быть связано с «бэкэндом», о котором я слышал? (Я понятия не имею, что это такое = /) – NumberOverZero

+1

@NumberOverZero - на какой платформе вы используете? (Windows/Mac/Linux ...) –

+0

Vista Ult 64, Python 2.6.2 – NumberOverZero

0

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

matplotlib.use('GTkAgg') 

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

4

имел ту же самую проблему с 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

+1

этот -wthread flag исправил аналогичную проблему для меня, с закрытием фигурных окон на закрытии. спасибо! – wim

+0

sadly -wthread был удален в ipython 0.11 (http://ipython.org/ipython-doc/stable/interactive/reference.html#eventloop-integration). Есть ли другой способ заставить это работать? –

10
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().

+0

Ничего не было работая для меня (также на выигрыше 7), пока не добавит паузу (заявление). СПАСИБО –

Смежные вопросы