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
相关产品推荐
相关产品推荐

