我正在尝试生成随时间变化的networkx图形的动画。我正在使用networkx_draw实用程序来创建图形的matplotlib图形,而matplotlib的ArtistAnimation模块则用于创建来自艺术家networkx的动画。我已经对我在这里所做的事情进行了最低限度的再现:
import numpy as np
import networkx as nx
import matplotlib.animation as animation
import matplotlib.pyplot as plt
# Instantiate the graph model
G = nx.Graph()
G.add_edge(1, 2)
# Keep track of highest node ID
G.maxNode = 2
fig = plt.figure()
nx.draw(G)
ims = []
for timeStep in xrange(10):
G.add_edge(G.maxNode,G.maxNode+1)
G.maxNode += 1
pos = nx.drawing.spring_layout(G)
nodes = nx.drawing.draw_networkx_nodes(G, pos)
lines = nx.drawing.draw_networkx_edges(G, pos)
ims.append((nodes,lines,))
plt.pause(.2)
plt.cla()
im_ani = animation.ArtistAnimation(fig, ims, interval=200, repeat_delay=3000,blit=True)
im_ani.save('im.mp4', metadata={'artist':'Guido'})
该过程在实时显示数字时工作正常,它可以生成我想要的动画。它甚至在脚本末尾的图形中产生循环动画,这也是我想要的,这表明动画过程有效。但是,当我打开保存到磁盘的“im.mp4”文件时,它是一个空白的白色图像,运行预期的时间段,从不显示任何实时显示的图形图像。
我正在使用networkx版本1.11和matplotlib版本2.0。我正在使用ffmpeg作为动画,我在Mac OSX 10.12.3上运行。
我做错了什么?
答案 0 :(得分:0)
简短的回答:如果你不想要一个空动画,不要清除轴!即删除行plt.cla()
。然后,您还应该删除初始nx.draw(G)
,因为这不会添加到ims
数组中,否则会在动画的每个帧中保留。
在这个问题中可以找到原因和更长的解释,
Matplotlib video creation,处理类似案件。
缺点当然是当你移除plt.cla()
时,你最终会在屏幕上出现拥挤的动画;所以你需要决定是否在屏幕上进行绘图或是否保存在前面。