Изменение размера графика в Matplotlib для соответствия эллипсам - PullRequest
0 голосов
/ 08 октября 2019

Я строю доверительные эллипсы для равномерно распределенных точек. При построении эллипса и диаграммы рассеяния с использованием Matplotlib я обнаружил, что часть эллипсов обрезана по вспомогательному графику. До сих пор я пытался изменить размеры рисунков, но это не меняет график.

Как изменить размер графика, чтобы он соответствовал эллипсам на отображаемом графике?

Код длягенерировать эллипсы: изменено снизу ссылка
многомерные доверительные интервалы

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
from scipy.stats import norm, chi2
sns.set()

def cov_ellipse(cov, q=None, nsig=None, ax=None, **kwargs):

    if q is not None:
        q = np.asarray(q)
    elif nsig is not None:
        q = 2 * norm.cdf(nsig) - 1
    else:
        raise ValueError('One of `q` and `nsig` should be specified.')
    r2 = chi2.ppf(q, 2)

    val, vec = np.linalg.eigh(cov)
    width, height = 2 * np.sqrt(val[:, None] * r2)
    rotation = np.degrees(np.arctan2(*vec[::-1, 0]))

    return ellipse_plot(width, height, rotation, ax, **kwargs)

def ellipse_plot(width, height, rotation, ax=None, **kwargs):

    if ax is None:
        ax = plt.gca()
    ellip = Ellipse(xy=points.mean(axis=0), width=width, height=height, angle=rotation, **kwargs)
    ax.add_patch(ellip)
    return ellip

if __name__ == '__main__':
    #-- Example usage -----------------------
    # Generate some random, correlated data
    mu = [50, 105]
    omega = np.array([1, 0.2, 0.2, 0.5]).reshape((2, 2))

    points = np.random.multivariate_normal(mu, omega, 1000)
    x1 = np.random.uniform(40, 60, 1000)
    y1= np.random.uniform(100, 120, 1000)
    points1 = np.random.uniform(40,60,[1000,2])
    cov = np.cov(points1, rowvar=False)
    plt.figure(figsize=(4, 3))
    plt.plot(x1, y1, 'ro', alpha=0.5)
    # Plot a transparent 3 standard deviation covariance ellipse
    cov_ellipse(cov, q=None, nsig=2, color='green', alpha=0.3)
    cov_ellipse(cov, q=None, nsig=1, color='red', alpha=0.3)
    cov_ellipse(cov, q=None, nsig=3, color='blue', alpha=0.3)
    #sns.jointplot(points[:,0], points[:,1])
    sns.jointplot(x1,y1)
    plt.show()
...