import numpy as np
from matplotlib.patches import Ellipse
import matplotlib.transforms as transforms
[docs]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.sqrt(cov[0, 0]) * n_std
mean_x = np.mean(x)
# calculating the stdandard deviation of y ...
scale_y = np.sqrt(cov[1, 1]) * n_std
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)
[docs]def latex_packages():
L = []
L.append(r"\documentclass{article}")
L.append(r"\usepackage{float}")
L.append(r"\usepackage{amsmath}")
L.append(r"\usepackage{amssymb}")
L.append(r"\usepackage{booktabs}")
L.append(r"\usepackage[a4paper]{geometry}")
L.append(r"\usepackage{array}")
L.append(r"\usepackage{hyperref}")
L.append(r"\usepackage{xcolor}")
L.append(r"\usepackage{multirow}")
L.append(r"\usepackage{pdflscape}")
L.append(r"\allowdisplaybreaks")
L.append(
r"\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}"
)
L.append(r"\usepackage{graphicx}")
L.append(r"\usepackage{tabularx}")
L.append(
r"\geometry{verbose, tmargin = 1.5cm, bmargin = 1.5cm, lmargin = 1cm, rmargin = 1cm}"
)
return L