如何在ggplot2绘图的X轴下方添加方括号对变量分组?
解决方法:在组合图表下方添加分组方括号
你已经通过patchwork完成了箱线图与底部色块图的拼接,最简便的实现方式是直接在底部色块图中添加分组括号,或是新增一个仅含括号的小图拼在最下方。以下是两种可行方案:
方案1:用ggsignif::geom_bracket直接在色块图中添加括号
先安装并加载ggsignif包,通过调整y轴范围和括号位置适配现有布局:
library(ggsignif) # 修改色块图,添加分组括号 colblocks_lym <- ggplot(filtered_lymph, aes(cluster, 1, fill=cluster))+ geom_col(width=1, position = "identity", colour="NA")+ scale_fill_manual(values=c("#8d0e13","#e51d2f","#f5e0e0", "#e67770"), guide="none")+ coord_cartesian(expand=FALSE, ylim=c(-0.5, 1)) # 向下扩展y轴,给括号预留空间 theme_minimal()+ labs(y=NULL, x="Lymphoid")+ scale_x_discrete(labels=x_lym_labels)+ theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1), axis.text.y=element_blank(), axis.title.y=element_blank(), axis.ticks.y=element_blank())+ # 添加分组括号(示例:前2个cluster为一组,后2个为一组) geom_bracket( xmin = c(1, 3), xmax = c(2, 4), # 括号覆盖的x轴序号 y.position = c(-0.2, -0.2), # 括号在色块下方的y轴位置 label = c("Group 1", "Group 2"), # 分组标签 label.size = 3, bracket.size = 0.8, inherit.aes = FALSE ) # 重新组合图表,调整底部高度适配括号 combined_p_lymph <- p_lymph + colblocks_lym + plot_layout(ncol=1, nrow=2, heights=c(20,2)) print(combined_p_lymph)
方案2:手动用annotate绘制括号(无需额外包)
如果不想安装新包,可通过annotate画线段和文本模拟方括号,操作同样在色块图中完成:
colblocks_lym <- ggplot(filtered_lymph, aes(cluster, 1, fill=cluster))+ geom_col(width=1, position = "identity", colour="NA")+ scale_fill_manual(values=c("#8d0e13","#e51d2f","#f5e0e0", "#e67770"), guide="none")+ coord_cartesian(expand=FALSE, ylim=c(-0.6, 1)) theme_minimal()+ labs(y=NULL, x="Lymphoid")+ scale_x_discrete(labels=x_lym_labels)+ theme(axis.text.x=element_text(angle=45, hjust=1, vjust=1), axis.text.y=element_blank(), axis.title.y=element_blank(), axis.ticks.y=element_blank())+ # 绘制第一组括号:左竖线、横线、右竖线+标签 annotate("segment", x=0.8, xend=0.8, y=-0.1, yend=-0.4, size=0.8)+ annotate("segment", x=0.8, xend=2.2, y=-0.4, yend=-0.4, size=0.8)+ annotate("segment", x=2.2, xend=2.2, y=-0.1, yend=-0.4, size=0.8)+ annotate("text", x=1.5, y=-0.5, label="Group 1", size=3)+ # 绘制第二组括号:左竖线、横线、右竖线+标签 annotate("segment", x=2.8, xend=2.8, y=-0.1, yend=-0.4, size=0.8)+ annotate("segment", x=2.8, xend=4.2, y=-0.4, yend=-0.4, size=0.8)+ annotate("segment", x=4.2, xend=4.2, y=-0.1, yend=-0.4, size=0.8)+ annotate("text", x=3.5, y=-0.5, label="Group 2", size=3) # 重新组合图表,调整底部高度 combined_p_lymph <- p_lymph + colblocks_lym + plot_layout(ncol=1, nrow=2, heights=c(20,2)) print(combined_p_lymph)
关键注意点
- 两种方案都通过
ylim扩展色块图的y轴范围,同时调整patchwork的heights参数,确保底部区域能容纳括号和标签。 - 用
geom_bracket时,xmin/xmax可直接对应离散x轴的序号,若cluster是因子类型,也可直接传入因子值(如xmin="clusterA", xmax="clusterB")。 - 手动绘制括号时,x轴位置需根据实际cluster的宽度微调(比如0.8对应第一个cluster左侧,2.2对应第二个cluster右侧)。
内容的提问来源于stack exchange,提问作者krw13
相关产品推荐
相关产品推荐

