在seaborn kdeplot中设置置信水平

时间:2016-02-05 13:21:39

标签: python matplotlib seaborn

我对seaborn来说是全新的,所以如果这是一个简单的问题,请道歉,但我无法在文档中找到有关如何在kdeplot中控制n_levels绘制的关卡的描述。这是一个例子:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

x,y=np.random.randn(2,10000)

fig,ax=plt.subplots()
sns.kdeplot(x,y, shade=True,shade_lowest=False, ax=ax,n_levels=3,cmap="Reds")
plt.show()

这是结果图:Image

我希望能够知道显示的置信水平,以便我可以标记我的情节"阴影区域显示(a,b,c)百分比置信区间。"我会天真地假设n_levels与某种方式相关的" sigmas"在高斯中,但是从看起来并非如此的例子来看。

理想情况下,我希望能够通过将元组传递给kdeplot来指定显示的间隔,例如:

levels=[68,95,99]

并绘制这些置信区域。

编辑:感谢@Goyo和@tom,我想我可以澄清一下我的问题,然后来找我正在寻找的答案。如上所述,n_levels作为plt.cotourf传递给levels,因此可以传递 列表。但sns.kdeplot绘制了PDF,而PDF中的值与我正在寻找的置信区间不对应(因为这些对应于PDF的集成)。

我需要做的是传递sns.kdeplot集成(和标准化)PDF的x,y值,然后我就可以输入例如n_levels=[0.68,0.95,0.99,1]

编辑2:我现在已经解决了这个问题。见下文。我使用2d标准直方图来定义置信区间,然后我将其作为级别传递给标准kde图。为重复而道歉,我可以创建一个函数来返回级别,但我明确地输入了它。

import numpy as np
import scipy.optimize
import matplotlib.pyplot as plt
import seaborn as sns

# Generate some random data
x,y=np.random.randn(2,100000)

# Make a 2d normed histogram
H,xedges,yedges=np.histogram2d(x,y,bins=40,normed=True)

norm=H.sum() # Find the norm of the sum
# Set contour levels
contour1=0.99
contour2=0.95
contour3=0.68

# Set target levels as percentage of norm
target1 = norm*contour1
target2 = norm*contour2
target3 = norm*contour3

# Take histogram bin membership as proportional to Likelihood
# This is true when data comes from a Markovian process
def objective(limit, target):
    w = np.where(H>limit)
    count = H[w]
    return count.sum() - target

# Find levels by summing histogram to objective
level1= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target1,))
level2= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target2,))
level3= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target3,))

# For nice contour shading with seaborn, define top level
level4=H.max()
levels=[level1,level2,level3,level4]

# Pass levels to normed kde plot
fig,ax=plt.subplots()
sns.kdeplot(x,y, shade=True,ax=ax,n_levels=levels,cmap="Reds_d",normed=True)
ax.set_aspect('equal')
plt.show()

结果图现在如下:kde with confidence levels

水平略高于我的预期,但我认为这是正确的。

2 个答案:

答案 0 :(得分:1)

水平不是保密间隔或西格玛,而是估计的pdf的值。您能够将级别作为列表传递给n_levels。​​

修改

Seaborn只是情节。它不会给你估计的pdf,只是matplotlib轴。因此,如果你想用kde pdf进行计算,你必须自己估算它。

Seaborn在引擎盖下使用statsmodels或scipy,所以你也可以这样做。 Statsmodels也可以给你cdf如果这是你正在寻找的(也许scipy但我不确定)。您可以计算您感兴趣的级别,在网格中评估pdf并将所有内容传递给contourf,这或多或少是seaborn所做的。

不幸的是我不够熟练你给我更多的建议(我只是偶尔使用statsmodels进行OLS回归)但是你可以查看kdeplot的代码并弄清楚。

答案 1 :(得分:-2)

我刚遇到同样的问题。我不明白的是,为什么信心等级,以及当更改箱数时情节会发生变化。您在直方图中选择了bin = 40,但如果您更改它,则会得到不同的图。