Я могу нарисовать красивый (гладкий и правильный с точки зрения того, что я хотел бы) эллипс, используя matplotlib.patches.Ellipse
Я хотел бы получить координаты гладкого эллипса (a набор координат х и у). Когда я получаю доступ к вершинам эллипса, я получаю очень грубую форму, например, единичный круг на изображении под кодом.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import matplotlib.transforms as transforms
def confidence_ellipse(cov,center, ax, n_std=1.0, facecolor='none', **kwargs):
"""
Create a plot of the covariance confidence ellipse of `x` and `y`
adapted from:
https://matplotlib.org/3.1.0/gallery/statistics/confidence_ellipse.html
Parameters
----------
x, y : array_like, shape (n, )
Input data.
ax : matplotlib.axes.Axes
The axes object to draw the ellipse into.
n_std : float
The number of standard deviations to determine the ellipse's radiuses.
Returns
-------
matplotlib.patches.Ellipse
Other parameters
----------------
kwargs : `~matplotlib.patches.Patch` properties
"""
#cov = np.cov(x, y)
pearson = cov[0, 1]/np.sqrt(cov[0, 0] * cov[1, 1])
# Using a special case to obtain the eigenvalues of this
# two-dimensionl dataset.
ell_radius_x = np.sqrt(1 + pearson)
ell_radius_y = np.sqrt(1 - pearson)
ellipse = Ellipse((0, 0),
width=ell_radius_x * 2,
height=ell_radius_y * 2,
facecolor=facecolor,
**kwargs)
# Calculating the stdandard deviation of x from
# the squareroot of the variance and multiplying
# with the given number of standard deviations.
scale_x = np.sqrt(cov[0, 0]) * n_std
mean_x = center[0]#np.mean(x)
# calculating the stdandard deviation of y ...
scale_y = np.sqrt(cov[1, 1]) * n_std
mean_y = center[1]
transf = transforms.Affine2D() \
.rotate_deg(45) \
.scale(scale_x, scale_y) \
.translate(mean_x, mean_y)
ellipse.set_transform(transf + ax.transData)
# Get the path
path = ellipse.get_path()
# Get the list of path vertices
vertices = path.vertices.copy()
# Transform the vertices so that they have the correct coordinates
xx,yy=vertices.T
return ellipse,xx,yy#ax.add_patch(ellipse)
ax=plt.subplot(111)
cov1 = np.array([[0.2779001, -0.1037428],[-0.1037428 , 0.1353510]])
center1 = np.array([-0.02561743,0.20181786])
ellipse1,xl1,yl1 =confidence_ellipse(cov1,center1, ax, edgecolor='red')
plt.plot(xl1,yl1,color='red')
ax.add_patch(ellipse1)
plt.savefig('ellipse_test_help.pdf')
plt.close()
Гладкий эллипс и форма, которую я получаю, используя вершины