Python中布朗运动模拟动画报错:'FuncAnimation'无'_resize_id'属性
解决布朗运动动画中的'FuncAnimation' object has no attribute '_resize_id'错误
错误原因分析
出现这个错误主要有两个核心问题:
set_offsets参数格式错误:该方法要求传入N×2的二维数组,而你之前是分别传入X和Y两个一维数组,不符合API要求。- 位置变量的作用域问题:在
update函数里直接对positionX/positionY重新赋值(比如positionX = np.clip(...)),会让它们变成局部变量,外部的原始数组不会被修改,导致动画无变化,同时触发blit模式下的内部错误。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt from matplotlib import animation # Set random seed for reproducibility np.random.seed(0) num_particles = 80 box_size = 10 total_steps = 200 # 初始化N×2的位置数组,统一管理X/Y坐标 positions = np.random.uniform(low=1, high=box_size-1, size=(num_particles, 2)) # Initialize figure and axis fig, ax = plt.subplots() ax.set_xlim(0, box_size) ax.set_ylim(0, box_size) # Initialize particles as scatter plot objects particles = ax.scatter(positions[:, 0], positions[:, 1]) def update(frame, positions): # 生成随机位移 displacements = np.random.normal(loc=0, scale=0.1, size=(num_particles, 2)) # 直接更新原数组的元素,避免局部变量覆盖 positions += displacements # 原地裁剪位置,确保粒子在盒子内 np.clip(positions, 0, box_size, out=positions) # 使用N×2数组更新散点位置,符合set_offsets的参数要求 particles.set_offsets(positions) return particles, # 创建动画,变量传递正确后blit模式可正常工作 ani = animation.FuncAnimation(fig, update, frames=total_steps, fargs=(positions,), interval=100, blit=True) ani.save("brownian_mot.gif", writer="pillow") plt.show()
关键修改点
- 合并位置数组:把原本分开的X/Y坐标合并成一个二维数组,简化后续的位置更新和传递逻辑,同时满足
set_offsets的参数格式要求。 - 原地修改数组:使用
np.clip(..., out=positions)直接修改原数组,而不是重新赋值,保证外部数组能被正确更新,动画可以正常展示粒子运动。 - 修正
set_offsets调用:直接传入合并后的二维位置数组,解决了参数格式不匹配的问题。
内容的提问来源于stack exchange,提问作者Víctor López
相关产品推荐
相关产品推荐

