matplotlib 椭圆包围点

问题描述 投票:0回答:1

如何找到将所有点放置在椭圆中的理想角度?我想创建一个围绕图形上所有点的椭圆,具有最小尺寸的椭圆(这意味着最远的点将在椭圆的图形上)。

'

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse

# Données des points (abscisses et ordonnées)
x = [1, 2, 3, 4, 5]
y = [7, 12, 15, 19, 25]

# Calculer les moyennes des abscisses et ordonnées
centre_x = np.mean(x)
centre_y = np.mean(y)

# Calculer les écarts entre chaque point et le centre
dx = np.abs(x - centre_x)
dy = np.abs(y - centre_y)

# Trouver les valeurs maximales des écarts
max_dx = np.max(dx)
max_dy = np.max(dy)

# Utiliser ces valeurs pour définir la largeur et la hauteur de l'ellipse
largeur = 2 * max_dx
hauteur = 2 * max_dy

# Calculer l'angle idéal (en radians)
angle_rad = np.arctan2(max_dy, max_dx)

# Convertir l'angle en degrés
angle_deg = np.degrees(angle_rad)

# Créer l'ellipse
ellipse = Ellipse((centre_x, centre_y), largeur, hauteur, angle=angle_deg, fill=False, color='red')

# Créer un nuage de points avec des couleurs aléatoires pour chaque point
plt.scatter(x, y, c=np.random.rand(len(x), 3))

# Ajouter l'ellipse au graphique
plt.gca().add_patch(ellipse)

# Afficher le graphique
plt.show()

'

我有椭圆的大小,但没有找到匹配的角度。

python matplotlib point ellipse
1个回答
0
投票

IIUC,您想要最小包围椭圆体体积。如果是这样,您可以使用 QInfer

 中的 
mvee:

import matplotlib.pyplot as plt
import numpy as np
from qinfer.utils import mvee
from scipy import linalg


def get_mvee(points):
    A, centroid = mvee(points)
    U, D, V = linalg.svd(A)
    radii = [1 / np.sqrt(d) for d in D]

    u = np.linspace(0, 2 * np.pi, 100)
    x = radii[0] * np.cos(u)
    y = radii[1] * np.sin(u)

    return V.T @ np.vstack([x, y]) + centroid[:, None]


x = [1, 2, 3, 4, 5]
y = [7, 12, 15, 19, 25]
points = np.c_[x, y]
ellipse = get_mvee(points)

fig, ax = plt.subplots()
ax.scatter(*points.T, marker=".", color="r", zorder=3)
ax.plot(*ellipse)
ax.patch.set_facecolor("whitesmoke")
ax.grid(True)

plt.show();

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.