【问题标题】:Python matplotlib - updating data during animation in Conway's Game of LifePython matplotlib - 在康威的生命游戏中更新数据
【发布时间】:2013-06-21 18:47:26
【问题描述】:

下面的代码使用 Python 和 matplotlib 为康威的生命游戏创建动画。

我不知道为什么我必须这样做:

grid = newGrid.copy()
mat.set_data(grid)

而不是简单地:

mat.set_data(newGrid)

如何在不进行上述复制的情况下更新与绘图关联的数组?

import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.animation as animation

N = 100
ON = 255
OFF = 0
vals = [ON, OFF]

# populate grid with random on/off - more off than on
grid = np.random.choice(vals, N*N, p=[0.2, 0.8]).reshape(N, N)

def update(data):
  global grid
  newGrid = grid.copy()
  for i in range(N):
    for j in range(N):
      total = (grid[i, (j-1)%N] + grid[i, (j+1)%N] + 
               grid[(i-1)%N, j] + grid[(i+1)%N, j] + 
               grid[(i-1)%N, (j-1)%N] + grid[(i-1)%N, (j+1)%N] + 
               grid[(i+1)%N, (j-1)%N] + grid[(i+1)%N, (j+1)%N])/255

      if grid[i, j]  == ON:
        if (total < 2) or (total > 3):
          newGrid[i, j] = OFF
      else:
        if total == 3:
          newGrid[i, j] = ON

  grid = newGrid.copy()
  mat.set_data(grid)
  return mat 

fig, ax = plt.subplots()
mat = ax.matshow(grid)
ani = animation.FuncAnimation(fig, update, interval=50,
                              save_count=50)
plt.show()

输出似乎正确 - 我可以看到滑翔机和其他预期模式:

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    mat.set_data() 需要 newGrid 的副本并没有什么特别的原因 - 重要的是全局 grid 会随着迭代而更新:

    def update(data):
      global grid
      newGrid = grid.copy()
    
      """
      do your updating. this needs to be done on a copy of 'grid' because you are
      updating element-by-element, and updates to previous rows/columns will
      affect the result at 'grid[i,j]' if you don't use a copy
      """
    
      # you do need to update the global 'grid' otherwise the simulation will
      # not progress, but there's no need to copy()
      mat.set_data(newGrid)
      grid = newGrid
    
      # # there's no reason why you couldn't do it in the opposite order
      # grid = newGrid
      # mat.set_data(grid)
    
      # at least in my version of matplotlib (1.2.1), the animation function must
      # return an iterable containing the updated artists, i.e. 'mat,' or '[mat]',
      # not 'mat'
      return [mat]
    

    另外,我建议在FuncAnimation 中传递blit=True,这样您就不会在每一帧上都重绘背景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多