密度图网格,每组绘制参考数据

grid of density plots with reference data plotted in each group

假设我有一个数据框:

df = data.frame(var = c("a", "a", "b", "b", "c", "c", "a", "a", "b", "b", "c", "c", "a", "a", "b",  "b", "c", "c"),
                source = c("ref", "ref", "ref", "ref", "ref", "ref", "source1", "source1", "source1", "source1", "source1", "source1", "source2", "source2", "source2", "source2", "source2", "source2"),
                value = c(2.5, 1, 3.5, 1.6, 2.2, 3.1, 2, 1.2, 1.8, 0.4, 1.4, 1.3, 3, 2.8, 4, 3.6, 2.9, 3.8))

> df
   var  source value
1    a     ref   2.5
2    a     ref   1.0
3    b     ref   3.5
4    b     ref   1.6
5    c     ref   2.2
6    c     ref   3.1
7    a source1   2.0
8    a source1   1.2
9    b source1   1.8
10   b source1   0.4
11   c source1   1.4
12   c source1   1.3
13   a source2   3.0
14   a source2   2.8
15   b source2   4.0
16   b source2   3.6
17   c source2   2.9
18   c source2   3.8

并且我想为每个 var / source 对生成 value 的密度图。适用于:

library(tidyverse)
library(ggplot2)

df %>%
  ggplot(aes(x = value)) +
  geom_density(aes(y = ..density.., fill = source), adjust = 1, alpha = 0.5) +
  facet_grid(source ~ var, scales = "fixed") +
  theme_bw()

生产:

但根据这个例子,我真正想要的是只有两行,对应于 source1source2,并根据值在每个图中添加另一条密度曲线来自 ref.

我试图在 之后找到解决方案,但没有成功。 换句话说,我希望网格中的每个图都将 ref 中的值分布作为参考,而 ref 组为 而不是 在情节图例中被考虑在内。

非常感谢任何帮助。谢谢。

一种选择是将您的数据框一分为二,一个包含参考值,一个包含其他值。对于包含参考值的 df,我们还必须删除 source 列。然后利用两个geom_density。从图例中删除引用没什么大不了的。只需删除填充 aes 并设置所需的填充颜色(如果有)作为参数。在我下面的代码中,我简单地设置了 fill=NA.

library(ggplot2)

df1 <- df[df$source == "ref", -2]
df2 <- df[!df$source == "ref", ]

ggplot(mapping = aes(x = value)) +
  geom_density(data = df1, aes(y = ..density..), fill = NA, adjust = 1, alpha = 0.5) +
  geom_density(data = df2, aes(y = ..density.., fill = source), adjust = 1, alpha = 0.5) +
  facet_grid(source ~ var, scales = "fixed") +
  theme_bw()