代码之家  ›  专栏  ›  技术社区  ›  s.erhardt

GGPLOT多面条形图:每个填充类别有多个“闪避”条形图?

  •  1
  • s.erhardt  · 技术社区  · 8 年前

    我正在绘制这个数据集“ds”

    ds <- structure(list(FN = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
                                3L, 4L, 4L, 4L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 
                                1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 1L, 1L, 1L, 2L, 
                                2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("FN=1", "FN=2", "FN=3", 
                                "FN=4"), class = "factor"), fraction = structure(c(1L, 1L, 1L, 
                                1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("serum", 
                                "plasma"), class = "factor"), demographics = structure(c(1L, 
                                1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
                                2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("not adjusted", 
                                "adjusted"), class = "factor"), freq = c(132, 47, 14, 30, 29, 
                        19, 25, 14, 9, 5, 4, 4, 24, 21, 15, 6, 6, 5, 4, 4, 2, 2, 2, 2, 
                        35, 28, 25, 68, 24, 11, 33, 15, 10, 12, 11, 8, 24, 16, 15, 13, 
                        10, 6, 7, 6, 5, 4, 3, 3)), .Names = c("FN", "fraction", "demographics", 
                "freq"), class = "data.frame", row.names = c(NA, -48L))
    

    ggplot(ds, aes(x=fraction, y=freq, fill=factor(demographics, c("adjusted", "not adjusted")))) + 
        geom_bar(position=position_dodge(width=0.9), stat="identity", color="black") + 
        facet_grid(FN~., switch="y") + 
        scale_fill_manual("", values=c("not adjusted"="#e41a1c", "adjusted"="#377eb8"), guide=guide_legend(reverse = TRUE)) + 
        theme_bw() + 
        theme(legend.title=element_blank(), legend.position="bottom") + 
        theme(axis.title.x=element_text(face="bold")) + 
        theme(axis.title.y=element_blank()) + 
        theme(axis.ticks=element_blank()) + 
        theme(panel.background=element_blank()) + 
        theme(panel.grid=element_blank()) + 
        theme(strip.text.y = element_text(angle=180)) + coord_flip() 
    

    返回这个结果

    enter image description here

    如你所见,每个x变量“分数”(血清/血浆)和填充类别“人口统计”(未调整/调整)有三个条形图。然而,我希望每个填充类别的这三个条并排绘制。这可能吗?

    非常感谢您的帮助!

    2 回复  |  直到 8 年前
        1
  •  2
  •   Richard Telford    8 年前

    添加单个分组变量

    library("tidyverse")
    ds %>% mutate(row = row_number()) %>% 
    ggplot(aes(x=fraction, y=freq, fill=factor(demographics, c("adjusted", "not adjusted")), group = row)) + 
      geom_bar(position=position_dodge(width=0.9), stat="identity", color="black") + 
      facet_grid(FN~., switch="y") + 
      scale_fill_manual("", values=c("not adjusted"="#e41a1c", "adjusted"="#377eb8"), guide=guide_legend(reverse = TRUE)) + 
      theme_bw() + 
      theme(legend.title=element_blank(), legend.position="bottom") + 
      theme(axis.title.x=element_text(face="bold")) + 
      theme(axis.title.y=element_blank()) + 
      theme(axis.ticks=element_blank()) + 
      theme(panel.background=element_blank()) + 
      theme(panel.grid=element_blank()) + 
      theme(strip.text.y = element_text(angle=180)) + 
      coord_flip() 
    

    enter image description here

        2
  •  1
  •   dmi3kno    8 年前

    demographics ,但如果您再添加一个唯美主义者(内部 aes() group=freq ggplot将分别闪避每个条。因此,您的代码应为:

    ggplot(ds, aes(x=fraction, y=freq, group=freq, fill=factor(demographics, c("adjusted", "not adjusted")))) + 
      geom_bar(position=position_dodge(width=0.9), stat="identity", color="black") + 
      facet_grid(FN~., switch="y") + 
      scale_fill_manual("", values=c("not adjusted"="#e41a1c", "adjusted"="#377eb8"), guide=guide_legend(reverse = TRUE)) + 
      theme_bw() + 
      theme(legend.title=element_blank(), legend.position="bottom") + 
      theme(axis.title.x=element_text(face="bold")) + 
      theme(axis.title.y=element_blank()) + 
      theme(axis.ticks=element_blank()) + 
      theme(panel.background=element_blank()) + 
      theme(panel.grid=element_blank()) + 
      theme(strip.text.y = element_text(angle=180)) + coord_flip() 
    

    chart