如何绘制半圆方程?Python代码生成的半圆效果不符合预期怎么办?
半圆绘制问题排查与修正方案
现有代码的问题
- x取值范围错误:你用的
range((1 + h - r), (h + r - 1), 1)存在两个问题,一是range本身是左闭右开规则,你还在左右边界都手动偏移了1,导致x取不到±r的端点;二是range只能生成整数步长的采样点,点密度太低,绘制出来的图形边缘不平滑。 - 数组维度错误:将coord_list转换为numpy数组时,外层多套了一层
[],导致转置后的维度不符合plt.scatter的输入要求。 - 缺少等比例轴设置:matplotlib默认会自动适配x、y轴的显示比例,即便坐标计算正确,也会把圆拉伸成椭圆形状。
正确实现代码
方案1:参数方程法(更推荐,采样点均匀无变形)
利用圆的极坐标参数方程生成采样点,不需要处理开根号的边界问题,点分布更均匀:
import numpy as np import matplotlib.pyplot as plt h = 0 # 圆心x坐标 k = 0 # 圆心y坐标 r = 6 # 半径 # 角度范围取0到π,共100个均匀采样点,对应上半圆 theta = np.linspace(0, np.pi, 100) x = h + r * np.cos(theta) y = k + r * np.sin(theta) plt.scatter(x, y) # 若需要连续的半圆线条,替换上方scatter为:plt.plot(x, y) plt.grid(color='green', linestyle='--', linewidth=0.2) # 强制xy轴等比例显示,避免半圆变形 plt.axis('equal') plt.show()
方案2:修正原x计算y的写法
如果你需要保留用x坐标计算y的逻辑,修改采样方式和数组处理即可:
import math import numpy as np import matplotlib.pyplot as plt coord_list = [] h = 0 k = 0 r = 6 # 用linspace在[-r, r]范围内生成100个密集的x采样点,替代整数range x_arr = np.linspace(h - r, h + r, 100) for x in x_arr: y1 = k + math.sqrt(r**2 - (x - h)**2) coord_list.append([x, y1]) # 转换数组时不要额外套外层[] data = np.array(coord_list) x, y = data.T plt.scatter(x, y) plt.grid(color='green', linestyle='--', linewidth=0.2) plt.axis('equal') plt.show()
补充说明
如果需要绘制下半圆,只需把y值的计算改为k - math.sqrt(r**2 - (x - h)**2)即可。
内容的提问来源于stack exchange,提问作者PinAppleRedbull
相关产品推荐
相关产品推荐

