【问题标题】:Draw ellipses around points在点周围画椭圆
【发布时间】:2015-08-21 07:52:01
【问题描述】:

我正在尝试使用 matplotlib 在图表上的一组点周围绘制椭圆。我想得到这样的东西:

一个组的数据集(例如红色的)可能如下所示:

[[-23.88315146  -3.26328266]  # first point
 [-25.94906669  -1.47440904]  # second point
 [-26.52423229  -4.84947907]]  # third point

我可以很容易地在图表上绘制点,但在绘制椭圆时遇到了问题。

椭圆的直径为2 * standard deviation,其中心坐标为(x_mean, y_mean)。一个椭圆的宽度等于x standard deviation * 2。它的高度等于y standard deviation * 2

但是,我不知道如何计算椭圆的角度(您可以在图片上看到椭圆不是完全垂直的)。

你知道怎么做吗?

注意: 这个问题是 LDA 问题(线性判别分析)的简化。我正在尝试将问题简化为最基本的表达方式。

【问题讨论】:

    标签: python matplotlib geometry ellipse


    【解决方案1】:

    这是一个经过充分研究的问题。先取点集合的convex hull 你想附上。然后按照文献中的描述执行计算。 我在下面提供了两个来源。

    “最小的封闭椭圆——C++ 中的精确和通用实现”(abstract link)。



    查尔斯·F·范·洛恩。 “使用椭圆来拟合和包围数据点。” (PDF download)。

    【讨论】:

      【解决方案2】:

      这与数学有关,而不是编程;)

      既然你已经有了尺寸并且只想找到角度,这就是我要做的(基于我的直觉):

      尝试找到最适合给定点集的线(趋势线),这也称为Linear Regression。有几种方法可以做到这一点,但 最小二乘法 方法相对简单(见下文)。

      找到最佳拟合线后,您可以使用斜率作为角度。

      最小二乘线性回归

      最小二乘线性回归方法用于找到趋势线的斜率,正是我们想要的。

      这是video explaining how it works

      假设您有一个数据集:data = [(x1, y1), (x2, y2), ...]

      使用最小二乘法,您的斜率将是:

      # I see in your example that you already have x_mean and y_mean
      # No need to calculate them again, skip the two following lines
      # and use your values in the rest of the example
      avg_x = sum(element[0] for element in data)/len(data)
      avg_y = sum(element[1] for element in data)/len(data)
      
      x_diff = [element[0] - avg_x for element in data]
      y_diff = [element[1] - avg_y for element in data]
      
      x_diff_squared = [element**2 for element in x_diff]
      
      slope = sum(x * y for x,y in zip(x_diff, y_diff)) / sum(x_diff_squared)
      

      一旦你有了它,你就差不多完成了。斜率等于角度的正切slope = tan(angle)

      使用 python 的 math 模块 angle = math.atan(slope) 这将返回以弧度表示的角度。如果你想要它的度数,你必须使用 math.degrees(angle) 转换它

      将它与你已有的尺寸和位置结合起来,你就得到了一个椭圆;)


      这就是我解决这个特定问题的方法,但可能还有一千种不同的方法也可以奏效 并且最终可能会比我建议的更好(也更复杂)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 2016-02-11
        相关资源
        最近更新 更多