R:基于列的条件用线覆盖密度图

R: overlay density plot with lines based on condition of a column

我有一个数据框,它由一列条件(字符串)和多列数值组成。对于每一列,我想创建一个重叠的密度图,其中每条线代表一个条件。我发现了很多解决方案,可以将每一列作为一条线叠加在同一图上,但没有找到如何通过根据条件分组来创建线。由于这是一个大型数据集,我宁愿不手动指定组。

condition c2 c3 c4
b 1 0 2
c 3 1 2
a 5 0 1
a 2 4 3
c 1 1 1
b 2 3 3
a 1 0 2
c 3 1 2
c 6 0 2
a 2 0 1
c 1 3 1
b 4 3 0

使用这个示例数据,我想为第 2-4 列的每一列绘制一个密度图。每个图应该有 3 条线(代表 a、b 和 c)。

我最好用 ggplot 来做这个。

library(tidyr)
library(ggplot2)

df %>% 
  pivot_longer(-condition) %>% 
  ggplot(aes(value, color = condition)) +
  geom_density() + 
  facet_wrap(~ name)

returns

编辑 感谢 Brenton M. Wiernik 的评论,我们可以使用 scales = "free" 单独缩放所有地块。

df %>% 
  pivot_longer(-condition) %>% 
  ggplot(aes(value, color = condition)) +
  geom_density(alpha = .3) +
  facet_wrap(~ name, scales = "free")

returns

另一种选择是ggdensity

library(ggpubr)
out <- ggdensity(df, x = c("c2", "c3", "c4"), color = "condition",
         fill = "condition")
ggarrange(plotlist = out, ncol = 2, nrow = 2)

-输出

数据

df <- structure(list(condition = c("b", "c", "a", "a", "c", "b", "a", 
"c", "c", "a", "c", "b"), c2 = c(1L, 3L, 5L, 2L, 1L, 2L, 1L, 
3L, 6L, 2L, 1L, 4L), c3 = c(0L, 1L, 0L, 4L, 1L, 3L, 0L, 1L, 0L, 
0L, 3L, 3L), c4 = c(2L, 2L, 1L, 3L, 1L, 3L, 2L, 2L, 2L, 1L, 1L, 
0L)), class = "data.frame", row.names = c(NA, -12L))
ggplot(df, aes(x = value, fill = condition)) + 
    geom_density(alpha = 0.5) +
    facet_wrap(~name, scales = "free_x") +
    theme_classic()