Python matplotlib中的Hexgrid显示意外颜色

Python matplotlib中的Hexgrid显示意外颜色,python,matplotlib,colormap,hexagonal-tiles,Python,Matplotlib,Colormap,Hexagonal Tiles,我一直在尝试用Python在六边形网格上创建一个生命克隆游戏。我已经设法使用hexbin来显示结果,并定期更新它们以创建动画 每个单元格只能有值0或1,我正在使用Greyscolormap将它们显示为黑白平铺。但是,在输出中,中间的平铺显示为灰色而不是黑色,即使该值设置为1(我使用打印语句检查这些平铺的值) 我怎样才能去掉它?使用不同的颜色贴图(例如光谱贴图:在这种情况下,甚至会出现一些水平线)时,问题变得更加明显。我以前在使用矩形网格的同一个项目中使用了几乎相同的代码,但没有出现这个问题 #

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

每个单元格只能有值
0
1
,我正在使用
Greys
colormap将它们显示为黑白平铺。但是,在输出中,中间的平铺显示为灰色而不是黑色,即使该值设置为
1
(我使用打印语句检查这些平铺的值)

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

# -*- 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()
#-*-编码:utf-8-*-
将numpy作为np导入
将matplotlib.pyplot作为plt导入
将matplotlib.animation导入为动画
将matplotlib.mlab导入为mlab
n=20#行数
活动=1#活动单元格的值
死亡=0#死亡单元格的值
暂停=错误
x=y=np.arange(0,n,1.0)
十、 Y=np.meshgrid(X,Y)
Z=np.零((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更新(*args):
如果没有暂停:
预付款
#这是将动画向前推进一帧(时间步长)的主要功能
def预付款(*args):
全局Z
newZ=Z.copy()
对于范围(n)中的i:
对于范围(n)内的j:
总数=(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])
如果Z[i][j]==活动:
如果(总数<2)或(总数>4):
newZ[i][j]=死亡
其他:
如果总数=2:
newZ[i][j]=活着
Z=newZ
z=z.ravel()
grid=plt.hexbin(x,y,z,gridsize=n,cmap=“光谱”)
返回[网格]
图=零件图(图尺寸=(5,5))
ax=plt.子批()
ani=animation.FuncAnimation(图,更新,间隔=50)
plt.show()

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

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


因为生活的游戏很大程度上依赖于网格本身,所以使用不同的网格是没有意义的。因此,只需使用方形网格,或者让生活游戏在不同的网格上运行,更改完整的算法以说明使用的网格。

非常感谢,我没想到这会发生在后台。事实上,我的目标是让GoL在具有适应规则的十六进制网格上运行。作为后续问题:什么是可视化瓷砖的好方法?通过单个多边形?如果您的算法在六边形网格上运行,您可以使用
hexbin
进行可视化,没有问题。如何正确地将矩形网格映射到六边形网格?我可以用一个索引I,j来识别每一个十六进制块,它也对应于笛卡尔网格上的一个点(只是每第二行移动了一点)。但我认为这已经是我所做的…不,首先,hexbin网格沿着轴有不同数量的单元。这可以通过在调用它时使用正确的数字作为参数来解释。但主要的一点是,与正方形网格相比,每第二行的十六进制网格点移动了半个单元格宽度。但是,如果您计算这些部分移动的坐标中的单元格的占用,您肯定可以使用它们并将绘图创建为hexbin。