绘制包含80%(x,y)点的圆

时间:2014-10-27 16:04:02

标签: python plot multidimensional-array

我有一个2d阵列(x,y)的点,我想绘制一个包含80%这个点的圆,我也想知道结果圆的半径。用python有什么办法吗?

我一直在寻找一种方法,但没有成功。我道歉没有尝试,但我完全失去了80%而没有给圆圈半径的条件。

更新

我尝试了以下内容:

import matplotlib.pyplot as plt

x=[1, 1.15, 1.23, 0.92, 1.31, 1.18, 1.27, 1.07, 3, 3.2]

y=[1.17, 0.95, 1.04, 1.32, 1, 1.22, 1.28, 0.99, 1, 1.2]

plt.plot(x, y, 'bo')
circle=plt.Circle((1.1, 1.12), 0.2, color='g', fill=False)
fig = plt.gcf()
fig.gca().add_artist(circle)
plt.axis([0, 3.5, 0, 3.5])
plt.show()

这是我想要获得的情节:

plot_I_want_to_obtain

在这个例子中我有10个点,圆圈是最小的圆圈,里面有8个点。我用眼睛做了这个例子,但我想要的是:给定x和y,得到圆的参数(中心位置和半径),这些参数匹配至少80%的点在其中的条件,即,如何成为包含至少80%积分的最小圆圈。这可能吗?

3 个答案:

答案 0 :(得分:5)

正如其他人所说,你可以绘制许多不同的圆圈来获得所要求的结果。但是,这样做的一种快速而肮脏的方法可能是:

import numpy as np
import matplotlib.pyplot as plt

# generate some random points
n = 1000
x = 4 * np.random.randn(n) + 15
y = 2 * np.random.randn(n) + 10

# somehow compute center of cloud, use e.g. medium or mean
x0 = np.median(x)
y0 = np.median(y)

# compute radius
r = np.sqrt((x - x0)**2 + (y - y0)**2)
t = 80 # percent
r0 = np.percentile(r, t)
n_within = (r < r0).sum()

# make plot    
plt.plot(x, y, '.')
circle = plt.Circle((x0, y0), r0, color='r', fill=False)
plt.gca().add_artist(circle)
plt.title('Found center at ({:.2f}, {:.2f})\n'
          '{}% radius is {:.2f}\n'
          '{} / {} points within circle'.format(
          x0, y0, t, r0, n_within, n))
plt.axis([0, 30, 0, 20])
plt.show()

结果:

enter image description here

答案 1 :(得分:1)

你问的算法问题多于python问题。而且我会说这个提案是最优的FAR,但它可能会帮助你开始正确的道路。

您可以考虑随机搜索。选择一个随机点并绘制一些随机半径的圆圈,该点位于中心。计算圆圈中的点数并选择最佳点。

您选择了多少个点,您绘制了多少个圆以及半径取决于您。你尝试的越多,你就越有可能在没有超越的情况下接近你的80%。如果没有一些初步的数据探索,你应该尝试什么价值我不能推荐。你尝试的越多,它的计算成本就会越高。这一切都取决于尽可能接近80%的数字是多么重要。

答案 2 :(得分:1)

因为您只是想要删除外围点,这应该可行,但可能会使用不寻常的数据做奇怪的事情

快速正脏:

  • 对于数据集中的每个点,计算从数据集中每个点到该点的平均距离。
  • 选择平均距离最小的点作为圆心。
  • 距离中心最远的距离,并称之为半径。
  • 缩小半径,直到圆圈内的点数少于80%。

替代:

  • 对于数据集中的每个点,计算从数据集中的每个点到该点的平均距离。存储此号码,然后根据它对点进行排序。
  • 从此列表中删除前20%。
  • 围绕其余点安装一个圆圈。