【问题标题】:Overlaying two ggplot facet_wrap histograms覆盖两个 ggplot facet_wrap 直方图
【发布时间】:2017-12-01 15:17:55
【问题描述】:

所以我有两个直方图,我可以一次做一个。使用以下代码的结果给出了六个不同直方图的 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_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)

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

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

【问题讨论】:

  • 您是否考虑过堆叠数据集,然后使用两个变量进行facet_wrap
  • 但是我不会遇到两个变量的问题吗?数据集之间的唯一区别是 ID。但是对于每个数据集它们是不同的,范围从一个数据集的 1-~1000 到另一个数据集的 1-~160。
  • 出于策划的目的,我不这么认为。我认为你根本不依赖 ID 来进行情节是吗?
  • 我不知道。但是还有哪个变量可以区分 facet_wrap 中的两个数据集?或者也许我只是不知道它是如何与两个变量一起工作的。
  • 你可以试试rbind(cbind(data1, df = "1"), cbind(data2, df = "2"))。那么你的另一个方面是df

标签: r ggplot2 histogram


【解决方案1】:

这是我的破解,基于内置数据集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)

创建这个:

但是,我倾向于不喜欢重叠直方图的外观,因此我更喜欢使用密度图。您可以像上面那样做(只需更改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)

创建:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2016-03-12
    • 2012-09-18
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多