代码之家  ›  专栏  ›  技术社区  ›  Denver Dang

叠加两个ggplot facet\u包裹直方图

  •  4
  • Denver Dang  · 技术社区  · 8 年前

    所以我有两个直方图,我可以一次绘制一个。使用以下代码的结果给出了六个不同直方图的2行x 3列刻面图:

    ggplot(data) +
        aes(x=values) +
        geom_histogram(binwidth=2, fill='blue', alpha=0.3, color="black", aes(y=(..count..)*100/(sum(..count..)/6))) +
        facet_wrap(~ model_f, ncol = 3)
    

    这里是 aes(y...) 只给出百分比而不是计数。

    如前所述,我有6个facet\u包裹图中的两个,我现在将其结合起来,以表明一个比另一个偏移更多。 此外,数据大小不同,因此对于其中一个,我有:

    # A tibble: 5,988 x 5
       values ID   structure   model   model_f
       <dbl> <chr>     <chr>   <chr>    <fctr>
     1     6     1    bone       qua   Model I
     2     7     1    bone       liu  Model II
     3    20     1    bone       dav Model III
     4     3     1    bone       ema  Model IV
     5     3     1    bone       tho   Model V
     6     4     1    bone      ranc  Model VI
     7     3     2    bone       qua   Model I
     8     5     2    bone       liu  Model II
     9    18     2    bone       dav Model III
    10     2     2    bone       ema  Model IV
    # ... with 5,978 more rows
    

    另一方面:

    # A tibble: 954 x 5
        values  ID structure   model   model_f
       <dbl>  <chr>     <chr>   <chr>    <fctr>
     1     9     01    bone       qua   Model I
     2     8     01    bone       liu  Model II
     3    22     01    bone       dav Model III
     4     6     01    bone       ema  Model IV
     5     5     01    bone       tho   Model V
     6     9     01    bone       ran  Model VI
     7    12     02    bone       qua   Model I
     8    11     02    bone       liu  Model II
     9    24     02    bone       dav Model III
    10     9     02    bone       ema  Model IV
    # ... with 944 more rows
    

    因此,它们的大小不同,ID也不同(数据不相关),但我仍然希望合并直方图,以查看数据之间的差异。

    我想这可能会奏效:

    ggplot() +
        geom_histogram(data=data1, aes(x=values), binwidth=1, fill='blue', alpha=0.3, color="black", aes(y=(..count..)*100/(sum(..count..)/6))) +
        geom_histogram(data=data2, aes(x=values), binwidth=1, fill='blue', alpha=0.3, color="black", aes(y=(..count..)*100/(sum(..count..)/6))) +
        facet_wrap(~ model_f, ncol = 3)
    

    然而,这并没有起到多大作用。

    所以现在我被困住了。这是可能的,还是。。。?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Mark Peterson    8 年前

    这是我基于内置数据集对此的破解 iris (因为您没有提供可复制的数据)。为了创建较小的移位数据集,我使用 dplyr 为了保留每个物种的前20行,并在每次观察的萼片长度上增加1行:

    smallIris <-
      iris %>%
      group_by(Species) %>%
      slice(1:20) %>%
      ungroup() %>%
      mutate(Sepal.Length = Sepal.Length + 1)
    

    最后的代码很接近,但没有为两个直方图指定不同的颜色。如果您设置 fill 不同的是,你会让他们以不同的方式出现。您可以直接设置此选项(例如,将其中一个选项中的“蓝色”更改为“红色”),也可以在中设置名称 aes . 将其设置为 aes公司 具有创建(和标记)图例的优势:

    ggplot() +
      geom_histogram(data=iris
                     , aes(x=Sepal.Length
                           , fill = "Big"
                           , y=(..count..)*100/(sum(..count..)))
                     , alpha=0.3) +
      geom_histogram(data=smallIris
                     , aes(x=Sepal.Length
                           , fill = "Small"
                           , y=(..count..)*100/(sum(..count..)))
                     , alpha=0.3) +
      facet_wrap(~Species)
    

    创建此项:

    enter image description here

    然而,我不喜欢重叠直方图的外观,所以我更喜欢使用密度图。你可以像上面那样做(只需更改 geom_histogram ),但我认为通过堆叠数据,您可以获得更多的控制(以及将其扩展到两个以上组的能力)。同样,这使用 dplyr 要将两个数据集缝合在一起:

    bigIris <-
      bind_rows(
        small = smallIris
        , big = iris
        , .id = "Source"
      )
    

    然后,您可以相对轻松地创建绘图:

    bigIris %>%
      ggplot(aes(x = Sepal.Length, col = Source)) +
      geom_line(stat = "density") +
      facet_wrap(~Species)
    

    创建:

    enter image description here

    推荐文章