【问题标题】:Hexgrid in matplotlib showing unexpected colorsmatplotlib 中的 Hexgrid 显示出意外的颜色
【发布时间】:2017-12-21 14:31:58
【问题描述】:

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

每个单元格只能有值01,我使用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()

【问题讨论】:

    标签: python matplotlib colormap hexagonal-tiles


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢,没想到这是在后台发生的。事实上,我的目标是让 GoL 在具有适应规则的六角网格上运行。作为后续问题:什么是可视化瓷砖的好方法?通过单个多边形?
    • 如果你的算法在六边形网格上运行,你可以使用hexbin进行可视化,没问题。
    • 如何正确地从矩形映射到六边形网格?我可以用索引 i 和 j 来识别每个十六进制图块,它们也对应于笛卡尔网格上的一个点(只是每第二行都移动了一些量)。但我认为这已经是我所做的了..
    • 不,首先,hexbin 网格沿轴具有不同数量的单元格。这可以通过在调用它时使用正确的数字作为参数来解决。但要点是,与方形网格相比,每隔一行的十六进制网格点就会移动半个单元格宽度。但是,如果您计算那些部分偏移坐标中单元格的占用,您肯定可以使用它们并将图创建为 hexbin。
    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多