ggplot2 堆叠直方图 - 转换为密度图
Posted
技术标签:
【中文标题】ggplot2 堆叠直方图 - 转换为密度图【英文标题】:ggplot2 stacked histogram - convert to density plot 【发布时间】:2016-08-11 19:18:24 【问题描述】:我可以使用 ggplot2 在 y 轴上轻松制作堆叠直方图。我想要的是根据密度转换这个图。我可以通过将 aes(y=..density..) 添加到 geom_histogram 层来做到这一点;但 ggplot 所做的是绘制每个单独数据系列的密度,使其总面积为 1。因此,如果您在一个直方图中堆叠 4 个数据系列,则条形的总面积将为 4。
我所追求的是根据密度绘制堆叠直方图,但在计算密度时考虑所有数据系列。换句话说......我希望密度堆叠直方图具有与计数直方图相同的比例条。
【问题讨论】:
通过提供reproducible example 帮助我们帮助您。 【参考方案1】:如前所述,您可以自己计算频率密度,但您可以在 ggplot 中计算总计数 n 和 bin 宽度的变量。计数 n 只是计数的总和,对于 bin 宽度,您可以使用内部变量宽度。如果您想要相对频率而不是频率密度,请不要除以宽度。
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = stat(count / sum(count) / width), fill = Species)) +
geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
由reprex package (v0.3.0) 于 2020 年 4 月 30 日创建
【讨论】:
【参考方案2】:我找到了一种方法来执行此操作,例如计算 binwidth = bw
,并将 y
变量设置为 (..count..)/(n*bw)
,其中 n
是数据点的数量。
生成一些玩具数据
require(ggplot2)
set.seed(1234)
x1 <- rnorm(10000, 0, 1)
x2 <- rnorm(90000, 1, 1)
X <- data.frame(x = c(x1, x2),
Class = as.factor(c(rep(1, length(x1)), rep(2, length(x2)))))
计算 n 和 binwidth
n <- dim(X)[1]
bw <- 3.49 * sd(X[, "x"]) * dim(X)[1]^(-1/3) ## binwidth using Scott's rule.
生成情节
p1 <- ggplot(data = X, aes(x = x, bw = bw, n = n)) +
geom_histogram(aes(y = (..count..)/(n * bw), fill = Class),
binwidth = bw) +
geom_density()
print(p1)
现在每个 bin 根据每个类中包含的点的比例进行着色,并符合黑线给出的密度定义。
【讨论】:
运行上述代码的jupiter notebook可以找到here【参考方案3】:library(ggplot2)
dtDataset = data.frame(
V1 = c('a','b'),
V2 = runif(20)
)
ggplot(dtDataset) +
geom_density(aes(x = V2, group = V1), position = 'stack')
【讨论】:
以上是关于ggplot2 堆叠直方图 - 转换为密度图的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:可视化人口金字塔图直方图(堆叠直方图连续变量堆叠直方图离散变量堆叠直方图)密度图箱图(添加抖动数据点tufte箱图多分类变量分组箱图)小提琴图
R语言与医学统计图形-14ggplot2几何对象之直方密度图
R语言使用ggplot2包使用geom_density()函数绘制分组密度图(添加直方图分组颜色配置)实战(density plot)
R语言ggplot2可视化:可视化堆叠的直方图在bin中的每个分组部分添加数值标签为堆叠直方图中的每个分组部分添加数值标签