You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

绘制聚类热图时,如何保持行列的原始输入顺序?

保持原始行列顺序同时展示聚类的热图绘制方案

我完全理解你的痛点——想要保留样本和变量的原始顺序,同时又能看到聚类的结果,而不是单纯关掉聚类功能。其实核心思路是把聚类计算和行列排序分开:先算出聚类树用于展示,然后强制热图使用原始的行列顺序,而不是聚类后的排序。下面给你两个常用R包的实现方法:

方法1:使用pheatmap

pheatmap是最常用的热图工具之一,通过手动指定聚类对象和行列顺序就能实现需求:

  1. 先计算行和列的聚类树:
# 假设你的数据矩阵是mat,行是样本,列是变量
row_clust <- hclust(dist(mat))  # 行聚类
col_clust <- hclust(dist(t(mat)))  # 列聚类
  1. 绘制热图时,指定聚类树,同时强制行列使用原始顺序:
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是更好的选择,实现逻辑类似:

  1. 先计算聚类树:
library(ComplexHeatmap)
row_dend <- hclust(dist(mat))
col_dend <- hclust(dist(t(mat)))
  1. 绘制热图,指定聚类树和原始行列顺序:
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_roworder_col可能无法正确匹配顺序。

内容的提问来源于stack exchange,提问作者nik

火山引擎 最新活动