如何在ggplot的geom_tile上方为X轴标签添加Combined Score条形图?
解决enrichR Clustergram复刻中条形图角度与标签对齐问题
你在复刻enrichR的Clustergram时,上方对应Combined Score的条形图存在角度和标签对齐问题,以下是修正后的代码及关键调整说明:
修正后的完整代码
library(ggplot2) library(patchwork) # 原始数据保持不变 gene.dat = data.frame(Term = c(rep("Diseases Of Base Excision Repair", 7), rep("HDR Thru Homologous Recombination (HRR)", 7)), Genes = c(rep(c("A", "B", "C", "D", "E", "F", "G"), 2)), n = c(NA, 1, NA, NA, 1, 1, 1, 1, NA, 1, 1, NA, NA, 1)) scores.dat = data.frame(Term = c("HDR Thru Homologous Recombination (HRR)", "Diseases Of Base Excision Repair"), Combined.Score = c(5329, 2738)) # 确保两个数据集的Term顺序一致,避免错位 gene.dat$Term = factor(gene.dat$Term, levels = scores.dat$Term) scores.dat$Term = factor(scores.dat$Term, levels = scores.dat$Term) main.plot = ggplot(gene.dat, aes(Term, Genes)) + geom_tile(aes(fill = n))+ theme( plot.title = element_text(hjust = 1), axis.text.x = element_blank(), legend.position="none", panel.background = element_blank()) + ylab("") + xlab("") + scale_x_discrete(position = "top") + scale_fill_manual(values = c("1" = "darkblue", NA = "white")) # 补充填充色,让热图更清晰 score.plot = ggplot(scores.dat, aes(x = Combined.Score, y = Term)) + geom_col(fill = "darkred") + # 横向条形图,对应热图的X轴方向 geom_text(aes(label = Term), angle = 0, hjust = 1, vjust = 0.5, nudge_x = -100, color = "black") + # 标签水平放置,对齐条形图右侧 scale_x_reverse() + # 反转X轴,让条形图从右往左延伸,对应热图的X轴顺序 theme_void() + theme(axis.text.y = element_blank()) # 去掉原始Y轴标签,避免重复 # 组合两个图,确保高度比例和对齐 Y <- (score.plot + main.plot) + plot_layout(ncol = 1, nrow = 2, heights = c(1, 3), align = "h") # 水平对齐,保证Term位置完全匹配 print(Y)
关键调整说明
- 统一Term顺序:将两个数据集的Term转为因子并指定相同层级,避免热图和条形图的分类错位
- 横向条形图转换:把score.plot的坐标轴从
(Term, Combined.Score)改为(Combined.Score, Term),生成横向条形图,对应热图的X轴方向 - 标签对齐优化:调整
geom_text的参数,让Term标签水平放置在条形图右侧,通过nudge_x微调位置,确保和热图的X轴位置精准对应 - 反转X轴:用
scale_x_reverse()让条形图从右往左延伸,和热图的X轴顺序保持一致 - 水平对齐布局:添加
align = "h"确保两个图的水平方向完全对齐,消除错位问题
内容的提问来源于stack exchange,提问作者radishhorse
相关产品推荐
相关产品推荐

