为什么matplotlib FuncAnimation增大持留时间后输出静态画面?
问题根因
matplotlib.animation.FuncAnimation 有一个默认参数 save_count=100,该参数限制了动画导出时最多缓存的帧数。当你把单帧持留时间设置为110时,仅第一帧就需要生成110个动画帧,已经超过了默认的100帧阈值,超出部分的帧会被直接截断,因此动画播放到第100帧后就不会再触发后续的帧更新,呈现为静止画面。
修复方案
创建FuncAnimation时显式指定save_count参数,值设置为所有持留时间的总和(也就是总动画帧数)即可,修改后的代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.image as img import matplotlib.animation as anim from IPython.display import HTML df = pd.DataFrame({'pos':[1,2,4,3], 'time':[110,10,1,1]}) file = 'C:\\Users\\...' images = [img.imread(file+f'\\{i}.jfif') for i in range(1,5)] # four images fig = plt.figure() def update(frame): if frame is None: return fig.clear() plt.imshow(images[frame-1], animated=True) plt.tick_params(bottom=False, left=False, labelleft=False, labelbottom=False) def frame_generator(): for frame, cont in zip(df.pos, df.time): yield frame if cont > 1: for _ in range(int(cont)-1): yield None # 计算总帧数传入save_count参数 total_frames = df['time'].sum() ani = anim.FuncAnimation(fig, update, frames=frame_generator(), interval=100 ,blit=False, repeat=False, save_count=total_frames) plt.tight_layout() HTML(ani.to_html5_video())
内容的提问来源于stack exchange,提问作者Kun C
相关产品推荐
相关产品推荐

