ggplot2堆叠的条,每个X变量2条

时间:2019-07-20 01:27:35

标签: r ggplot2 geom-bar

假设我有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") 

有什么想法吗?预先谢谢你!

2 个答案:

答案 0 :(得分:0)

我的直接建议是删除position = "dodge"参数。 ggplot2然后将带有频率计数的条形图堆叠起来,如下所示。

iris %>%
    gather("Type", "Value",-Species) %>%
    ggplot(aes(Species, Value, fill = Type)) +
    geom_bar(stat = "identity") 

enter image description here

如果要确保堆叠的条等于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)) 

enter image description here

答案 1 :(得分:0)

这就是我要做的-

  • 将结果和Sbj_ID转换为因子变量
  • 使用facet_wrap来按Sbj_ID分组

您尝试沿结果“堆叠”,但沿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))

See the output here