You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:55:56