ggplot2 - 创建一个针对总样本量的堆积密度图

4
假设我们有两组不同样本大小的群体,分别为“a”和“b”。
n = 10000
set.seed(123)
dist1 = round(rnorm(n, mean = 1, sd=0.5), digits = 1)
dist2 = round(rnorm(n/10, mean = 2, sd = 0.2), digits = 1)
df = data.frame(group=c(rep("a", n), rep("b", n/10)), value=c(dist1,dist2))

我希望将以下堆叠条形图转换为堆叠密度图。
library(ggplot2)
ggplot(data=df, aes(x=value, y=(..count..)/sum(..count..), fill=group)) +
  geom_bar()

enter image description here

我知道密度图有一个选项position="stack"。然而,结果如下所示,因为密度的高度是相对于组样本大小而不是总样本大小的。因此,小组在某种程度上被过度代表。

ggplot(data=df, aes(x=value, fill=group)) +
  geom_density(position="stack")

enter image description here

有没有一种方法可以创建一个对应于上面条形图的密度图?
2个回答

4

如果你使用密度图与柱状图做同样的事情,不会得到你想要的结果吗?

   ggplot(data=df, aes(x=value, fill=group)) +
     geom_density( aes(y = ..count../sum(..count..)),  position="stack", alpha=.7)

该技术提供了

enter image description here


哦,是的,如果你把position="identity"改成position="stack"! - otwtm
好的,已经做出了那个更改。 - WaltS

0

如果您绘制密度图,y轴与您从第一个直方图中获得的y轴不同,其中您的y轴反映了总数。要获得接近该情况的内容,请尝试以下操作,其中使用直方图函数获取计数,然后进行转换和堆叠:

library(dplyr)
library(ggplot2)

RN =range(df$value)

df %>% group_by(group) %>%
do(data.frame(hist(.$value,breaks=seq(RN[1],RN[2],
length.out=40),plot=FALSE)[c("mids","counts")])) %>%
mutate(freq=counts/nrow(df)) %>%
ggplot(aes(x=mids,y=freq,col=group)) + geom_line(position="stack")

enter image description here


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