matplotlib调用animation.save保存动画全程显示相同画面问题求助
问题根因
- 使用matplotlib.pyplot的全局状态接口绘图,而非面向对象操作Figure/Axes实例,动画保存时的运行上下文和预览时不一致,导致每帧绘制内容没有被正确捕获
- 每帧都重复调用
plt.colorbar()生成新的色条,不仅大幅拉长运行耗时,还会持续挤占绘图区域,导致图像内容错位 - FuncAnimation默认的预渲染逻辑和全局绘图状态冲突,导致所有帧都被覆盖为同一张异常渲染的静态图
修复代码
直接替换原有的两个方法即可:
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as anim def aff(self, frame, attr, im_obj, born=True): val = getattr(self, attr) # 只更新imshow的数据,不重复创建绘图对象 im_obj.set_data(val[frame]) def animation(self, attr, fps=5, born=True, begin=0): val = getattr(self, attr) # 提前计算全局最值 vmin = np.min(val) if born else None vmax = np.max(val) if born else None # 面向对象创建Figure和Axes,避免全局状态冲突 fig, ax = plt.subplots() # 初始化imshow对象,colorbar只创建一次 im = ax.imshow(val[begin], extent=(0, self.L, self.L, 0), cmap="seismic", vmin=vmin, vmax=vmax) plt.colorbar(im, ax=ax) def update_frame(frame): self.aff(frame, attr, im, born) # 返回要更新的对象,开启blit优化提速 return [im] # 指定init_func,设置blit=True大幅提升绘制速度 return anim.FuncAnimation( fig, update_frame, frames=np.arange(begin, val.shape[0]), init_func=lambda: [im], interval=1/fps*1000, blit=True )
保存注意事项
保存mp4时建议指定ffmpeg writer,避免编码器异常:
ani.save('animation.mp4', writer='ffmpeg', fps=5)
保存gif使用pillow writer参数即可:
ani.save('animation.gif', writer='pillow', fps=5)
内容的提问来源于stack exchange,提问作者bosonic
相关产品推荐
相关产品推荐

