seaborn distplot中的y轴是什么?

67

我有一些几何分布的数据。当我想查看它时,我使用

sns.distplot(data, kde=False, norm_hist=True, bins=100)

其结果是一张图片:

Plot 1a

然而,柱状图的高度不相加等于1,这意味着y轴并未显示概率,而是另一种不同的结果。如果我们使用

weights = np.ones_like(np.array(data))/float(len(np.array(data)))
plt.hist(data, weights=weights, bins = 100)

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

Plot 1b

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

l = [1, 3, 2, 1, 3]

我们有两个1,两个3和一个2,所以它们各自的概率分别为2/5、2/5和1/5。当我们使用seaborn histplot 的3个bin时:

sns.distplot(l, kde=False, norm_hist=True, bins=3)

我们得到:

Plot 2a

正如您所看到的,第1个和第3个箱子的总和已经达到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)
我们得到:

enter image description here

而y轴是概率,因为0.4+0.4+0.2=1,符合预期。
这两种情况中使用的方法的条形数是相同的:对于几何分布数据,使用的方法都是100个条形;对于具有3个可能值的小数组l,使用的方法都是3个条形。因此,条形数不是问题。
我的问题是:在使用norm_hist=True调用seaborn distplot时,y轴的含义是什么?
3个回答

33

根据文档:

norm_hist : bool, 可选参数

如果为True,则直方图高度显示密度而不是计数。如果绘制了KDE或拟合的密度,则会隐含此选项。

因此,您还需要考虑到您的条形区间宽度,即计算曲线下面积而不仅仅是条形高度之和。


5
正如我即将要写的那样,这是第二个例子的数字:直方图的箱宽为l=(3-1)/3=0.6666...,直方图箱子面积之和为s=(0.6+0.3+0.6)*l=1,因此在这种意义上,归一化是正确的。 - Thomas Kühn
9
@IonicSolutions 谢谢,我之前阅读过文档,但从未理解其含义。奇怪的是,seaborn 或 matplotlib 没有提供一个开箱即用的“x值 vs 概率”图,其中每个箱都是一个独特的值,y轴测量该值的概率,所有概率加起来等于1。这将是一个非常有用的图,难道我们真的需要像我这样手动完成吗?... - Mister Twister
@MisterTwister 开一个新问题。 - borgr
2
如果您仍然不希望它总和为1,则可以添加权重。但是,如果您添加KDE,则不起作用,因为KDE会强制norm_hist=True并覆盖您的权重!因此无法同时具有KDE和总和为1。 - MattS
3
MattS是正确的,“KDE”默认为True,需要设置“KDE=False,norm_hist=False”。 - Mithril

25

在密度图中,x轴表示变量的值,就像直方图一样,但是y轴具体代表什么意思呢?

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

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


0

这段代码将帮助您制作类似于此的内容:

sns.set_style("whitegrid")
ax = sns.displot(data=df_p,
                 x='Volume_Tonnes', kind='kde', fill=True, height=5, aspect=2)
# Here you can define the x limit    
ax.set(xlim=(-50,100))
ax.set(xlabel = 'Volume Tonnes', ylabel = 'Probability Density')
ax.fig.suptitle("Volume Tonnes Distribution",
                fontsize=20, fontdict={"weight": "bold"})
plt.show()

Distplot image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接