Matplotlib动画init_func第一帧

时间:2018-12-17 19:12:16

标签: python animation matplotlib networkx

我想创建一个动画,以显示网络结构如何随时间变化。我正在使用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()绘制)。相反,只有四个框架:重绘绘制的四个框架。它不会绘制我想要的初始帧。

以下是动画中的四个帧

帧1 enter image description here

frame2 enter image description here

frame3 enter image description here

frame4 enter image description here

我想要的是第一帧看起来像这样(这是在函数init()中绘制的)

enter image description here

我知道事实上正在调用init(),因为正在其中设置了全局变量left,right,top和bottom。但是为什么不使用此功能制作的图形未添加到最终动画中?

0 个答案:

没有答案