You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中布朗运动模拟动画报错:'FuncAnimation'无'_resize_id'属性

解决布朗运动动画中的'FuncAnimation' object has no attribute '_resize_id'错误

错误原因分析

出现这个错误主要有两个核心问题:

  1. set_offsets参数格式错误:该方法要求传入N×2的二维数组,而你之前是分别传入X和Y两个一维数组,不符合API要求。
  2. 位置变量的作用域问题:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:57:14