Dav*_*rsh 5 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()
Run Code Online (Sandbox Code Playgroud)
这是结果图: 
我希望能够知道显示了哪些置信度,这样我就可以将图标记为“阴影区域显示(a,b,c)百分比置信区间”。我会天真地假设n_levels以某种方式与高斯中的等效“ sigmas”相关,但是从示例看来,情况并非如此。
理想情况下,我希望能够通过将元组传递给kdeplot来指定显示的间隔,例如:
levels=[68,95,99]
Run Code Online (Sandbox Code Playgroud)
并绘制这些置信区域。
编辑:感谢@Goyo和@tom,我想我可以澄清我的问题,并半路寻找我要的答案。如前所述,n_levels传递给plt.cotourfas levels,因此可以传递列表。但是sns.kdeplot绘制PDF时,PDF中的值不对应于我要寻找的置信区间(因为这些对应于PDF的积分)。
我需要做的是通过sns.kdeplot在x,y集成(和标准化)PDF的值,然后我就可以进入如n_levels=[0.68,0.95,0.99,1]。
编辑2:我现在已经解决了这个问题。见下文。我使用二维规范化直方图定义置信区间,然后将其作为级别传递给规范化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()
Run Code Online (Sandbox Code Playgroud)
现在生成的图如下: 
水平比我预期的要宽一些,但是我认为这是正确的。
这些水平不是置信区间或西格玛,而是估计 pdf 的值。您可以将级别作为列表而不是 n_levels 传递。
编辑
Seaborn 只是策划事情。它不会给你估计的 pdf,只是一个 matplotlib 轴。因此,如果您想使用 kde pdf 进行计算,您必须自己估计。
Seaborn 在底层使用 statsmodels 或 scipy,因此您也可以做同样的事情。如果您正在寻找的话,Statsmodels 也可以为您提供 cdf(也许还有 scipy,但我不确定)。您可以计算您感兴趣的级别,评估网格中的pdf并将所有内容传递给contourf,这或多或少是seaborn所做的。
不幸的是,我不够熟练,你可以给你更多关于这方面的建议(我只是时不时地使用 statsmodels 进行 OLS 回归),但你可以查看代码kdeplot并弄清楚。
| 归档时间: |
|
| 查看次数: |
2882 次 |
| 最近记录: |