绘制聚类热图时,如何保持行列的原始输入顺序?
保持原始行列顺序同时展示聚类的热图绘制方案
我完全理解你的痛点——想要保留样本和变量的原始顺序,同时又能看到聚类的结果,而不是单纯关掉聚类功能。其实核心思路是把聚类计算和行列排序分开:先算出聚类树用于展示,然后强制热图使用原始的行列顺序,而不是聚类后的排序。下面给你两个常用R包的实现方法:
方法1:使用pheatmap包
pheatmap是最常用的热图工具之一,通过手动指定聚类对象和行列顺序就能实现需求:
- 先计算行和列的聚类树:
# 假设你的数据矩阵是mat,行是样本,列是变量 row_clust <- hclust(dist(mat)) # 行聚类 col_clust <- hclust(dist(t(mat))) # 列聚类
- 绘制热图时,指定聚类树,同时强制行列使用原始顺序:
library(pheatmap) pheatmap(mat, cluster_rows = row_clust, # 传入预先计算的行聚类树 cluster_cols = col_clust, # 传入预先计算的列聚类树 order_row = rownames(mat), # 强制行按原始行名顺序排列 order_col = colnames(mat), # 强制列按原始列名顺序排列 treeheight_row = 20, # 调整行聚类树的高度,按需设置 treeheight_col = 20) # 调整列聚类树的高度
这样绘制出的热图,行列完全保持你输入时的顺序,但旁边会显示基于数据计算的聚类树,完美兼顾了顺序保留和聚类展示的需求。
方法2:使用ComplexHeatmap包
如果你需要更灵活的热图定制,ComplexHeatmap是更好的选择,实现逻辑类似:
- 先计算聚类树:
library(ComplexHeatmap) row_dend <- hclust(dist(mat)) col_dend <- hclust(dist(t(mat)))
- 绘制热图,指定聚类树和原始行列顺序:
Heatmap(mat, row_dend_width = unit(20, "mm"), # 设置行聚类树宽度 column_dend_height = unit(20, "mm"), # 设置列聚类树高度 row_order = rownames(mat), # 原始行顺序 column_order = colnames(mat), # 原始列顺序 cluster_rows = row_dend, # 展示行聚类树 cluster_columns = col_dend) # 展示列聚类树
这个包还支持添加更多注释层,如果你后续有扩展需求会更方便。
关键原理说明
默认情况下,热图包会根据聚类结果自动重新排序行列,我们这里的操作相当于“解绑”了聚类和排序:聚类树是基于数据真实计算的(能反映样本/变量的相似性),但热图的展示顺序强制使用原始输入的顺序,完全满足你“保持样本与输入顺序一致+展示聚类”的要求。
注意:如果你的行名或列名存在重复,先确保它们是唯一的,否则order_row和order_col可能无法正确匹配顺序。
内容的提问来源于stack exchange,提问作者nik




