Animación basada solo en la actualización de colores en una ttwig.

Tengo una ttwig que consta de gran número de líneas. En cada paso, los colores de las líneas deben actualizarse en la animación, pero hacer un bucle for en las líneas parece ser realmente costoso. ¿Hay alguna manera mejor de hacerlo?

Aquí está mi código:

import numpy as np lines=[] from matplotlib import pyplot as plt import matplotlib.animation as animation #initial plot fig=plt.figure() ax=plt.subplot(1,1,1) for i in range(10): lines.append([]) for j in range(10): lines[i].append(ax.plot([i,j],color='0.8')) lines=np.asarray(lines) ##Updating the colors 10 times im=[] for steps in range(10): colors=np.random.random(size=(10,10)) for i in range(10): for j in range(10): lines[i,j][0].set_color(str(colors[i,j])) plt.draw() # im.append(ax) plt.pause(.1) #ani = animation.ArtistAnimation(fig, im, interval=1000, blit=True,repeat_delay=1000) plt.show() 

Además no pude trabajar con el artista de animación! Utilicé dibujar. ¿Qué hay de malo con las líneas de animación?

Ahora, boost esos 10 a 100 hace que el progtwig sea terriblemente lento:

 import numpy as np lines=[] from matplotlib import pyplot as plt import matplotlib.animation as animation #initial plot fig=plt.figure() ax=plt.subplot(1,1,1) for i in range(100): lines.append([]) for j in range(100): lines[i].append(ax.plot([i,j],color='0.8')) lines=np.asarray(lines) ##Updating the colors 10 times im=[] for steps in range(10): colors=np.random.random(size=(100,100)) for i in range(100): for j in range(100): lines[i,j][0].set_color(str(colors[i,j])) plt.draw() # im.append(ax) plt.pause(.1) #ani = animation.ArtistAnimation(fig, im, interval=1000, blit=True,repeat_delay=1000) plt.show() 

Como dije antes, quiero correrlo junto a una animación. Por eso prefiero que sea una animación. Creo que eso resolvería el problema de retraso al menos después de que comience la animación, pero ahora, tal como lo definí, no funciona.

Es más fácil usar un LineCollection para esto. De esa manera, puede configurar todos los colores como una sola matriz y, en general, obtener un rendimiento de dibujo mucho mejor.

El mejor rendimiento se debe principalmente a que las colecciones son una forma optimizada de dibujar muchos objetos similares en matplotlib. Evitar los bucles nesteds para establecer los colores es realmente secundario en este caso.

Con eso en mente, intente algo más en esta línea:

 import numpy as np from matplotlib import pyplot as plt from matplotlib.collections import LineCollection import matplotlib.animation as animation lines=[] for i in range(10): for j in range(10): lines.append([(0, i), (1, j)]) fig, ax = plt.subplots() colors = np.random.random(len(lines)) col = LineCollection(lines, array=colors, cmap=plt.cm.gray) ax.add_collection(col) ax.autoscale() def update(i): colors = np.random.random(len(lines)) col.set_array(colors) return col, # Setting this to a very short update interval to show rapid drawing. # 25ms would be more reasonable than 1ms. ani = animation.FuncAnimation(fig, update, interval=1, blit=True, init_func=lambda: [col]) # Some matplotlib versions explictly need an `init_func` to display properly... # Ideally we'd fully initialize the plot inside it. For simplicitly, we'll just # return the artist so that `FuncAnimation` knows what to draw. plt.show() 

introduzca la descripción de la imagen aquí

Si desea acelerar un bucle for, hay varias buenas maneras de hacerlo. El mejor para lo que estás tratando de hacer, las expresiones generadoras, es probablemente así:

 iterator = (.upper() for  in ) 

(Para obtener información más específica sobre estos, hay documentación en http://www.python.org/dev/peps/pep-0289/ y https://wiki.python.org/moin/Generators )

También hay otras formas de actualización de color que no son para bucles, pero es poco probable que sean más rápidas que un generador. Podría crear algún tipo de grupo para las líneas y llamar a algo como:

 lines.update() 

en todos ellos