我想创建一个动画,以显示网络结构如何随时间变化。我正在使用matplotlib以及networkx。我无法使以下玩具示例正常工作。
假设我有一个图,它仅是一条线中连接的四个节点。我希望动画执行以下操作:第一帧应该显示整行节点。然后,每个帧都应显示该行的第一个节点,连接在一条线中的前两个节点,等等。
这是我最初的尝试:
import matplotlib as mpl
mpl.use('agg')
import pylab
import networkx as nx
from matplotlib import animation
G = nx.Graph()
G.add_node(0)
pos = {}
pos[0] = (0, 0)
labels = {}
labels[0] = '0'
for i in xrange(1, 5):
G.add_node(i)
pos[i] = (0, i)
labels[i] = str(i)
G.add_edge(i - 1, i)
fig = pylab.figure()
left = right = top = bottom = None
def init():
nx.draw(G, pos=pos, labels=labels)
ax = pylab.gca()
global left, right, top, bottom
left, right = ax.get_xlim()
bottom, top = ax.get_ylim()
pylab.savefig('network_changes_init.png', format='png')
def redraw(frame):
pylab.clf()
nbunch = range(frame + 1)
D = G.subgraph(nbunch)
pos2 = {}
labels2 = {}
for u in D.nodes():
pos2[u] = pos[u]
labels2[u] = labels[u]
nx.draw(D, pos=pos2, labels=labels2)
pylab.xlim(left, right)
pylab.ylim(bottom, top)
pylab.savefig('network_changes%d.png' % frame, format='png')
ani = animation.FuncAnimation(fig, redraw, init_func=init, frames=4)
ani.save('network_changes.mp4', writer='avconv')
此代码运行时没有错误,但是不会产生我想要的动画。总共应该有五个帧:初始帧(根据函数init()绘制)和四个其他帧(根据函数redraw()绘制)。相反,只有四个框架:重绘绘制的四个框架。它不会绘制我想要的初始帧。
以下是动画中的四个帧
我想要的是第一帧看起来像这样(这是在函数init()中绘制的)
我知道事实上正在调用init(),因为正在其中设置了全局变量left,right,top和bottom。但是为什么不使用此功能制作的图形未添加到最终动画中?