Python Matplotlib-imshow,但带有六边形

Python Matplotlib-imshow,但带有六边形,python,matplotlib,imshow,Python,Matplotlib,Imshow,代码是: import numpy as np import matplotlib.pyplot as plt from matplotlib import colors example_data = np.random.randint(4, size=(40,44)) cmap = colors.ListedColormap(['black', 'green', 'red', 'blue']) bounds = [0,1,2,3,4] norm = colors.BoundaryNorm(b

代码是:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

example_data = np.random.randint(4, size=(40,44))
cmap = colors.ListedColormap(['black', 'green', 'red', 'blue'])
bounds = [0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)

img = plt.imshow(example_data, interpolation = 'nearest', origin = 'lower',
cmap = cmap, norm = norm)
这让我大致得到了我想要的。我在寻找的是,是否有一种方法可以使每个瓷砖的形状都是六边形而不是正方形?我认为imshow可能不是这样做的方法,但是如果有一种方法可以改变默认的tile,那就很好了


谢谢。

谁一直投反对票,没有任何评论!我认为之前的尝试(如下)是一个很好的解决方案。然而,我很欣赏它没有很好地镶嵌,六边形的形状也很差。以下是使用修补程序的更好解决方案:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
import matplotlib.patches as mpatches
from matplotlib.collections import PatchCollection

nx = 40
ny = 44
example_data = np.random.randint(4, size=(nx,ny))
cmap = colors.ListedColormap(['black', 'green', 'red', 'blue'])
bounds = [0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)

x = np.linspace(0, 1, nx)
y = np.linspace(0, 1, ny)
X, Y = np.meshgrid(x, y)

dx = np.diff(x)[0]
dy = np.diff(y)[0]
ds = np.sqrt(dx**2 +  dy**2)

patches = []
for i in x:
    for n, j in enumerate(y):
        if n%2:
            polygon = mpatches.RegularPolygon([i-dx/2., j], 6, 0.6*dx)
        else:
            polygon = mpatches.RegularPolygon([i, j], 6, 0.6*dx)
        patches.append(polygon)

collection = PatchCollection(patches, cmap=cmap, norm=norm, alpha=1.0)

fig, ax = plt.subplots(1,1)
ax.add_collection(collection)
collection.set_array(example_data.ravel())
plt.show()
看起来像这样

以前的解决方案:

你可以使用带有彩色六边形的散点图

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

nx = 40
ny = 44
example_data = np.random.randint(4, size=(nx,ny))
cmap = colors.ListedColormap(['black', 'green', 'red', 'blue'])
bounds = [0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)

x = np.linspace(0, 1, nx)
y = np.linspace(0, 1, ny)
X, Y = np.meshgrid(x, y)

img = plt.scatter(X.ravel(),Y.ravel(),c=example_data.ravel(), cmap=cmap, norm=norm, s=360, marker=(6, 0), alpha=0.4)

plt.colorbar(img)
plt.show()
看起来


您将如何从现有的方形瓷砖(阵列)中定义六边形瓷砖?这听起来太具体了,没有内置的功能。我可能错了,但我认为你需要创建自己的绘图例程……恐怕我还不熟悉,但你可以看看库。它支持绘制六边形网格。