如何用Matplotlib为2D NumPy数组制作动画?康威生命游戏求助
康威生命游戏Matplotlib实时更新绘图方案
直接给你基于while循环的极简实现,核心是复用同一个图像对象、开启Matplotlib交互模式,避免每次迭代重新创建窗口:
完整示例代码
import numpy as np import matplotlib.pyplot as plt # 替换成你已有的计算下一代函数 def compute_next_generation(grid): rows, cols = grid.shape next_grid = grid.copy() # 计算每个细胞的存活邻居数(这里用周期性边界,你可替换为自己的边界逻辑) for i in range(rows): for j in range(cols): neighbors = grid[ (i-1)%rows : (i+2)%rows, (j-1)%cols : (j+2)%cols ].sum() - grid[i,j] # 生命游戏核心规则 if grid[i,j] == 1: if neighbors < 2 or neighbors > 3: next_grid[i,j] = 0 else: if neighbors == 3: next_grid[i,j] = 1 return next_grid # 替换成你的初始网格 np.random.seed(42) grid = np.random.randint(0, 2, size=(50, 50)) # 初始化绘图 plt.ion() # 开启交互模式,让窗口可实时更新 fig, ax = plt.subplots() img = ax.imshow(grid, cmap='binary') # 创建图像对象,后续仅更新数据 ax.set_title("康威生命游戏") ax.axis('off') # 隐藏坐标轴(可选) # 循环更新绘图 try: while True: grid = compute_next_generation(grid) img.set_data(grid) # 仅更新图像数据,不新建窗口 fig.canvas.draw() # 重绘画布 fig.canvas.flush_events() # 刷新事件队列,避免卡顿 plt.pause(0.1) # 控制动画速度,可按需调整 except KeyboardInterrupt: # 按Ctrl+C可终止循环 print("动画结束") finally: plt.ioff() # 关闭交互模式 plt.close()
关键要点说明
plt.ion():开启Matplotlib交互模式,让窗口能实时响应更新,不会阻塞程序运行。- 复用
img对象:每次迭代只调用img.set_data(grid)更新数据,而非重新调用plt.imshow(),这是避免新开窗口的核心。 fig.canvas.draw()+fig.canvas.flush_events():强制重绘画布并刷新事件队列,确保更新内容及时显示。plt.pause():既控制动画帧率,又让Matplotlib有时间处理窗口事件,防止程序卡死。
如果之前StackOverflow的方案无效,大概率是没开启交互模式或每次都重新创建了图像对象,这个方案直接解决这两个问题。
内容的提问来源于stack exchange,提问作者snek
相关产品推荐
相关产品推荐

