为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中对数组进行着色和动画

在 Python 中对数组进行着色和动画

开满天机 2023-08-08 15:50:45
我正在尝试用 Python 构建康威生命游戏的基本版本。我制作了一个 0 数组作为空白背景,用 1 替换要着色的点。但是,我无法为 0 和 1 指定颜色并同时为绘图设置动画。这是完整的代码:import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimationimport numpy as np grid = np.zeros((11,11), dtype=np.int16)def neighbors(x,y):    n_cells = [grid[x-1, y+1], grid[x, y+1], grid[x+1, y+1],                 grid[x-1, y], grid[x+1, y],                 grid[x-1, y-1], grid[x, y-1], grid[x+1, y-1]]    return sum(n_cells)grid[3:6,5]=1newgrid = grid.copy()def updatefig(i):    for x in range(10):        for y in range(10):            if grid[x,y]==0:                if neighbors(x,y)==3:                    newgrid[x,y]=1            else:                if neighbors(x,y)<2 or neighbors(x,y)>3:                    newgrid[x,y]=0    return newgridfig, ax = plt.subplots()ax = plt.gca()ax.set_xticklabels([])  ax.set_yticklabels([])ax.set_xticks([])ax.set_yticks([])    plt.imshow(grid, cmap='binary') ani = FuncAnimation(fig, updatefig, interval=100)plt.show()如果我在 plt.imshow() 中使用 cmap,我必须给出一个参数,这会导致静态绘图并且没有动画。如果我不指定颜色而只运行动画,则会出现白屏。我已经寻找解决方案并尝试过,但没有任何运气。如果我可以在不使用 imshow 的情况下将颜色分配给 0 和 1,我认为它会成功。有任何想法吗?编辑:我意识到我的循环有缺陷,它只提供 1 个更新的数组。我正在尝试解决这个问题,但无论如何仍然需要动画。
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我发现,这不是plt.imshow()和 动画同时出现的问题,而是我的循环本身的问题。一旦修好,它就起作用了。这是代码:


import matplotlib.pyplot as plt 

from matplotlib.animation import FuncAnimation

import numpy as np 


grid = np.zeros((11,11), dtype=np.int16) 


def neighbors(x,y):

    #cell = grid[x,y]

    n_cells = [grid[x-1, y+1], grid[x, y+1], grid[x+1, y+1], 

                grid[x-1, y], grid[x+1, y], 

                grid[x-1, y-1], grid[x, y-1], grid[x+1, y-1]]

    return sum(n_cells)


grid[3:6,5]=1


newgrid = grid.copy()

def updatefig(i):

    for x in range(10):

        for y in range(10):

            if grid[x,y]==0:

                if neighbors(x,y)==3:

                    newgrid[x,y]=1

            else:

                if neighbors(x,y)<2 or neighbors(x,y)>3:

                    newgrid[x,y]=0


    def update_grid():

        global grid

        grid = newgrid.copy()


    update_grid()


    plt.imshow(newgrid, cmap='binary')

    


ax = plt.gca()

ax.set_xticklabels([])  

ax.set_yticklabels([])

ax.set_xticks([])

ax.set_yticks([])


#plt.imshow(grid, cmap='binary') 


ani = FuncAnimation(fig, updatefig, interval=100)

plt.show() 

我已经imshow在循环内部使用了,但即使我取消注释动画函数上面的那个,它仍然可以工作。


查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信