Matplotlib中FuncAnimation动画丢失第一帧问题求助
丢帧原因
这个问题是FuncAnimation的默认调用逻辑和你使用了一次性迭代器两个因素共同导致的:
- Matplotlib的
FuncAnimation在正式渲染你指定的frames数之前,会默认先调用一次animate函数做画布初始化,这个前置调用的结果不会被计入最终的动画帧。 - 你用
islice生成的迭代器是一次性消耗的,前置调用时执行next(i)直接拿走了trajectory的第一个元素,剩下的9个元素才会被后续的10次正式帧调用消耗,第10次调用时迭代器已经为空,所以最终只显示9个点。
你看到的print输出数量比实际渲染的多一个,就是因为多了那次前置初始化调用的打印,但这一帧不会被写入动画或者gif文件。
修复方法
选任意一种都可以解决问题:
- 给
FuncAnimation指定空的初始化函数,禁止默认的前置调用:
# 新增空初始化函数 def init(): return [] # 创建动画时加上init_func参数 ani = animation.FuncAnimation(fig, animate, interval=1000, frames=len(trajectory), repeat=False, init_func=init) # 保存用的ani2也做同样修改即可
- 放弃用全局迭代器取点,直接用传入的帧索引取
trajectory元素,从根源避免消耗错位:
# 修改animate函数如下 pippo = None def animate(j): global pippo if pippo: pippo.remove() # 直接用索引j取对应点,不需要迭代器 coord = trajectory[j] print(coord) x, y, z = coord pippo = ax.scatter(x,y,z) return pippo
修改后不需要重复第一个元素,10个点的轨迹就能完整渲染和保存。
内容的提问来源于stack exchange,提问作者pippo1980
相关产品推荐
相关产品推荐

