在 seaborn distplot KDE 估计中限制 x 的范围

Posted

技术标签:

【中文标题】在 seaborn distplot KDE 估计中限制 x 的范围【英文标题】:Limit the range of x in seaborn distplot KDE estimation 【发布时间】:2018-02-05 07:02:04 【问题描述】:

假设我们有一个数字介于 0 和 1 之间的数组:

arr=np.array([ 0.        ,  0.        ,  0.        ,  0.        ,  0.6934264 ,
               0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
               0.        ,  0.        ,  0.6934264 ,  0.        ,  0.6934264 ,
               0.        ,  0.        ,  0.        ,  0.        ,  0.251463  ,
               0.        ,  0.        ,  0.        ,  0.87104906,  0.251463  ,
               0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
               0.        ,  0.        ,  0.        ,  0.        ,  0.48419626,
               0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
               0.87104906,  0.        ,  0.        ,  0.251463  ,  0.48419626,
               0.        ,  0.251463  ,  0.        ,  0.        ,  0.        ,
               0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
               0.        ,  0.251463  ,  0.        ,  0.35524532,  0.        ,
               0.        ,  0.        ,  0.        ,  0.        ,  0.251463  ,
               0.251463  ,  0.        ,  0.74209813,  0.        ,  0.        ])

使用seaborn,我想绘制一个分布图:

sns.distplot(arr, hist=False)

这将为我们提供下图:

如您所见,kde 估计值的范围在 -0.20 到 1.10 附近。是否可以强制估计在 0 和 1 之间?我试过以下没有运气:

sns.distplot(arr, hist=False, hist_kws='range': (0.0, 1.0))
sns.distplot(arr, hist=False, kde_kws='range': (0.0, 1.0))

第二行引发异常——range 不是kde_kws 的有效关键字。

【问题讨论】:

我很困惑,因为 seaborn 0.8.1 sns.distplot(arr, hist=False) 给了我一个不同的情节:曲线排除了零,就好像它不是 arr 的一部分一样。 【参考方案1】:

事先设置plt.xlim(0, 1) 应该会有所帮助:

plt.xlim(0, 1)
sns.distplot(arr, hist=False)

【讨论】:

这里的“plt”是什么?是否有隐含的import matplotlib.pyplot as plt【参考方案2】:

这样做的正确方法是使用clip 关键字而不是range

sns.distplot(arr, hist=False, kde_kws='clip': (0.0, 1.0))

这将产生:

确实,如果你只关心kde而不关心直方图,你可以使用kdeplot函数,它会产生同样的结果:

sns.kdeplot(arr, clip=(0.0, 1.0))

【讨论】:

这实际上是重新计算kde还是只是切断范围之外的部分? 有没有办法在 KernelDensity.fit() 函数上做到这一点? 它确实会重新计算 kde @Peaceful @R.Cox :我认为不是。我尝试在有和没有剪辑的情况下绘制 kde,它们只是重叠。 你说得对,它不会重新计算 kde;你的两条曲线重叠。我将它用于不同的应用程序,在这种情况下它正在改变。我刚刚尝试了问题中的代码,它给了我一个完全不同的图表。在我的电脑上,它现在正在使用更小的垃圾箱!

以上是关于在 seaborn distplot KDE 估计中限制 x 的范围的主要内容,如果未能解决你的问题,请参考以下文章

kde plot : UserWarning: Dataset has 0 variance;跳跃密度估计

seaborn使用(绘图函数)

seaborn distplot中的y轴是啥?

seaborn#3 单变量分析绘图

seaborn分布图---单分布双分布

Seaborn 概率直方图 - KDE 归一化