gpt4 book ai didi

python - matplotlib 中的 Hexgrid 显示意外的颜色

转载 作者:行者123 更新时间:2023-12-01 02:21:17 27 4
gpt4 key购买 nike

我一直在尝试用 Python 在六边形网格上创建一个生命游戏克隆。我设法使用 hexbin 显示结果并定期更新它们以创建动画。

每个单元格只能有值 01,我使用 Greys 颜色图将它们显示为黑白图 block 。但是,在输出中,中心图 block 显示为灰色而不是黑色,即使该值设置为 1(我使用 print 语句来检查这些图 block 的值)。

enter image description here

我怎样才能删除它?使用不同的颜色图(例如光谱:在这种情况下甚至会出现一些水平线),问题会变得更加明显。我之前在具有矩形网格的同一项目中使用过几乎相同的代码,但没有出现此问题。

# -*- 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()

最佳答案

您正在使用方形网格来执行生命游戏算法。然后将结果映射到六角形网格上。这意味着一些方形网格值位于六边形网格的同一单元中(加起来等于其值),而一些六边形网格单元是空的,因为它们没有击中任何方形网格单元。

enter image description here

作为示例,您可以看到例如以(0.5,2.5)为中心的六边形网格单元不包含原始方形网格的任何位置。因此该单元格保持为空。

由于生命游戏强烈依赖于网格本身,因此使用不同的网格是没有意义的。因此,只需保留方形网格 - 或者让生命游戏在不同的网格上运行,更改完整的算法以考虑正在使用的网格。

关于python - matplotlib 中的 Hexgrid 显示意外的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47927095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com