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