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

我正在尝试用 Python 构建康威生命游戏的基本版本。我制作了一个 0 数组作为空白背景,用 1 替换要着色的点。但是,我无法为 0 和 1 指定颜色并同时为绘图设置动画。这是完整的代码:


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):

    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

    return newgrid


fig, 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 个更新的数组。我正在尝试解决这个问题,但无论如何仍然需要动画。


开满天机
浏览 73回答 1
1回答

紫衣仙女

我发现,这不是plt.imshow()和 动画同时出现的问题,而是我的循环本身的问题。一旦修好,它就起作用了。这是代码:import matplotlib.pyplot as plt&nbsp;from matplotlib.animation import FuncAnimationimport numpy as np&nbsp;grid = np.zeros((11,11), dtype=np.int16)&nbsp;def neighbors(x,y):&nbsp; &nbsp; #cell = grid[x,y]&nbsp; &nbsp; n_cells = [grid[x-1, y+1], grid[x, y+1], grid[x+1, y+1],&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; grid[x-1, y], grid[x+1, y],&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; grid[x-1, y-1], grid[x, y-1], grid[x+1, y-1]]&nbsp; &nbsp; return sum(n_cells)grid[3:6,5]=1newgrid = grid.copy()def updatefig(i):&nbsp; &nbsp; for x in range(10):&nbsp; &nbsp; &nbsp; &nbsp; for y in range(10):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if grid[x,y]==0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if neighbors(x,y)==3:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newgrid[x,y]=1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if neighbors(x,y)<2 or neighbors(x,y)>3:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newgrid[x,y]=0&nbsp; &nbsp; def update_grid():&nbsp; &nbsp; &nbsp; &nbsp; global grid&nbsp; &nbsp; &nbsp; &nbsp; grid = newgrid.copy()&nbsp; &nbsp; update_grid()&nbsp; &nbsp; plt.imshow(newgrid, cmap='binary')&nbsp; &nbsp;&nbsp;ax = plt.gca()ax.set_xticklabels([])&nbsp;&nbsp;ax.set_yticklabels([])ax.set_xticks([])ax.set_yticks([])#plt.imshow(grid, cmap='binary')&nbsp;ani = FuncAnimation(fig, updatefig, interval=100)plt.show()&nbsp;我已经imshow在循环内部使用了,但即使我取消注释动画函数上面的那个,它仍然可以工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python