覆盖两个ggplot facet_wrap直方图

时间:2017-12-01 15:17:56

标签: r ggplot2 histogram

所以我有两个直方图,我可以一次做一个。使用以下代码的结果为6个不同的直方图提供了2行x 3 col facet图:

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_wrap图,我现在将它结合起来表明一个比另一个更多的移位。 另外,数据大小不一样,所以我有一个:

# 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 个答案:

答案 0 :(得分:1)

基于内置数据集iris(由于您没有提供可重现的数据),这是我的解决方法。为了创建较小的移位数据集,我使用dplyr来保留每个物种的前20行,并为每个观察点添加1到Sepal长度:

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