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

