私はPythonの六角形グリッド上にGame of Lifeのクローンを作成しようとしています。私はhexbin
を使用して結果を表示し、アニメーションを作成するために定期的に更新しました。予期せぬ色を示すmatplotlibのHexgrid
各セルの値は0
または1
で、白黒タイルとして表示するにはGreys
カラーマップを使用しています。しかし出力では、値が1
に設定されていても、センタータイルは黒ではなく灰色で表示されます(これらのタイルの値を確認するためにprintステートメントを使用しました)。
どのように私はそれを削除することができますか? Spectral
などの異なるカラーマップでは、この問題がより顕著になります。この場合は水平線が表示されます)。私は、この問題が現れなかった長方形のグリッドを持つ同じプロジェクトの前に、ほぼ同じコードを使用しました。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib.mlab as mlab
n = 20 # number of rows
alive = 1 # value of a cell that is alive
dead = 0 # value of a dead cell
pause = False
x = y = np.arange(0, n, 1.0)
X, Y = np.meshgrid(x, y)
Z = np.zeros((n, n))
Z[10][10] = Z[9][11] = Z[10][11] = Z[9][9] = 1
x = X.ravel()
y = Y.ravel()
z = Z.ravel()
def update(*args):
if not pause:
advance()
# this is the main function that advances the animation by one frame (time step)
def advance(*args):
global Z
newZ = Z.copy()
for i in range(n):
for j in range(n):
total = (Z[i][(j-1)%n] + Z[i][(j+1)%n] + Z[(i-1)%n][j] + Z[(i+1)%n][j] + Z[(i-1)%n][(j-1)%n] + Z[(i+1)%n][(j-1)%n])
if Z[i][j] == alive:
if (total < 2) or (total > 4):
newZ[i][j] = dead
else:
if total == 2:
newZ[i][j] = alive
Z = newZ
z = Z.ravel()
grid = plt.hexbin(x, y, z, gridsize=n, cmap="Spectral")
return [grid]
fig = plt.figure(figsize=(5, 5))
ax = plt.subplot()
ani = animation.FuncAnimation(fig, update, interval=50)
plt.show()
ありがとう、私はこれがバックグラウンドで起こっているとは思わなかった。私の目標は、実際にGoLを適合ルール付きの16進グリッド上で実行させることです。フォローアップの質問として:タイルを視覚化するための良いアプローチは何でしょうか?個々のポリゴンを通して? – andynitrox
あなたのアルゴリズムが六角形のグリッドで実行されている場合は、可視化のために 'hexbin'を使用しても問題ありません。 – ImportanceOfBeingErnest
どのように矩形から六角形のグリッドに正しくマップできますか?私は、デカルトタイルを、デカルト格子上の点にも対応するインデックスi、jで識別することができます(各2行目はある量だけ横に移動します)。しかし、私はこれがすでに私が行ったことだと思った。 – andynitrox