使用生成器时设置matplotlib动画的持续时间

3
我该怎么在保存matplotlib动画时指定持续时间?通常情况下它会由animation.FuncAnimation()frame参数给出,但使用生成器创建动画帧时不是这样。例如使用此示例
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def simData():
    t_max = 10.0
    dt = 0.05
    x = 0.0
    t = 0.0
    while t < t_max:
        x = np.sin(np.pi*t)
        t = t + dt
        yield x, t

def simPoints(simData):
    x, t = simData[0], simData[1]
    time_text.set_text(time_template%(t))
    line.set_data(t, x)
    return line, time_text

fig = plt.figure()
ax = fig.add_subplot(111)
line, = ax.plot([], [], 'bo', ms=10)
ax.set_ylim(-1, 1)
ax.set_xlim(0, 10)
time_template = 'Time = %.1f s'    # prints running simulation time
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)

ani = animation.FuncAnimation(fig, simPoints, simData)
#plt.show()

ani.save('animation.mp4', writer="avconv", codec="libx264")

创建一个20秒的视频,显示大约五秒钟的"模拟时间",在它通过plt.show()显示时,只会生成一半的帧。

1个回答

6

您在FuncAnimation上缺少save_count关键字。如果您传递一个generator,则可以传递要保存的帧数:

ani = animation.FuncAnimation(fig, simPoints, simData, save_count=200)

迭代似乎会一直进行,直到生成器用尽或达到save_count。默认值为100,尽管在源代码之外似乎没有很清楚地记录。

谢谢您的回答。对我来说,不得不指定这个而不是耗尽生成器似乎有点荒谬。或者,通过构建自己的生成器来产生一系列元组,告诉动画函数该做什么,我做了一些奇怪的事情吗? - KeithWM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接