如何在R的pheatmap热图上自动添加显著性矩阵
实现热图自动添加显著性标识的方法
针对你的需求,利用ComplexHeatmap包可以直接在热图中自动化添加显著性标识,以下是两种可行方案:
方案一:在热图单元格内添加标识
通过pheatmap的cell_fun参数自定义单元格绘制逻辑,直接在目标单元格中嵌入显著性符号:
步骤1:准备示例数据
# 均值数据矩阵 population <- matrix(c(123.6, 13.9, 13.9, 12.0, 43.2, 2.5, 3.9, 18.8, 1.1), nrow=3, byrow=TRUE, dimnames=list(c("Grp 1", "Grp 2", "Grp 3"), c("Pop 1.", "Pop 2.", "Pop 3."))) # 显著性矩阵(Grp2、Grp3与Grp1对比) sig_mat <- matrix(c("*", "ns", "**", "***", "*", "**"), nrow=2, byrow=TRUE, dimnames=list(c("Grp 2", "Grp 3"), c("Pop 1.", "Pop 2.", "Pop 3.")))
步骤2:修改热图代码
library(ComplexHeatmap) # 转置均值矩阵以匹配你的原代码结构 mat <- t(population) pheatmap(mat, scale="row", treeheight_row = 0, treeheight_col = 0, cluster_rows=FALSE, cluster_cols=FALSE, cellwidth = 20, cellheight = 20, border_color = '#FFFFFF', angle_col = "0", main = "Mean count of Populations (Scaled by row)", color = colorRampPalette(c("navy", "white", "firebrick3"))(50), # 自定义单元格绘制函数,添加显著性标识 cell_fun = function(j, i, x, y, width, height, fill) { # 仅处理Grp2和Grp3对应的列(j=2、3) if(j %in% c(2,3)){ # 匹配当前单元格对应的分组和细胞群名称 grp_name <- colnames(mat)[j] pop_name <- rownames(mat)[i] sig_label <- sig_mat[grp_name, pop_name] # 在单元格中心绘制标识 grid.text(sig_label, x, y, gp = gpar(fontsize=10, fontface="bold")) } })
方案二:在热图上方添加独立注释层
如果不想在单元格内叠加标识,可以通过HeatmapAnnotation在热图顶部添加专门的显著性注释区域:
library(ComplexHeatmap) mat <- t(population) # 转置显著性矩阵以匹配热图的行(细胞群)顺序 sig_anno <- t(sig_mat) # 创建基础热图 ht <- Heatmap(mat, scale="row", cluster_rows=FALSE, cluster_cols=FALSE, width = unit(20*3, "mm"), height = unit(20*3, "mm"), border = TRUE, border_gp = gpar(col="#FFFFFF"), column_names_rot = 0, name = "Scaled Mean", col = colorRampPalette(c("navy", "white", "firebrick3"))(50)) # 添加显著性注释层 ht + HeatmapAnnotation( sig = anno_text(sig_anno, gp = gpar(fontsize=10, fontface="bold"), location = unit(0.5, "npc"), just="center") )
注意事项
- 确保显著性矩阵的行名(分组)、列名(细胞群)与热图的列名、行名完全一致,避免匹配错误。
- 可通过调整
fontsize参数修改标识大小,fontface参数设置字体样式(如加粗)。 - 若使用方案一,需保证
cellwidth和cellheight足够容纳文本,避免标识被截断。
内容的提问来源于stack exchange,提问作者rff234
相关产品推荐
相关产品推荐

