将临床病例的重叠点叠加在小提琴图上

Stack overlapping points from clinical cases on top of violin plot

第一次在这里发帖。如果我遗漏了解决我的情况所需的内容,我们深表歉意。

我有一个匹配的病例对照设计,其中三个 'younger' 临床病例与 'younger' 对照组年龄匹配,三个 'older' 病例与一个'older' 对照组。我试图在小提琴图中绘制对照组分布,并将相应的匹配案例叠加为数据点(博士导师建议每个案例的数据点具有独特的形状和颜色,以协助在整个小提琴系列中跟踪案例地块)。

到目前为止,我的新手解决方案是为每个控制组创建一个数据框,然后为案例创建单独的数据框。创建绘图并添加格式详细信息,例如数据点的形状、颜色。

我设置数据框的代码,然后是绘图示例:

#remove the cases and put into a separate data frame
case_1.1 <- FTD_data[1:1, ]
case_1.2 <- FTD_data[2:2, ]
case_1.3 <- FTD_data[3:3, ]
case_2.1 <- FTD_data[13:13, ]
case_2.2 <- FTD_data[14:14, ]
case_2.3 <- FTD_data[15:15, ]

#remove control groups and put into own group
young_controls <- FTD_data [4:12, ]
old_controls <- FTD_data [16:23, ]

#example plot
ggplot(data = young_controls, aes(x = strange_stories_ToM_mean, y = analysis_group, fill = 
analysis_group)) + 
geom_point(data=case_1.1, aes(x = strange_stories_ToM_mean, y = analysis_group, colour = "Case 
1.1"), fill = "deeppink1", col = "deeppink1", pch = 21, size = 5) +
labs (color = "Young cases") +
geom_point(data=case_1.2, aes(x = strange_stories_ToM_mean, y = analysis_group, colour = "Case 
1.2"), fill = "indianred3", col = "indianred3", pch=24, size = 4) +
geom_point(data=case_1.3, aes(x = strange_stories_ToM_mean, y = analysis_group, colour = "Case 
1.3"), fill = "blueviolet", col = "blueviolet", pch=22, size = 5, 
position=position_jitter(h=0.09,w=0.0)) +
geom_violin(trim = FALSE,
          alpha = 0.2,
          draw_quantiles = c(0.25, 0.5, 0.75))+
theme_classic() + 
scale_fill_manual(values = c("gray90")) + 
guides(fill = "none") 

我遇到的一个烦人的问题是案例中的数据点重叠(如下图所示)。我试过“position=position_jitter(h=0.09,w=0.0)”,但这每次都会移动数据点,因为抖动会引入噪音。我需要一些一致且可重现的东西来定位重叠点,因为我将在一篇论文中排列几个图。需要垂直堆叠。

Example of plot with overlap issue

我也试过:

`position_jitter(width = NULL, height = NULL, seed = NA)'

但随后收到以下错误:

'Error in `check_subclass()`:
! `stat` must be either a string or a Stat object, not an S3 object with class 
PositionJitter/Position/ggproto/gg'

关于重叠问题有什么想法吗?此外,关于我如何设置数据框的任何反馈,以及我是否以正确的方式或繁琐的方式处理它!这是我发现最容易分别操作每个数据点的解决方案。

简答:试试position_dodge()

更长的答案:

是的,为每个观察制作单独的数据框并为每个观察手动设置美学有点麻烦!您通常希望将值保留在同一个数据框中,然后只需告诉 ggplot 哪些维度很重要以及将这些维度映射到什么美学。在个人观察很重要的情况下,您可以将美学映射到唯一的主题 ID。

就是说,当您想要为不同的子集使用完全不同的 geom 时,可以使用单独的数据框会有所帮助——例如用于控制的小提琴和用于案例的点——所以你在那里走在正确的轨道上。

library(ggplot2)
set.seed(22)

# fake data
cases <- data.frame(
  id = factor(1:6),
  strange_stories_ToM_mean = sample(6:8, 6, replace = TRUE),
  age = factor(c(rep("young", 3), rep("old", 3)))
)
controls <- data.frame(
  id = 7:23,
  strange_stories_ToM_mean = sample(c(6,6,7,7,7,7,7,7,7,8,8,8,9,9,9,9,9), 17),
  age = c(rep("young", 9), rep("old", 8))
)

ggplot(data = controls, aes(strange_stories_ToM_mean, age)) + 
  geom_violin(
    trim = FALSE, 
    alpha = 0.2, 
    draw_quantiles = c(0.25, 0.5, 0.75), 
    fill = "gray90"
  ) +
  geom_point(
    data = cases, 
    aes(colour = id, shape = id),  # map color/shape to individual cases
    position = position_dodge(width = .2),    # spread cases apart to avoid overplotting
    size = 5,
    show.legend = FALSE
  ) +
  theme_classic()

PS - 如果您仍想为每种情况指定特定的颜色或形状,您可以使用 scale_color_manual()scale_shape_manual().