Координаты эллипса в матплотлибе - PullRequest
0 голосов
/ 05 марта 2020

Я могу нарисовать красивый (гладкий и правильный с точки зрения того, что я хотел бы) эллипс, используя 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()

Гладкий эллипс и форма, которую я получаю, используя вершины

...