使用matplotlib在sccatterplot中创建置信度椭圆

296*_*502 19 python numpy matplotlib scipy

如何使用matplotlib在sccatterplot中创建Confidence Ellipses?

以下代码适用于创建散点图.那么,是否有人熟悉将置信椭圆置于散点图上?

import numpy as np
import matplotlib.pyplot as plt
x = [5,7,11,15,16,17,18]
y = [8, 5, 8, 9, 17, 18, 25]

plt.scatter(x,y)
plt.show()
Run Code Online (Sandbox Code Playgroud)

以下是SAS的Confidence Ellipses的参考.

http://support.sas.com/documentation/cdl/en/grstatproc/62603/HTML/default/viewer.htm#a003160800.htm

sas中的代码是这样的:

proc sgscatter data=sashelp.iris(where=(species="Versicolor"));
  title "Versicolor Length and Width";
  compare y=(sepalwidth petalwidth)
          x=(sepallength petallength)
          / reg ellipse=(type=mean) spacing=4;
run;
Run Code Online (Sandbox Code Playgroud)

Jai*_*ime 25

以下代码绘制一个,两个和三个标准差大小的省略号:

x = [5,7,11,15,16,17,18]
y = [8, 5, 8, 9, 17, 18, 25]
cov = np.cov(x, y)
lambda_, v = np.linalg.eig(cov)
lambda_ = np.sqrt(lambda_)
from matplotlib.patches import Ellipse
import matplotlib.pyplot as plt
ax = plt.subplot(111, aspect='equal')
for j in xrange(1, 4):
    ell = Ellipse(xy=(np.mean(x), np.mean(y)),
                  width=lambda_[0]*j*2, height=lambda_[1]*j*2,
                  angle=np.rad2deg(np.arccos(v[0, 0])))
    ell.set_facecolor('none')
    ax.add_artist(ell)
plt.scatter(x, y)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 可以确认这个例子计算角度不正确;正确的角度计算为“angle= np.rad2deg(np.arctan2(*v[:,0][::-1]))” (4认同)

小智 23

在给出接受的答案之后,我发现它在计算theta时没有正确选择象限,因为它依赖于np.arccos:

哎呀

看看'可能重复'Joe Kington在github上的解决方案,我把他的代码浇灌到了这个:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

def eigsorted(cov):
    vals, vecs = np.linalg.eigh(cov)
    order = vals.argsort()[::-1]
    return vals[order], vecs[:,order]

x = [5,7,11,15,16,17,18]
y = [25, 18, 17, 9, 8, 5, 8]

nstd = 2
ax = plt.subplot(111)

cov = np.cov(x, y)
vals, vecs = eigsorted(cov)
theta = np.degrees(np.arctan2(*vecs[:,0][::-1]))
w, h = 2 * nstd * np.sqrt(vals)
ell = Ellipse(xy=(np.mean(x), np.mean(y)),
              width=w, height=h,
              angle=theta, color='black')
ell.set_facecolor('none')
ax.add_artist(ell)
plt.scatter(x, y)
plt.show()
Run Code Online (Sandbox Code Playgroud)

负斜率

  • 有谁知道如何将其推广到3D(或n维)? (2认同)