代码之家  ›  专栏  ›  技术社区  ›  Joachim Schork

2组重叠ggplot2条形图

  •  1
  • Joachim Schork  · 技术社区  · 6 年前

    我想画一个带有重叠条(百分比)的ggplot2条形图。我有两个组,每个组由两个子组组成。

    考虑下面的可重复的例子:

    # Create data for ggplot
    data_ggp <- data.frame(category = rep(c("cat1", "cat2", "cat3"), 4),
                           values = c(0.664, 0.045, 0.291, 0.482, 0.029, 0.489, 0.537, 0.027, 0.436, 0.536, 0.028, 0.436),
                           group = c(rep("group1a", 3), rep("group1b", 3), rep("group2a", 3), rep("group2b", 3)))
    

    library("ggplot2")
    
    # Draw barchart (not overlayed)
    ggplot(data_ggp, aes(category, values)) + 
      geom_bar(stat = "identity", aes(fill = group), position = "dodge")
    

    enter image description here

    在本例中,红色和绿色条应相互覆盖,蓝色和紫色条应相互覆盖。

    然而,这两个线程描述的问题略有不同,不幸的是,我无法针对我的具体情况修改代码。

    1 回复  |  直到 6 年前
        1
  •  1
  •   camille    6 年前

    你可以事先做一点整形。你需要一些逻辑来连接红条( group1a group1b ),蓝色和紫色条也是如此。在这种情况下,通用性是组号。创建组号变量的最简单方法(至少是使用现有的数据)就是为组中除最后一个字符以外的所有字符进行子集设置。如果组变得更复杂,可以使用正则表达式。

    position = "identity" 在你的内心 geom_col ,您可以放置条,而不管它们是否相互重叠。

    library(tidyverse)
    
    data_split <- data_ggp %>%
      mutate(group_num = str_sub(group, 1, -2))
    
    head(data_split)
    #>   category values   group group_num
    #> 1     cat1  0.664 group1a    group1
    #> 2     cat2  0.045 group1a    group1
    #> 3     cat3  0.291 group1a    group1
    #> 4     cat1  0.482 group1b    group1
    #> 5     cat2  0.029 group1b    group1
    #> 6     cat3  0.489 group1b    group1
    

    现在你可以使用 group_num 在x轴上放置条的步骤。一种方法是使用这些组和类别之间的交互:

    ggplot(data_split, aes(x = interaction(group_num, category), y = values, fill = group)) +
      geom_col(position = "identity", alpha = 0.4)
    

    另一种方法是将组号放置在x轴上,然后按类别进行镶嵌。您可以调整主题元素,使facet看起来不那么像facet,而更像x轴上的大组,但我将把这留给其他SO问题的建议。

    ggplot(data_split, aes(x = group_num, y = values, fill = group)) +
      geom_col(position = "identity", alpha = 0.4) +
      facet_wrap(~ category)
    

    注意 geom_col 相当于 geom_bar(stat = "identity") ,为了显示重叠,我把alpha调小了。

    于2018年11月26日由 reprex package (v0.2.1)