我不知道plot1和plot2统计变换之间的区别?
plot1 <- ggplot(mpg, aes(x = hwy)) +
geom_histogram(stat = "density")
plot2 <-ggplot(mpg, aes(x = hwy)) +
geom_histogram(aes(y = after_stat(density)))
我尝试比较两个图的y轴含义,我认为图1与geom_密度类似,图2是hwy首先由密度计算,然后计算bin中的计数。我的理解正确吗?
对,
plot2
采用 geom_histogram
的默认行为,其中数据被分箱到 30 个箱中,并按这些箱进行计数。我们可以使用 ggplot2::layer_data
来查看它正在进行的计算。
在此数据中,默认 bin 的宽度为 1.103 个单位。由于
hwy
数据是整数,这意味着大多数 bin 反映一个 hwy
值,但少数(如第 14 个)反映两个 hwy
值。
第 14 个 bin 的范围从 xmin 25.93 到 xmax 27.03,因此它包含所有
hwy
26 或 27 个观测值。这是 234 个观测值中的 46 个 (19.6%),但由于每个箱的宽度为 1.103,因此该箱数据的计算高度为 46 / 234 / 1.103 = 0.178。这样,垃圾箱的总面积将为 1。
layer_data(ggplot(mpg, aes(x = hwy)) +
geom_histogram(aes(y = after_stat(density))))
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
y count x xmin xmax density ncount ndensity flipped_aes PANEL group ymin ymax colour fill linewidth linetype
1 0.019364316 5 12.13793 11.58621 12.68966 0.019364316 0.10869565 0.10869565 FALSE 1 -1 0 0.019364316 NA grey35 0.5 1
2 0.000000000 0 13.24138 12.68966 13.79310 0.000000000 0.00000000 0.00000000 FALSE 1 -1 0 0.000000000 NA grey35 0.5 1
3 0.007745726 2 14.34483 13.79310 14.89655 0.007745726 0.04347826 0.04347826 FALSE 1 -1 0 0.007745726 NA grey35 0.5 1
...
14 0.178151709 46 26.48276 25.93103 27.03448 0.178151709 1.00000000 1.00000000 FALSE 1 -1 0 0.178151709 NA grey35 0.5 1
...
以下是一些变体的比较。
stat = density
完全不同,显示计算出的核密度估计。 stat = count
计算 hwy
的每个值,并与这些整数值对齐。默认的 geom_histogram
行为分为 30 个绑定并给出计数。 (我们可以看到第 14 个 bin 飙升至 46。)after_stat(density
)将这些 bin 值转换为总面积为 1。我们也可以将 bin 宽度指定为 1,以获得面积为 1 的直方图,该直方图对应于我们用 stat = count
看到的图案。
library(patchwork); library(tidyverse)
ggplot(mpg, aes(x = hwy)) +
geom_histogram(stat = "density") +
labs(title = "stat = density") |
ggplot(mpg, aes(x = hwy)) +
geom_histogram(stat = "count") +
labs(title = "stat = count") |
ggplot(mpg, aes(x = hwy)) +
geom_histogram() +
labs(title = "default") |
ggplot(mpg, aes(x = hwy)) +
geom_histogram(aes(y = after_stat(density))) +
labs(title = "after_stat(density)") |
ggplot(mpg, aes(x = hwy)) +
geom_histogram(aes(y = after_stat(density)), binwidth = 1) +
labs(title = "after_stat(density),\nbinwidth = 1")