寻找两条线之间的中间点

时间:2019-04-12 12:59:43

标签: python matplotlib coordinate-systems

我在坐标系统中有一个可以在此处看到的图形:

picture Here

如您所见,它由2条大部分平行的线组成,我要制作的是两条线中间的一条线,而不是两条线,例如:

here is what I mean

请注意,我是手动完成的,因此它看起来与原始图片不一样,但是您应该明白了。

这是我用于绘图的代码:

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = 155, 158, 182, 186, 195, 256, 263, 275, 284, 317, 317, 317, 316, 316, 312, 310, 305, 295, 296, 300, 294, 288, 280, 266, 251, 194, 189, 188, 187, 183, 142, 126, 101, 101, 101, 131, 189, 232, 290, 306, 309, 309, 309, 288, 266, 227, 218, 214, 208, 175, 156, 134, 89 , 79 , 72 , 58 , 57 , 56 , 69 , 87 , 132, 154, 167, 196, 234, 252, 260, 274, 281, 281, 281, 233, 201, 176, 132, 110, 90 , 74 , 74 , 74 , 75 , 75 , 77 , 94 , 108, 151
B = 475, 475, 492, 492, 492, 519, 521, 524, 524, 524, 495, 494, 488, 487, 471, 471, 471, 484, 488, 492, 496, 499, 499, 499, 492, 467, 467, 467, 467, 467, 436, 420, 397, 387, 375, 360, 329, 284, 224, 178, 170, 163, 142, 132, 122, 122, 122, 124, 128, 133, 136, 136, 136, 126, 119, 124, 134, 146, 152, 161, 161, 161, 158, 151, 151, 151, 152, 153, 158, 165, 178, 248, 283, 308, 329, 340, 358, 374, 381, 382, 386, 388, 400, 421, 437, 475


plt.plot(A, B)
for xy in zip(A, B):
    ax.annotate('(%s, %s)' % xy, xy=xy, textcoords='data')  # <--

plt.grid()
plt.show()

1 个答案:

答案 0 :(得分:1)

不是完美的解决方案,但是您可以使用最近邻居算法获得一个很好的近似值(最好的选择是使用dijkstra距离或其他分层聚类过程,但是我不确定您需要多少详细程度)。

这是使用KMeans

的简单实现
from sklearn.cluster import KMeans
import numpy as np

A = 155, 158, 182, 186, 195, 256, 263, 275, 284, 317, 317, 317, 316, 316, 312, 310, 305, 295, 296, 300, 294, 288, 280, 266, 251, 194, 189, 188, 187, 183, 142, 126, 101, 101, 101, 131, 189, 232, 290, 306, 309, 309, 309, 288, 266, 227, 218, 214, 208, 175, 156, 134, 89 , 79 , 72 , 58 , 57 , 56 , 69 , 87 , 132, 154, 167, 196, 234, 252, 260, 274, 281, 281, 281, 233, 201, 176, 132, 110, 90 , 74 , 74 , 74 , 75 , 75 , 77 , 94 , 108, 151
B = 475, 475, 492, 492, 492, 519, 521, 524, 524, 524, 495, 494, 488, 487, 471, 471, 471, 484, 488, 492, 496, 499, 499, 499, 492, 467, 467, 467, 467, 467, 436, 420, 397, 387, 375, 360, 329, 284, 224, 178, 170, 163, 142, 132, 122, 122, 122, 124, 128, 133, 136, 136, 136, 126, 119, 124, 134, 146, 152, 161, 161, 161, 158, 151, 151, 151, 152, 153, 158, 165, 178, 248, 283, 308, 329, 340, 358, 374, 381, 382, 386, 388, 400, 421, 437, 475

df=pd.DataFrame([list(A),list(B)]).T
df.columns=['A','B']

km = KMeans(n_clusters=20).fit(df)
pts=km.cluster_centers_[km.labels_]

以下是输出:

kmeans

plt.plot(pts[:,0],pts[:,1])
plt.plot(X, Y)

这是质心:

plt.plot(km.cluster_centers_[:,0], km.cluster_centers_[:,1],'.')
plt.plot(X, Y)

centroids

您需要计算簇的数量,但是可以获得非常准确的近似值。这是12个质心:

km = KMeans(n_clusters=12).fit(df)
pts=km.cluster_centers_[km.labels_]
plt.plot(pts[:,0], pts[:,1])
plt.plot(X, Y)

12centroids