¿Cómo puedo acelerar una animación?

Estoy tratando de crear una animación de Matplotlib de los datos de mi pata, donde se puede ver la distribución de la presión en toda la placa de presión a lo largo del tiempo (sensores 256×64 para 250 cuadros).

Encontré un ejemplo de trabajo en el propio sitio de Matplotlib y logré que funcionara con mis propios datos. Sin embargo, la ‘animación’ es muy lenta y no tengo idea de cómo acelerarla.

Aquí hay un ejemplo de un gif que Joe Kington hizo en otra respuesta , que es la velocidad con la que se muestra. Teniendo en cuenta que las mediciones se realizan a 125 Hz, esto hace que las mediciones parezcan muy lentas. Si se ejecutó a 30-60 fps, podría ejecutarse en 4 u 8 segundos en lugar de los 20+ actuales.

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

No me importa usar la herramienta que necesito para hacer el trabajo, siempre que haya una buena documentación para descubrir cómo hacerlo.

Entonces mi pregunta es: ¿cómo puedo acelerar estas animaciones?

He implementado la sugerencia de Ignacio de poner t.Start (1), sin embargo, solo se ejecuta “decentemente” cuando la figura es tan grande:

introduzca la descripción de la imagen aquí

class PlotFigure(Frame): """ This class draws a window and updates it with data from DataCollect """ def __init__(self): Frame.__init__(self, None, -1, "Test embedded wxFigure") #Varying the size of Figure has a big influence on the speed self.fig = Figure((3,3), 75) self.canvas = FigureCanvasWxAgg(self, -1, self.fig) EVT_TIMER(self, TIMER_ID, self.onTimer) def init_plot_data(self): self.datagen = DataCollect(array3d) self.axes = self.fig.add_subplot(111) self.axes.imshow(self.datagen.next().T) def onTimer(self, evt): self.data = self.datagen.next() self.axes.imshow(self.datagen.next().T) self.canvas.draw() 

Cuando redimensiono la ventana durante la animación, inmediatamente se reduce a un rastreo. Lo que me hace sospechar que el retraso no es la única causa de la desaceleración. ¿Alguna otra sugerencia? En caso de que tenga curiosidad, aquí hay un enlace a uno de los archivos ASCII.

Encontré la respuesta de Joe Kington que menciona usar Glumpy en su lugar. Al principio no pude hacer que funcionara con mis propios datos, pero con algo de ayuda en el chat, pudimos descubrir cómo adaptar uno de los ejemplos de Matplotlib que vienen con Glumpy para trabajar en mis datos.

 import numpy, glumpy from glumpy.pylab import * window = glumpy.Window(256,64) Z = data.astype(numpy.float32) t0, frames, t = 0,0,0 fig = plt.figure(figsize=(7,7)) ax = plt.subplot(111) ax = imshow(Z[:,:,0], origin='lower', interpolation='bilinear') show() window = glumpy.active_window() @window.event def on_idle(dt): global Z, t0, frames, t t += dt frames = frames + 1 if frames > 248: fps = float(frames)/(t-t0) print 'FPS: %.2f (%d frames in %.2f seconds)' % (fps, frames, t-t0) frames,t0 = 0, t for image, axis, alpha in items: image.data[...] = Z[:,:,frames] image.update() window.draw() window.mainloop() 

El resultado final se puede ver aquí, no importa lo grande que sea la ventana, funcionará a más de 58 fps. ¡Así que debo decir que estoy muy satisfecho con el resultado final!

introduzca la descripción de la imagen aquí

El valor pasado a wx.Timer.Start() es la tasa de activación en milisegundos. Pasar un valor menor.

Utilice un Perfilador para encontrar la causa raíz; la omisión de fotogtwigs también podría ser útil como último recurso.

O cambie a una solución alternativa como Double Buffering usando Device Contexts o PyOpenGL …