假设我有2个科目。每种都进行了实验性试验和对照性试验,两组试验的结果均为1或0。
我想要一个堆叠的条形图,以显示每个受试者的两种类型的试验中1种反应和0种反应的比例。
因此,每个对象都有两个条形图,它们在y轴上的比例均达到1.00。
模拟数据
df1 <- data.frame(Sbj_ID = c(1),
Trial_Type = c("Testing", "Testing", "Control", "Control"),
Outcome = c(1, 0, 1, 0),
Proportion = c(0.41, 0.59, 0.02, 0.98))
df2 <- data.frame(Sbj_ID = c(2),
Trial_Type = c("Testing", "Testing", "Control", "Control"),
Outcome = c(1, 0, 1, 0),
Proportion = c(0.30, 0.70, 0.10, 0.90))
df <- merge(df1, df2, all=TRUE)
我希望它看起来像这种类型的图形,但带有堆叠的条形图
data(iris)
library(ggplot2)
library(tidyr)
iris %>%
gather("Type", "Value",-Species) %>%
ggplot(aes(Species, Value, fill = Type)) +
geom_bar(position = "dodge", stat = "identity")
这是我失败的尝试...
library(ggplot2)
library(tidyr)
# fail 1
df $>$
gather("Outcome", "Proportion", -Sbj_ID) %>%
ggplot(aes(Sbj_ID, Proporiton, fill = Outcome)) +
geom_bar(stat = "identity", position = "dodge")
# fail 2
ggplot(df, aes( x = factor(Sbj_ID), y = Proportion, fill = Outcome)) +
geom_bar(stat = "identity", position = "stack")
有什么想法吗?预先谢谢你!
答案 0 :(得分:0)
我的直接建议是删除position = "dodge"
参数。 ggplot2
然后将带有频率计数的条形图堆叠起来,如下所示。
iris %>%
gather("Type", "Value",-Species) %>%
ggplot(aes(Species, Value, fill = Type)) +
geom_bar(stat = "identity")
如果要确保堆叠的条等于1,可以将参数position=position_fill(reverse=F)
添加到geom_bar()
函数中。
iris %>%
gather("Type", "Value",-Species) %>%
ggplot(aes(Species, Value, fill = Type)) +
geom_bar(stat = "identity",position=position_fill(reverse=F))
答案 1 :(得分:0)
这就是我要做的-
您尝试沿结果“堆叠”,但沿Sbj_ID进行“躲避”。因此,使用facet_wrap处理Sbj_ID允许您仅对结果使用“堆栈”。
df %>%
mutate(Outcome = as.factor(Outcome)) %>%
ggplot(aes(x = Trial_Type, y = Proportion, fill = Outcome)) +
geom_bar(stat = "identity", position = 'stack') +
facet_wrap(vars(Sbj_ID))