如何保持行列顺序绘制符合预期的基因表达z-score热图?
解决heatmap()生成符合PAM聚类分组热图的问题
问题出在heatmap()默认会对行进行聚类,即便你设置了cluster_columns=FALSE,行的顺序还是会被内置的聚类算法打乱,和你的PAM聚类结果不匹配。要生成和示例一致的热图,需要手动按PAM聚类结果排序行,并关闭行聚类功能,具体步骤如下:
1. 预处理数据
首先把表达数据和PAM聚类结果分离,确保表达矩阵是纯数值类型,同时将基因名称设为行名(如果还没设置的话):
# 假设你的数据框名为df,基因名称在第一列,最后一列是PAM_cluster rownames(df) <- df[, 1] # 将基因名称设为行名 expr_data <- df[, -c(1, ncol(df))] # 提取表达数据(去掉基因名和聚类列) pam_clusters <- df$PAM_cluster # 提取PAM聚类结果
2. 按PAM聚类结果排序行
把同一聚类组的基因放在一起,确保热图的行顺序和你的聚类结果一致:
# 按聚类标签排序行索引 sorted_row_idx <- order(pam_clusters) # 生成排序后的表达矩阵 sorted_expr_mat <- as.matrix(expr_data[sorted_row_idx, ])
3. 绘制符合要求的热图
调用heatmap()时,关闭行、列的自动聚类(Rowv=NA和Colv=NA),同时可以添加行侧颜色条标记聚类分组:
# 定义z-score对应的颜色映射(蓝色负、红色正) z_color_palette <- colorRampPalette(c("darkblue", "white", "darkred"))(100) # 为不同聚类组分配颜色(根据你的聚类数量调整颜色数量) cluster_color_map <- c("#1b9e77", "#d95f02", "#7570b3")[pam_clusters[sorted_row_idx]] # 绘制热图 heatmap(sorted_expr_mat, Rowv = NA, # 关闭行聚类,保持自定义排序 Colv = NA, # 关闭列聚类 scale = "none", # 数据已是z-score,无需再缩放 col = z_color_palette, RowSideColors = cluster_color_map, # 行侧添加聚类分组颜色条 margins = c(12, 10), # 调整边距避免标签截断 xlab = "组织样本", ylab = "基因名称")
关键说明
Rowv=NA是核心:这个参数会禁用heatmap()的行自动聚类,强制使用你预先排序好的行顺序,这也是你之前设置cluster_columns=FALSE但结果不符的原因——只关了列聚类,行聚类还在生效。- 如果需要更灵活的注释(比如列注释、更美观的颜色条),可以改用
gplots包的heatmap.2()函数,它支持更多自定义选项,但上述基础方法已经能满足你的核心需求。
内容的提问来源于stack exchange,提问作者Alphonse Charbel
相关产品推荐
相关产品推荐

