Matplotlib中Circle显示为椭圆问题及六边形网格绘制求助
问题解答:六边形网格绘制优化与圆形变椭圆问题
一、更简洁的六边形顶点生成方式
你现在逐个定义顶点的方式虽然直观,但确实可以利用六边形的几何对称性来简化代码——每个顶点和中心的连线夹角固定为60°(360°/6),用循环生成顶点不仅更紧凑,还能避免手动计算坐标时的笔误。
优化后的函数和你原逻辑完全一致,但代码更简洁:
import math def create_hexagon(center): INRADIUS = 0.5 CIRCUMRADIUS = INRADIUS / math.cos(math.radians(30)) points = [] # 从90°开始(对应你定义的pt1),每次递减60°生成6个顶点 for angle in range(90, -270, -60): rad = math.radians(angle) x = center[0] + CIRCUMRADIUS * math.cos(rad) y = center[1] + CIRCUMRADIUS * math.sin(rad) points.append([x, y]) return points
如果后续需要调整六边形的朝向,只需要修改起始角度即可,灵活性更高。
二、圆形显示为椭圆的原因与解决方法
你遇到的圆形变椭圆问题,核心原因是matplotlib默认的坐标轴不是等比例缩放的。举个例子:如果x轴范围是0-10,y轴范围是0-5,那么x轴上1单位的长度会是y轴的两倍,圆形自然会被拉伸成椭圆。
解决这个问题只需要在绘图代码最后添加一行,强制坐标轴使用等比例:
plt.axis('equal')
如果你习惯用Axes对象操作,也可以这样设置:
ax = plt.gca() ax.set_aspect('equal', adjustable='box')
整合后的完整示例代码如下:
import math import matplotlib.pyplot as plt def create_hexagon(center): INRADIUS = 0.5 CIRCUMRADIUS = INRADIUS / math.cos(math.radians(30)) points = [] for angle in range(90, -270, -60): rad = math.radians(angle) x = center[0] + CIRCUMRADIUS * math.cos(rad) y = center[1] + CIRCUMRADIUS * math.sin(rad) points.append([x, y]) return points # 示例中心点列表 centers = [[1,1], [2.5,1], [1, 2.732], [2.5, 2.732]] for pt in centers: points = create_hexagon(pt) hexagon = plt.Polygon(points, fill=None, edgecolor='k') plt.gca().add_patch(hexagon) circle = plt.Circle(pt, 0.5 / math.cos(math.radians(30)), fill=None) plt.gca().add_patch(circle) # 关键:设置等比例坐标轴 plt.axis('equal') plt.show()
这样绘制出来的圆形就会是标准的正圆形,六边形的比例也会更准确。
内容的提问来源于stack exchange,提问作者Luk
相关产品推荐
相关产品推荐

