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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:52:40