我有(吨)闭合曲线的点坐标,按x递增顺序排序。
当以常规方式绘制时,我得到的结果是:
我看过matplotlib但找不到任何东西。 (也许我的关键字错了......?)
我试图通过以下方式重新格式化数据:
随机选择一个点,找到它最近的邻居,然后找到下一个最近的邻居,依此类推...... 它在边缘失败,有时数据不太一致(最近的邻居可能在曲线的另一侧)。
为了解释不一致的数据,我试图检查两点(被认为是最近邻居)之间的斜率是否与先前连接的斜率匹配 - 失败,原因我找不到。 (在我放弃之前花了相当多的时间)
选择x_minimum和x_maximum(以及相应的y坐标)并绘制一条虚线并对该线两侧的点进行排序。 - 当你的曲线看起来像香蕉时会失败。
是否有一个python包/库可以帮助我到达我想要的地方。或者,您能否帮助我更好地对数据点进行排序?提前谢谢。
修改
尝试了我所拥有的圆圈上的ConcaveHull,知道为什么这些线条在地方重叠。这是图像:
EDIT2: 通过在答案的评论部分中更改@Reblochon Masque建议的部分代码来解决问题。
答案 0 :(得分:4)
如果您不知道您的积分是如何设置的(如果您这样做我建议您遵循该订单,那么会更快)您可以使用scipy中的Convex Hull:
import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull
# RANDOM DATA
x = np.random.normal(0,1,100)
y = np.random.normal(0,1,100)
xy = np.hstack((x[:,np.newaxis],y[:,np.newaxis]))
# PERFORM CONVEX HULL
hull = ConvexHull(xy)
# PLOT THE RESULTS
plt.scatter(x,y)
plt.plot(x[hull.vertices], y[hull.vertices])
plt.show()
,在上面的例子中结果如下:
请注意,此方法将为您的点创建一个边界框。
答案 1 :(得分:2)
这是一个可能做你想做的事情并解决你的问题的例子: more info here
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull
points = np.random.rand(30, 2) # 30 random points in 2-D
hull = ConvexHull(points)
#xs = np.array([point[0] for point in points])
#ys = np.array([point[1] for point in points])
#xh = np.array([point[0] for point in hull.points])
#yh = np.array([point[1] for point in hull.points])
plt.plot(points[:,0], points[:,1], 'o')
for simplex in hull.simplices:
plt.plot(points[simplex, 0], points[simplex, 1], 'k-')
plt.plot(points[hull.vertices,0], points[hull.vertices,1], 'r--', lw=2)
plt.plot(points[hull.vertices[0],0], points[hull.vertices[0],1], 'ro')
plt.show()
凸包的点分别绘制并连接形成多边形。如果你愿意,你可以进一步操纵它们。
我认为这可能是一个很好的解决方案(简单而便宜),可以在您的情况下实施。如果你的形状凸起,它会很好用。
如果您的形状不是全部凸起的,可能成功的一种方法可能是根据哪个邻居最接近来对点进行排序,并从此有序集中绘制多边形。