在figu的两条直线之间寻找中点

2024-04-19 20:53:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在坐标系中有一个数字,你可以在这里看到:

picture Here

正如你所看到的,它由两条基本平行的线组成,我想做的是,而不是两条线,只做一条穿过这两条线中间的线,例如:

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

Tags: 代码fromimport绘图matplotlibfig图片plt
1条回答
网友
1楼 · 发布于 2024-04-19 20:53:03

虽然不是完美的解决方案,但您可以使用最近邻算法得到一个很好的近似值(最好的选择是使用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

相关问题 更多 >