如何计算密度直方图中的高度(它们总和不为 1)?
How are the heights in a density histogram calculated (they don't sum up to 1)?
我想通过绘制 distplot 来可视化数据。
我有如下 python 代码,但我不明白如何计算 y 轴
为什么x=2对应y=0.3,x=1对应y=0.6?
谁能帮我算一下计算公式?
import seaborn as sns
l = [1,3,2,1,3]
sns.distplot(l, kde=True, bins=3)
请注意 seaborn.distplot
is deprecated, use seaborn.displot
而不是(没有 t)。
它将默认显示计数,而不是您问题中的 密度:
import seaborn as sns
l = [1,3,2,1,3]
sns.displot(l, kde=True, bins=3)
输出:
就是说,如果你想要密度(意味着条形的总面积为 1),请添加 stat='density'
参数:
import seaborn as sns
l = [1,3,2,1,3]
sns.displot(l, kde=True, bins=3, stat="density")
probability density function (pdf in short) 只对连续分布有意义,对离散分布没有意义,尤其是当只有几个值时。
当数值离散时,应避免bin边界与值重合,以避免边界处的值准任意地落入一个bin或另一个bin。
如果您设置 bins=3
,则计算 4 个边界,均匀分布在最小值和最大值 x 之间,因此在 1, 1.667, 2.33, 3
。这不是离散分布的好选择。更好的选择是 0.5, 1.5, 2.5, 3.5
。添加参数 discrete=True
会自动选择这些边界,但仅适用于 distplot
的新版本,即 histplot
.
如果您设置 stat='density'
,直方图的总 面积 (或 kde,是 连续 的近似值pdf) 将是 1。对于 discrete=False
,垃圾箱是 0.667
宽。要获得 1 的 面积 ,高度总和应为 1/0.667=1.5
(sum(heights)*width = 1
)。这个度量在这里没有多大意义(在 1 和 1.667 之间,概率为 0.6*0.667,等等)。对于宽度为 1
的 bin,高度应为 1
(sum(heights)*width = 1
)。这里的高度表示每个值的比例(1 概率为 0.4,2 概率为 0.2)。
以下代码将 stat='density'
与 discrete=True
与 False
.
进行比较
import matplotlib.pyplot as plt
import seaborn as sns
l = [1, 3, 2, 1, 3]
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 4))
sns.histplot(l, bins=3, discrete=False, stat='density', ax=ax1)
ax1.set_title('the default (discrete=False)')
sns.histplot(l, bins=3, discrete=True, stat='density', ax=ax2)
ax2.set_title('with discrete=True')
我想通过绘制 distplot 来可视化数据。
我有如下 python 代码,但我不明白如何计算 y 轴
为什么x=2对应y=0.3,x=1对应y=0.6? 谁能帮我算一下计算公式?
import seaborn as sns
l = [1,3,2,1,3]
sns.distplot(l, kde=True, bins=3)
请注意 seaborn.distplot
is deprecated, use seaborn.displot
而不是(没有 t)。
它将默认显示计数,而不是您问题中的 密度:
import seaborn as sns
l = [1,3,2,1,3]
sns.displot(l, kde=True, bins=3)
输出:
就是说,如果你想要密度(意味着条形的总面积为 1),请添加 stat='density'
参数:
import seaborn as sns
l = [1,3,2,1,3]
sns.displot(l, kde=True, bins=3, stat="density")
probability density function (pdf in short) 只对连续分布有意义,对离散分布没有意义,尤其是当只有几个值时。
当数值离散时,应避免bin边界与值重合,以避免边界处的值准任意地落入一个bin或另一个bin。
如果您设置 bins=3
,则计算 4 个边界,均匀分布在最小值和最大值 x 之间,因此在 1, 1.667, 2.33, 3
。这不是离散分布的好选择。更好的选择是 0.5, 1.5, 2.5, 3.5
。添加参数 discrete=True
会自动选择这些边界,但仅适用于 distplot
的新版本,即 histplot
.
如果您设置 stat='density'
,直方图的总 面积 (或 kde,是 连续 的近似值pdf) 将是 1。对于 discrete=False
,垃圾箱是 0.667
宽。要获得 1 的 面积 ,高度总和应为 1/0.667=1.5
(sum(heights)*width = 1
)。这个度量在这里没有多大意义(在 1 和 1.667 之间,概率为 0.6*0.667,等等)。对于宽度为 1
的 bin,高度应为 1
(sum(heights)*width = 1
)。这里的高度表示每个值的比例(1 概率为 0.4,2 概率为 0.2)。
以下代码将 stat='density'
与 discrete=True
与 False
.
import matplotlib.pyplot as plt
import seaborn as sns
l = [1, 3, 2, 1, 3]
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 4))
sns.histplot(l, bins=3, discrete=False, stat='density', ax=ax1)
ax1.set_title('the default (discrete=False)')
sns.histplot(l, bins=3, discrete=True, stat='density', ax=ax2)
ax2.set_title('with discrete=True')