seaborn distplot中的y轴是什么?

Mis*_*ter 30 python matplotlib seaborn

我有一些几何分布的数据.当我想看一下时,我会用

sns.distplot(data, kde=False, norm_hist=True, bins=100)
Run Code Online (Sandbox Code Playgroud)

结果是一张图片:

图1a

但是,箱柜高度不等于1,这意味着y轴不显示概率,它是不同的.相反,我们使用

weights = np.ones_like(np.array(data))/float(len(np.array(data)))
plt.hist(data, weights=weights, bins = 100)
Run Code Online (Sandbox Code Playgroud)

y轴应显示概率,因为箱高度总和为1:

情节1b

这里可以更清楚地看到:假设我们有一个列表

l = [1, 3, 2, 1, 3]
Run Code Online (Sandbox Code Playgroud)

我们有两个1,两个3和一个2,所以它们各自的概率是2/5,2/5和1/5.当我们使用带有3个箱子的seaborn histplot时:

sns.distplot(l, kde=False, norm_hist=True, bins=3)
Run Code Online (Sandbox Code Playgroud)

我们得到:

情节2a

如您所见,第1和第3个bin总和达到0.6 + 0.6 = 1.2,已经大于1,因此y轴不是概率.当我们使用

weights = np.ones_like(np.array(l))/float(len(np.array(l)))
plt.hist(l, weights=weights, bins = 3)
Run Code Online (Sandbox Code Playgroud)

我们得到:

在此输入图像描述

并且y轴是概率,如预期的那样为0.4 + 0.4 + 0.2 = 1.

对于每种情况下使用的两种方法,这两种情况中的箱的数量是相同的:对于几何分布的数据,100个箱,对于具有3个可能值的小阵列l,3个箱.所以箱子数量不是问题.

我的问题是:在用norm_hist = True调用的seaborn distplot中,y轴是什么意思?

Pra*_*ann 21

x 轴是变量的值,就像在直方图中一样,但 y 轴到底代表什么?

ANS->密度图中的 y 轴是核密度估计的概率密度函数。但是,我们需要小心地指定这是概率密度而不是概率。区别在于概率密度是 x 轴上每单位的概率。要转换为实际概率,我们需要找到 x 轴上特定区间的曲线下面积。有点令人困惑,因为这是概率密度而不是概率,y 轴可以取大于 1 的值。密度图的唯一要求是曲线下的总面积积分为 1。我通常倾向于将密度图上的 y 轴视为仅用于不同类别之间相对比较的值。

来自https://towardsdatascience.com/histograms-and-density-plots-in-python-f6bda88f5ac0的参考


Ion*_*ons 19

文档:

norm_hist:bool,可选

如果为True,则直方图高度显示密度而不是计数.如果绘制KDE或拟合密度,则暗示这一点.

因此,您还需要考虑您的箱宽,即计算曲线下面积,而不仅仅是箱高的总和.

  • @IonicSolutions谢谢,我之前阅读过文档,但从未理解过这意味着什么。奇怪的是,seaborn或matplotlib没有提供开箱即用的“ x值与概率”图,其中每个bin是一个不同的值,而y轴测量该值的概率,所有概率的总和为1。将会是一个非常有用的情节,我们真的需要像我在这里一样手动进行吗?... (5认同)
  • MattS 是对的, `KDE` 默认是 True ,需要设置 `KDE=False,norm_hist=False` (3认同)
  • 正如我刚才写的那样,这里是第二个例子的数字:bin宽度是`l =(3-1)/3=0.6666 ...`和直方图区域的总和是`s =(0.6 + 0.3 + 0.6)*l = 1`,因此从这个意义上说,归一化是正确的. (2认同)
  • 如果您仍然不希望其总和为 1,请添加权重。但是,如果您添加 KDE,它将不起作用,因为 KDE 会强制norm_hist=True 并覆盖您的权重!所以不可能让 KDE 和 sum 都为 1。 (2认同)