matplotlib ArtistAnimation 返回一个空白视频



我正在尝试制作一个随时间变化的网络图的动画。我正在使用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。

我做错了什么?

简短的回答:如果您不想有一个空的动画,请不要清除轴! 即删除行plt.cla()。然后,您还应该删除初始nx.draw(G),因为这不会添加到ims数组中,否则会在动画的每一帧中保留。

原因和更长的解释可以在这个问题中找到,
Matplotlib视频创建,其中处理了类似的案例。

当然,缺点是,当删除plt.cla()时,你最终会在屏幕上看到一个拥挤的动画;所以你需要决定是在屏幕上绘图还是事先保存。

最新更新