Fonction pour tracer une ellipse de confiance en python

Voici une fonction à copier-coller qui s'inspire de celle de la source suivante :

  • Cette fonction est présentée sous la forme d'un exemple dans la page suivante : tracer une ellipse de confiance.

import numpy as np

import matplotlib.pyplot as plt

from matplotlib.patches import Ellipse

import matplotlib.transforms as transforms


def confidence_ellipse(x, y, ax, n_std=3.0, facecolor='none', **kwargs):

"""

Create a plot of the covariance confidence ellipse of `x` and `y`

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

"""

if x.size != y.size:

raise ValueError("x and y must be the same size")

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.std(x)

mean_x = np.mean(x)

# calculating the stdandard deviation of y ...

scale_y = np.std(y)

mean_y = np.mean(y)

transf = transforms.Affine2D() \

.rotate_deg(45) \

.scale(scale_x, scale_y) \

.translate(mean_x, mean_y)

ellipse.set_transform(transf + ax.transData)

return ax.add_patch(ellipse)