在matplotlib

时间:2016-04-21 08:24:19

标签: python matplotlib plot

我有(吨)闭合曲线的点坐标,按x递增顺序排序。

当以常规方式绘制时,我得到的结果是:

(仅作为示例,我目前拥有的形状最多可归类为变形虫) enter image description here

但我要找的结果是这样的: enter image description here

我看过matplotlib但找不到任何东西。 (也许我的关键字错了......?)

我试图通过以下方式重新格式化数据:

  1. 随机选择一个点,找到它最近的邻居,然后找到下一个最近的邻居,依此类推...... 它在边缘失败,有时数据不太一致(最近的邻居可能在曲线的另一侧)。

  2. 为了解释不一致的数据,我试图检查两点(被认为是最近邻居)之间的斜率是否与先前连接的斜率匹配 - 失败,原因我找不到。 (在我放弃之前花了相当多的时间)

  3. 选择x_minimum和x_maximum(以及相应的y坐标)并绘制一条虚线并对该线两侧的点进行排序。 - 当你的曲线看起来像香蕉时会失败。

  4. 是否有一个python包/库可以帮助我到达我想要的地方。或者,您能否帮助我更好地对数据点进行排序?提前谢谢。

    修改

    尝试了我所拥有的圆圈上的ConcaveHull,知道为什么这些线条在地方重叠。这是图像: enter image description here

    EDIT2: 通过在答案的评论部分中更改@Reblochon Masque建议的部分代码来解决问题。

2 个答案:

答案 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()

,在上面的例子中结果如下:

Convex hull in a plot

请注意,此方法将为您的点创建一个边界框。

答案 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()

凸包的点分别绘制并连接形成多边形。如果你愿意,你可以进一步操纵它们。

enter image description here

我认为这可能是一个很好的解决方案(简单而便宜),可以在您的情况下实施。如果你的形状凸起,它会很好用。

如果您的形状不是全部凸起的,可能成功的一种方法可能是根据哪个邻居最接近来对点进行排序,并从此有序集中绘制多边形。