You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:02:39