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

ggplot2分类x轴添加匹配轴标签宽度的高亮背景注释实现

实现思路

分类坐标轴的每个类别默认对应连续整数位置(第一个x类别对应1,第二个对应2,以此类推),你可以先统计每个Class对应的x轴起止区间,再配合关闭绘图裁剪将矩形背景放置在x轴标签区域即可完美对齐。

完整实现代码

首次运行需要先安装依赖:

install.packages("dplyr")

后续运行完整代码即可:

library(ggplot2)
library(dplyr)

# 读取并预处理数据
test<-read.table(text = "p  VIP log2FC  Name2   Class   Group   Polarity    sign    class.code
0.00302919776   2.624973463 -2.779644484    N1  Steroids and steroid derivatives    TSH pos -1  2
0.00192390970   2.820056443 -2.650407786    N2  Carboxylic acids and derivatives    TCH pos -1  3
0.00063661227   2.695772078 -2.363567645    N3  Carboxylic acids and derivatives    TCH neg -1  3
0.00036276671   2.569894374 -2.283392868    N4  Carboxylic acids and derivatives    TSH neg -1  3
0.00050615743   2.502423281 -2.212932746    N5  Carboxylic acids and derivatives    TSH neg -1  3
0.00007247221   2.592976107 -2.322901045    N6  Azoles  TSH neg -1  11
0.02828910422   2.377676432 -2.345218469    N7  Prenol lipids   TCH pos -1  12
0.00097365202   3.092851245 -3.292899676    N8  Organooxygen compounds  TSH neg -1  13
0.00087925332   2.906452145 -2.864601259    N9  Organooxygen compounds  TCH pos -1  13
0.00070424411   2.961364199 -2.729414896    N10 Organooxygen compounds  TCH neg -1  13
0.00676749126   3.58416488  -2.718140134    N11 Organooxygen compounds  TAH neg -1  13
0.00115934969   2.479875401 -2.442916591    N12 Organooxygen compounds  TSH pos -1  13
0.00000093664   6.911749646 -7.344063359    N13 Benzene and substituted derivatives TAH neg -1  17
0.00072095614   2.98304382  -3.490740824    N14 Flavonoids  TSH pos -1  18
0.04364013849   2.651331909 -3.288365888    N15 Flavonoids  TCH pos -1  18
0.00237961917   2.854364676 -3.239982002    N16 Flavonoids  TSH pos -1  18
0.00079723944   2.923476177 -2.927393648    N17 Flavonoids  TCH pos -1  18
0.04925959046   2.245785308 -2.874095905    N18 Flavonoids  TSH pos -1  18
0.00000103039   2.616765382 -2.618565572    N19 Flavonoids  TSH pos -1  18
0.00345556643   2.553122199 -2.319162288    N20 Flavonoids  TCH pos -1  18
0.00000290000   2.680108814 -2.269663748    N21 Fatty Acyls TCH neg -1  20
0.00035905576   2.366426647 -2.215932235    N22 Fatty Acyls TSH pos -1  20
0.00033629564   2.734465983 -2.89235954 N23 Imidazole ribonucleosides and ribonucleotides   TSH pos -1  23
0.00535643026   3.027317801 -3.725517738    N24 Macrolides and analogues    TSH pos -1  26
0.00846219163   2.56157866  -2.468666494    N25 Macrolides and analogues    TCH pos -1  26
0.00101315825   2.944627274 -2.940716003    N26 Isocoumarans    TCH pos -1  37
0.00136474682   2.546738821 -2.576324693    N27 Isocoumarans    TSH pos -1  37
0.00000310954   3.263175606 -4.022944472    N28 Cycloheptathiophenes    TSH pos -1  39
0.00001238024   3.205283893 -2.939321705    N29 Cycloheptathiophenes    TCH pos -1  39
0.00000001464   2.911252584 -2.850852047    N30 Pyrazolopyridines   TSH neg -1  72",
                 stringsAsFactors = FALSE, header = TRUE,sep = "\t")
test <- test[order(test$class.code),]
# 固定x轴类别顺序,避免错位
test$Name2 <- factor(test$Name2, levels = test$Name2)

# 1. 统计每个Class对应的x轴区间
test$x_pos <- as.numeric(test$Name2)
class_range <- test %>%
  group_by(Class) %>%
  summarise(
    xmin = min(x_pos) - 0.5,
    xmax = max(x_pos) + 0.5,
    .groups = "drop"
  )

# 2. 筛选你需要高亮的Class,示例中高亮Flavonoids和Organooxygen compounds,可自行修改
highlight_class <- c("Flavonoids", "Organooxygen compounds")
highlight_range <- filter(class_range, Class %in% highlight_class)

# 3. 绘图
v2 <- list("not L") # 这里替换为你自己的v2变量定义,我这里只是示例避免报错
i <- 1
ggplot(test,aes(x=Name2,y=log2FC,color=Group,label=Name2))+
  theme_bw()+
  # 先加高亮矩形,放在最底层避免遮挡点
  geom_rect(data = highlight_range, 
            aes(xmin = xmin, xmax = xmax, 
                ymin = -8, ymax = min(test$log2FC) - 0.2, 
                fill = Class), # 可自定义fill颜色,这里用Class映射方便区分
            alpha = 0.3, inherit.aes = FALSE, show.legend = FALSE)+
  geom_point(aes(size=VIP))+
  scale_color_manual(name="",values = if(v2[i]==c("L")){
    c("#fb9a99","#b2df8a","#a6cee3")
  }else{
    c("#e31a1c","#33a02c","#1f78b4")
  }
  )+
  scale_x_discrete(labels=test$Class)+
  # 关闭裁剪,允许矩形显示在绘图区外
  coord_cartesian(clip = "off", ylim = c(min(test$log2FC) - 0.1, max(test$log2FC)+0.1))+
  theme(axis.text.x = element_text(angle=90, vjust = 0.5),
        # 给下方留出足够空间放高亮背景
        plot.margin = unit(c(0.5,0.5,3,0.5), "cm"))+
  guides(color = guide_legend(override.aes = list(size=8)))

可调参数说明

  • 修改highlight_class的取值即可调整需要高亮的类别
  • 在geom_rect中修改fill参数可以自定义高亮颜色,比如设置fill = "yellow"统一使用黄色高亮
  • 调整geom_rect的ymin和ymax数值即可匹配x轴标签的高度
  • 仅依赖基础包即可实现,不需要安装额外的复杂可视化组件

内容的提问来源于stack exchange,提问作者Lennon Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:15:02