2010-04-08 8 views
16

Hay muchas preguntas sobre matplotlib, pylab, pyplot, ipython, así que lamento si está cansado de ver esto. Trataré de ser lo más específico posible, porque he estado revisando las preguntas de las personas y mirando la documentación de pyplot y pylab, y todavía no estoy seguro de lo que estoy haciendo mal. Activado con el código:matplotlib.pyplot/pylab no actualizando figure while isinteractive(), usando ipython -pylab

Objetivo: trazar una figura cada 0,5 segundos y actualizar la figura tan pronto como se llame al comando de trazado.

Mi intento de codificar esta siguiente (que se ejecuta en -pylab ipython):

 

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' 
 

correctamente parcelas cada línea, pero no hasta que haya salido el bucle. He intentado forzar un rediseño poniendo draw() donde está **, pero eso tampoco parece funcionar. Idealmente, me gustaría que simplemente agregue cada línea, en lugar de hacer un redibujado completo. Sin embargo, si se necesita volver a dibujar, está bien.

intentos adicionales de problemas:
justo después ion(), añadiendo hold(True) trataron en vano.
por diversión trataron show() para **
La respuesta más cercana que he encontrado lo que estoy tratando de hacer estaba en plotting lines without blocking execution, pero show() no está haciendo nada.

Pido disculpas si se trata de una solicitud directa, y estoy buscando algo tan obvio. Por lo que vale, esto surgió cuando estaba tratando de convertir el código matlab de la clase a una python para mi propio uso. El MATLAB originales (inicializaciones eliminados) que he estado tratando de convertir la siguiente manera:


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 

Cualquier ayuda, incluso si es sólo "mirar hacia arriba this_method" sería excelente, así que al menos se puede reducir mis esfuerzos a averiguar cómo usar ese método. Si hay más información que sería útil, házmelo saber.

+1

[Debe usar 'pyplot.pause' en lugar de' time.sleep'.] (Http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1- 1-and-updating-of-the-plot-while-the-pro) –

+0

Tuve el mismo problema al utilizar el backend QT4Agg en Windows, creo que está relacionado con este [problema github] (https://github.com/matplotlib/matplotlib/issues/1646), usando pyplot.pause() lo arregló. – seumas

Respuesta

10

La segunda respuesta a la pregunta que ha vinculado proporciona la respuesta: llame al draw() después de cada plot() para que aparezca inmediatamente; por ejemplo:

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) 

Si eso no funciona ... tratan de lo que hacen en esta página: 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) 

La página se menciona que la función line.set_ydata() es la parte clave.

+2

Por alguna razón, esto no funciona para mí. No tengo dudas de que es correcto, no estoy seguro de por qué no funciona para mí. Tan pronto como el primero se imprime, veo una ventana en blanco por 10 segundos; después de lo cual aparecen todos los gráficos. Pero dibujar() no parece forzar una actualización hasta que esté fuera del ciclo for. Acabo de empezar (intentando) usar matplotlib, ¿podría estar relacionado con el "back-end" del que me he enterado? (No tengo idea de qué es = /) – NumberOverZero

+1

@NumberOverZero - ¿qué plataforma estás usando? (Windows/Mac/Linux ...) –

+0

Vista Ult 64, Python 2.6.2 – NumberOverZero

0

Por favor, consulte el answer He publicado aquí una pregunta similar. Podría generar su animación sin problemas utilizando solo el backend GTKAgg GTKAgg. Para ello, es necesario añadir esta línea a su script (creo que antes de importar pylab):

matplotlib.use('GTkAgg') 

y también se instala PyGTK.

4

tenía exactamente el mismo problema con ipython ejecutándose en mi mac. (Enthought Distribución de python 2.7 32bit en Macbook pro corriendo leopardo de las nieves).

Recibí un consejo de un amigo en el trabajo.Ejecutar ipython de la terminal con los siguientes argumentos:

"ipython -wthread -pylab"

Esto funciona para mí. El código python anterior de "Daniel G" se ejecuta sin incidentes, mientras que anteriormente no actualizaba la trama.

De acuerdo con la documentación de ipython: "[-gthread, -qthread, -q4thread, -wthread, -pylab: ...] Proporcionan soporte de subprocesamiento para los kits de herramientas GTK, Qt (versiones 3 y 4) y WXPython, y para la biblioteca matplotlib ". No sé por qué eso es importante, pero funciona.

esperanza de que es útil, labjunky

+1

esta bandera de "hebra" resolvió un problema similar para mí, con ventanas de figura que se cierran al cerrar. ¡Gracias! – wim

+0

lamentablemente, "wthread" fue [eliminado en ipython 0.11] (http://ipython.org/ipython-doc/stable/interactive/reference.html#eventloop-integration). ¿Hay alguna otra manera de hacer que esto funcione? –

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() 
#

Lo anterior funcionó muy bien para mí. Lo ejecuté en el editor de spyder en pythonxy2.7.3 bajo Win7 OS. Observe la instrucción pause() seguida de draw() seguida de ioff() y show().

+0

No había nada trabajando para mí (también en ganar 7) hasta que agregué la pausa (declaración). GRACIAS –

Cuestiones relacionadas