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

使用Matplotlib FuncAnimation实现数组迭代动画失败求助

问题排查与修复方案

核心问题分析

你的代码存在几个关键问题导致动画无法正常运行:

  • 图形对象不匹配:plt.matshow会自动创建新的Figure和Axes,而你绑定动画的是之前单独创建的fig,两者无关联,导致更新无法传递到显示窗口。
  • 变量名冲突:动画函数func的参数i和内部生成随机索引的i重名,覆盖了帧索引变量,引发逻辑混乱。
  • 数组维度计算错误:adjacent_multiply函数中计算下方相邻元素时,错误使用了列维度shape[1]而非行维度shape[0],导致相邻乘积计算出错。

修复后的完整代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim
import matplotlib as mpl
import random as rand

# 计算二维数组相邻元素乘积之和的函数
def adjacent_multiply(array):
    shape = array.shape
    
    left_adjacent = array[:, 0:(shape[1]-1)]
    left_adjacent = np.insert(left_adjacent, [0], 0, axis = 1)
    left_product = left_adjacent * array
    
    down_adjacent = array[0:(shape[0]-1), :]  # 修正:使用行维度shape[0]
    down_adjacent = np.insert(down_adjacent, [0], 0, axis = 0)
    down_product = down_adjacent * array
    
    return sum(sum(left_product)) + sum(sum(down_product))

n = 20
J = 1
T = 1
k_b = 1
beta = 1/(k_b * T)
c = mpl.colors.ListedColormap(['black', 'gray'])
normal = mpl.colors.Normalize(vmin=-1,vmax=1)
arr = np.random.choice([-1, 1], size = (n,n))
m = 1000

# 统一创建Figure和Axes,确保动画绑定对象一致
fig, ax = plt.subplots()
im = ax.matshow(arr, cmap = c, norm = normal)

# 动画更新函数,修改参数名避免变量冲突
def update(frame_idx):
    stepstart = -J * adjacent_multiply(arr)
    
    # 生成随机索引并取标量,避免维度问题
    i_rand = np.random.choice(n, size = 1)[0]
    j_rand = np.random.choice(n, size = 1)[0]
    arr[i_rand, j_rand] *= -1
    
    stepend = -J * adjacent_multiply(arr)
    change = stepend - stepstart
    
    # Metropolis准则判断是否回退翻转
    if rand.random() > np.exp(-beta*change):
        arr[i_rand, j_rand] *= -1
    
    im.set_data(arr)
    return [im]

# 创建动画,添加interval控制帧率,blit=True提升刷新效率
animation = anim.FuncAnimation(fig, update, frames = 1000, blit = True, interval=50)

# 保存MP4(需提前安装ffmpeg)
# writer = anim.FFMpegWriter(fps=20, metadata=dict(artist='Me'), bitrate=1800)
# animation.save('ising_animation.mp4', writer=writer)

plt.show()

关键修复点说明

  1. 统一图形对象:改用plt.subplots()创建明确的fig和ax,再通过ax.matshow()绘制,确保动画绑定的Figure与绘图元素属于同一对象。
  2. 解决变量冲突:将动画函数参数改为frame_idx,内部随机索引变量改为i_rand、j_rand,避免覆盖帧索引。
  3. 修正维度错误:修复adjacent_multiply中下方相邻元素的切片维度,保证相邻乘积计算逻辑正确。
  4. 优化动画参数:添加interval参数控制每帧间隔(单位毫秒),让动画播放更流畅。
  5. MP4保存说明:取消注释保存代码即可生成MP4文件,需提前安装ffmpeg工具,可通过pip install ffmpeg-python或系统包管理器安装。

内容的提问来源于stack exchange,提问作者Faith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:33:27