如何在ggpaired配对箱线图中高亮特定样本的点与连线?
实现配对样本中特定样本的高亮效果
一、为什么叠加ggpaired的方法无效
你之前尝试叠加两个ggpaired图的思路行不通,因为每个ggpaired都会生成完整的绘图元素(包括箱线图、坐标轴、背景等),叠加后第二个图会覆盖第一层的内容,而非仅添加高亮的连线和点。
二、基于ggpaired的高亮方案
要实现样本D的连线和点高亮,需要先给数据标记高亮状态,再手动替换ggpaired的连线和点图层:
步骤1:处理数据,标记高亮样本
假设你的数据包含样本ID列(比如Sample),先标记需要高亮的样本D:
# 假设数据结构:Sample, Time1, Time2 # 标记是否为需要高亮的样本D df$highlight <- ifelse(df$Sample == "D", "Yes", "No")
步骤2:绘制带高亮的配对箱线图
先生成基础箱线图,再手动添加自定义颜色的连线和点:
library(ggpubr) ggpaired(df, cond1 = "Time1", cond2 = "Time2", fill = "condition", palette = "jco", xlab = "Sample Timepoint", ylab = "OD", # 隐藏默认的连线和点,后续手动添加 line.size = 0, point.size = 0) + # 添加分组连线,按highlight映射颜色 geom_line(data = df, aes(x = c(1, 2), y = c(Time1, Time2), group = Sample, color = highlight), linewidth = 1) + # 添加Time1的点 geom_point(data = df, aes(x = 1, y = Time1, color = highlight), size = 2) + # 添加Time2的点 geom_point(data = df, aes(x = 2, y = Time2, color = highlight), size = 2) + # 设置颜色:普通样本灰色,样本D红色 scale_color_manual(values = c("No" = "gray", "Yes" = "red")) + # 隐藏颜色图例(不需要的话) guides(color = "none") + theme(plot.title = element_text(colour = "Black", size = 14, face = "bold.italic"))
三、改用ggplot原生绘图(更灵活)
如果觉得ggpaired的限制较多,直接用ggplot原生函数构建图形,自由度更高:
步骤1:转换数据为长格式
library(tidyr) # 宽格式转长格式,方便绘制箱线图 df_long <- pivot_longer(df, cols = c(Time1, Time2), names_to = "Timepoint", values_to = "OD")
步骤2:绘制箱线图+高亮连线/点
ggplot(df_long, aes(x = Timepoint, y = OD, fill = Timepoint)) + # 绘制箱线图,使用jco配色 geom_boxplot() + # 添加配对连线,按Sample分组,颜色映射高亮状态 geom_line(data = df, aes(x = factor(c("Time1", "Time2")), y = c(Time1, Time2), group = Sample, color = highlight), linewidth = 1) + # 添加所有样本的点 geom_point(aes(color = highlight), size = 2) + # 设置填充色和点/线颜色 scale_fill_jco() + scale_color_manual(values = c("No" = "gray", "Yes" = "red")) + # 隐藏颜色图例 guides(color = "none") + labs(x = "Sample Timepoint", y = "OD") + theme(plot.title = element_text(colour = "Black", size = 14, face = "bold.italic"))
四、方案选择
如果核心需求是展示配对样本的整体分布+突出特定样本的变化,两种方案都可行:
- 用ggpaired的方案更贴近你原本的绘图逻辑,改动较小;
- 原生ggplot方案更灵活,后续调整样式或添加其他元素更方便。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

