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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:47