使用Python以六边形网格显示数据
我要找的是一个方法或类,它允许我在网格中显示六边形列表。理想情况下,我将能够使用某种形式的集合方法来更改各个六边形的颜色/阴影/边框 六边形使用@amitp中列出的轴向坐标系进行存储。但我可以很容易地将它们的中心输出为xy坐标 我觉得可能有一个解决方案隐藏在或。但前者是一种直方图方法,而后者由于DPI缩放而显得过于复杂使用Python以六边形网格显示数据,python,matplotlib,tkinter,hexagonal-tiles,Python,Matplotlib,Tkinter,Hexagonal Tiles,我要找的是一个方法或类,它允许我在网格中显示六边形列表。理想情况下,我将能够使用某种形式的集合方法来更改各个六边形的颜色/阴影/边框 六边形使用@amitp中列出的轴向坐标系进行存储。但我可以很容易地将它们的中心输出为xy坐标 我觉得可能有一个解决方案隐藏在或。但前者是一种直方图方法,而后者由于DPI缩放而显得过于复杂 那么,有人知道一个提供六边形网格的库吗?它不必在matplotlib中。我也很乐意使用ASCII艺术或切换到R。这里有一个实现,允许您设置六边形单元格的颜色,也允许创建自定义边框
那么,有人知道一个提供六边形网格的库吗?它不必在matplotlib中。我也很乐意使用ASCII艺术或切换到R。这里有一个实现,允许您设置六边形单元格的颜色,也允许创建自定义边框颜色 这都是手工制作的,使用参考网站只需1小时。你可能需要调整它以适应你的需要,但似乎很有效
from tkinter import *
class HexaCanvas(Canvas):
""" A canvas that provides a create-hexagone method """
def __init__(self, master, *args, **kwargs):
Canvas.__init__(self, master, *args, **kwargs)
self.hexaSize = 20
def setHexaSize(self, number):
self.hexaSize = number
def create_hexagone(self, x, y, color = "black", fill="blue", color1=None, color2=None, color3=None, color4=None, color5=None, color6=None):
"""
Compute coordinates of 6 points relative to a center position.
Point are numbered following this schema :
Points in euclidiean grid:
6
5 1
.
4 2
3
Each color is applied to the side that link the vertex with same number to its following.
Ex : color 1 is applied on side (vertex1, vertex2)
Take care that tkinter ordinate axes is inverted to the standard euclidian ones.
Point on the screen will be horizontally mirrored.
Displayed points:
3
color3/ \color2
4 2
color4| |color1
5 1
color6\ /color6
6
"""
size = self.hexaSize
Δx = (size**2 - (size/2)**2)**0.5
point1 = (x+Δx, y+size/2)
point2 = (x+Δx, y-size/2)
point3 = (x , y-size )
point4 = (x-Δx, y-size/2)
point5 = (x-Δx, y+size/2)
point6 = (x , y+size )
#this setting allow to specify a different color for each side.
if color1 == None:
color1 = color
if color2 == None:
color2 = color
if color3 == None:
color3 = color
if color4 == None:
color4 = color
if color5 == None:
color5 = color
if color6 == None:
color6 = color
self.create_line(point1, point2, fill=color1, width=2)
self.create_line(point2, point3, fill=color2, width=2)
self.create_line(point3, point4, fill=color3, width=2)
self.create_line(point4, point5, fill=color4, width=2)
self.create_line(point5, point6, fill=color5, width=2)
self.create_line(point6, point1, fill=color6, width=2)
if fill != None:
self.create_polygon(point1, point2, point3, point4, point5, point6, fill=fill)
class HexagonalGrid(HexaCanvas):
""" A grid whose each cell is hexagonal """
def __init__(self, master, scale, grid_width, grid_height, *args, **kwargs):
Δx = (scale**2 - (scale/2.0)**2)**0.5
width = 2 * Δx * grid_width + Δx
height = 1.5 * scale * grid_height + 0.5 * scale
HexaCanvas.__init__(self, master, background='white', width=width, height=height, *args, **kwargs)
self.setHexaSize(scale)
def setCell(self, xCell, yCell, *args, **kwargs ):
""" Create a content in the cell of coordinates x and y. Could specify options throught keywords : color, fill, color1, color2, color3, color4; color5, color6"""
#compute pixel coordinate of the center of the cell:
size = self.hexaSize
Δx = (size**2 - (size/2)**2)**0.5
pix_x = Δx + 2*Δx*xCell
if yCell%2 ==1 :
pix_x += Δx
pix_y = size + yCell*1.5*size
self.create_hexagone(pix_x, pix_y, *args, **kwargs)
if __name__ == "__main__":
tk = Tk()
grid = HexagonalGrid(tk, scale = 50, grid_width=4, grid_height=4)
grid.grid(row=0, column=0, padx=5, pady=5)
def correct_quit(tk):
tk.destroy()
tk.quit()
quit = Button(tk, text = "Quit", command = lambda :correct_quit(tk))
quit.grid(row=1, column=0)
grid.setCell(0,0, fill='blue')
grid.setCell(1,0, fill='red')
grid.setCell(0,1, fill='green')
grid.setCell(1,1, fill='yellow')
grid.setCell(2,0, fill='cyan')
grid.setCell(0,2, fill='teal')
grid.setCell(2,1, fill='silver')
grid.setCell(1,2, fill='white')
grid.setCell(2,2, fill='gray')
tk.mainloop()
我试图正确地注释我的代码。如果你觉得有什么不清楚的地方,请毫不犹豫地要求解释
祝你好运
阿瑟·维塞
注意:在Python3上运行的脚本。这幅画有点参差不齐。Tk canvas上的改进可以按照中的建议添加反别名您可以使用my python模块来实现此目的-创建和绘制六边形网格:
来自hexalattice.hexalattice导入*
六边形中心,创建六边形网格(nx=5,
ny=5,
do_plot=True)
plt.show()#导入matplotlib.pyplot作为plt
制作此图:
有关更多示例,请参见此答案:
为什么不简单地使用Tkinter画布呢?在Win7、3.4.2、tk 8.6中,tk.quit退出tcl,但不关闭tk窗口。在我的Linux上,它可以正常工作。我知道为了正确地退出它,您必须调用
tk.destroy
和tk.quit
方法。但是感谢你在这里指出这个错误。我将编辑代码。