Usando NetworkX con matplotlib.ArtistAnimation

Lo que quiero hacer es crear una animación en la que los nodos de un gráfico cambien de color con el tiempo. Cuando busco información sobre animación en matplotlib, generalmente veo ejemplos que se parecen a esto:

#!/usr/bin/python import numpy as np import matplotlib import matplotlib.pyplot as plt from matplotlib.animation import ArtistAnimation fig = plt.figure(figsize=(8,8)) images = [] for i in range(10): data = np.random.random(100).reshape(10,10) imgplot = plt.imshow(data) images.append([imgplot]) anim = ArtistAnimation(fig, images, interval=50, blit=True) anim.save('this-one-works.mp4') plt.show() 

Así que pensé que podía hacer algo como esto:

 #!/usr/bin/python import numpy as np import networkx as nx import matplotlib import matplotlib.pyplot as plt from matplotlib.animation import ArtistAnimation G = nx.Graph() G.add_edges_from([(0,1),(1,2),(2,0)]) fig = plt.figure(figsize=(8,8)) pos=nx.graphviz_layout(G) images = [] for i in range(10): nc = np.random.random(3) imgplot = nx.draw(G,pos,with_labels=False,node_color=nc) # this doesn't work images.append([imgplot]) anim = ArtistAnimation(fig, images, interval=50, blit=True) anim.save('not-this-one.mp4') plt.show() 

En lo que estoy atascado es cómo, después de dibujar el gráfico con nx.draw (), puedo obtener un objeto del tipo apropiado para colocarlo en la matriz que se pasa a ArtistAnimation. En el primer ejemplo, plt.imshow () devuelve un objeto de tipo matplot.image.AxesImage, pero nx.draw () en realidad no devuelve nada. ¿Hay alguna manera de que pueda obtener un objeto de imagen adecuado?

Los enfoques completamente diferentes son bienvenidos, por supuesto (parece que siempre hay muchas formas diferentes de hacer lo mismo en matplotlib), siempre que pueda guardar mi animación como mp4 cuando termine.

¡Gracias!

–craig

 import numpy as np import networkx as nx import matplotlib import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation G = nx.Graph() G.add_edges_from([(0,1),(1,2),(2,0)]) fig = plt.figure(figsize=(8,8)) pos=nx.graphviz_layout(G) nc = np.random.random(3) nodes = nx.draw_networkx_nodes(G,pos,node_color=nc) edges = nx.draw_networkx_edges(G,pos) def update(n): nc = np.random.random(3) nodes.set_array(nc) return nodes, anim = FuncAnimation(fig, update, interval=50, blit=True) 

nx.draw no devuelve nada, por lo tanto, su método no funcionó. La forma más sencilla de hacer esto es dibujar los nodes y edges utilizando nx.draw_networkx_nodes y nx.draw_networkx_edges que devuelven los objetos PatchCollection y LineCollection . Luego puede actualizar el color de los nodos utilizando set_array .

Usando el mismo trabajo de marco general, también puede mover los nodos (a través de set_offsets para PatchCollection y set_verts o set_segments para LineCollection )

El mejor tutorial de animación que he visto: http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/