matplotlib 中的 Hexgrid 显示意想不到的颜色
Hexgrid in matplotlib showing unexpected colors
我一直在尝试在 Python 中的六角网格上创建一个生命游戏克隆。我已经设法使用 hexbin
来显示结果并定期更新它们以创建动画。
每个单元格只能有值 0
或 1
,我使用 Greys
颜色图将它们显示为黑白图块。但是,在输出中,中心图块显示为灰色而不是黑色,即使值设置为 1
(我使用打印语句检查这些图块的值)。
我怎样才能删除它?使用不同的颜色图,问题变得更加明显,例如 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()
您正在使用方形网格来执行生命游戏算法。然后将结果映射到六边形网格上。这意味着一些方形网格值位于六边形网格的相同单元格中(加起来等于它的值),而一些六边形网格单元格是空的,因为它们没有碰到任何方形网格单元格。
例如,您可以看到以 (0.5,2.5) 为中心的六边形网格的单元格不包括原始正方形网格的任何位置。因此此单元格保持为空。
由于生命游戏在很大程度上取决于网格本身,因此无论如何使用不同的网格是没有意义的。因此,请继续使用方形网格 - 或者让生命游戏 运行 在不同的网格上运行,更改完整的算法以考虑正在使用的网格。
我一直在尝试在 Python 中的六角网格上创建一个生命游戏克隆。我已经设法使用 hexbin
来显示结果并定期更新它们以创建动画。
每个单元格只能有值 0
或 1
,我使用 Greys
颜色图将它们显示为黑白图块。但是,在输出中,中心图块显示为灰色而不是黑色,即使值设置为 1
(我使用打印语句检查这些图块的值)。
我怎样才能删除它?使用不同的颜色图,问题变得更加明显,例如 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()
您正在使用方形网格来执行生命游戏算法。然后将结果映射到六边形网格上。这意味着一些方形网格值位于六边形网格的相同单元格中(加起来等于它的值),而一些六边形网格单元格是空的,因为它们没有碰到任何方形网格单元格。
例如,您可以看到以 (0.5,2.5) 为中心的六边形网格的单元格不包括原始正方形网格的任何位置。因此此单元格保持为空。
由于生命游戏在很大程度上取决于网格本身,因此无论如何使用不同的网格是没有意义的。因此,请继续使用方形网格 - 或者让生命游戏 运行 在不同的网格上运行,更改完整的算法以考虑正在使用的网格。