matplotlib ArtistAnimation返回一个空白视频

时间:2017-03-28 18:16:05

标签: python animation matplotlib ffmpeg networkx

我正在尝试生成随时间变化的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上运行。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

在这个问题中可以找到原因和更长的解释,
Matplotlib video creation,处理类似案件。

缺点当然是当你移除plt.cla()时,你最终会在屏幕上出现拥挤的动画;所以你需要决定是否在屏幕上进行绘图或是否保存在前面。