如何在RStudio热图的每两列上方添加分组标签?
解决热图分组标签错位问题
针对环境变量标签位置错误的问题,修改以下关键部分即可实现目标分组标签效果:
- 修正标签的x轴位置计算,确保标签落在每组(tissue+mucus)的正上方
- 调整标签宽度,使其刚好覆盖对应组的两列
- 优化上下图的对齐逻辑
修改后的完整代码
library(ggplot2) library(dplyr) library(cowplot) # 假设数据已加载到dfmerge中(替换为你的实际数据对象) # dfmerge <- data # 构建交互因子,保持原有排序逻辑 dfmerge$interaction <- with(dfmerge, interaction(Env, Type, sep = " - ")) dfmerge$interaction <- factor(dfmerge$interaction, levels = sort(levels(dfmerge$interaction))) # 绘制主热图 heatmap_plot <- ggplot(dfmerge, aes(x = interaction, y = Taxa, fill = Correlation)) + geom_tile(color = "white") + # 添加白色边框区分单元格 scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) + theme_minimal() + theme( axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1, size = 10), axis.text.y = element_text(size = 10), plot.title = element_text(hjust = 0.5), panel.grid = element_blank() # 去掉网格线贴合目标图风格 ) + labs(x = "", y = "Observations", title = "Heatmap") + scale_x_discrete(labels = function(x) gsub("^[^-]* - ", "", x), expand = c(0, 0)) # 消除x轴边缘空白 # 计算环境变量数量和标签位置 num_envs <- length(unique(dfmerge$Env)) # 每组两列,标签位置设为每组中点(如第1组1.5、第2组3.5...) env_labels_df <- dfmerge %>% distinct(Env) %>% mutate(xpos = seq(1.5, num_envs*2 - 0.5, by = 2)) # 绘制环境变量标签图 env_labels <- ggplot(env_labels_df, aes(x = xpos, y = 1, label = Env)) + geom_label( fill = "lightgrey", size = 5, label.padding = unit(0.25, "lines"), width = unit(2, "npc")/num_envs, # 标签宽度匹配每组两列的宽度 label.size = 0 # 去掉标签边框 ) + theme_void() + theme(plot.margin = margin(t = 0, r = 0, b = -10, l = 0)) + # 缩小上下边距,避免与热图间距过大 coord_cartesian(xlim = c(0.5, num_envs*2 + 0.5), clip = "off") # 组合标签和热图 heatmap_with_labels <- cowplot::plot_grid( env_labels, heatmap_plot, nrow = 2, rel_heights = c(0.1, 1), align = "hv", # 同时水平和垂直对齐 axis = "lr" # 对齐左右轴 ) print(heatmap_with_labels)
关键修改说明
- 标签位置修正:
xpos = seq(1.5, num_envs*2 - 0.5, by = 2)确保每个环境变量标签精准落在对应tissue和mucus两列的中间位置。 - 标签宽度适配:
width = unit(2, "npc")/num_envs让标签宽度刚好覆盖每组的两个单元格,避免过宽或过窄。 - 热图样式优化:添加单元格白色边框、去掉网格线,更接近目标图的视觉效果;调整
scale_x_discrete的expand参数消除边缘空白。 - 对齐与边距调整:修改
plot_grid的align参数为"hv",同时调整标签图的下边距,确保标签和热图完美对齐。
内容的提问来源于stack exchange,提问作者Smonk
相关产品推荐
相关产品推荐

