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

如何在heatmap.2中重排列列顺序且保留顶部聚类树的层级结构

调整heatmap.2列顺序并保留聚类树层级结构

问题描述

我正在尝试调整heatmap.2的列顺序。
使用如下代码我生成了对应的热图:

# load package
library(Heatplus)
library(gplots)

# create a matrix
m1 <- matrix(data = runif(600, 1, 1000),
             nrow = 100,
             ncol = 6)

# name the columns of the matrix
colnames(m1) <- paste0(rep(c("HIGH", "MEDIUM", "LOW"), each = 2))

# create color palette
my.colors <- colorpanel (64, low = "blue", mid = "white", high = "red")

# create heat map
heatmap.2(m1,
          scale ="row",
          distfun = function(x) dist(x,method = 'euclidean'), 
          hclustfun = hclust.ward, # agglomeration method
          Colv = T,
          trace="none",
          col = my.colors, # my color palette
          main = "how to switch the columns",
          srtCol = 45)# to change angle of the label)

需要调整列顺序的热图
我希望重新排列列(即仅交换列位置),让相同处理组的列相邻,且列重排操作必须遵守图顶部聚类树的层级结构。以上述给出的热图为例,需要将最左侧的"HIGH"列移动到最右侧,和另一个"HIGH"样本相邻。我了解到可以使用reorder.dendrogram函数翻转分支,但是我没有调试成功。我遇到的核心问题之一是无法找到、也无法获取绘图时顶部聚类树对应的对象。


解决方案

核心思路是提前单独计算列聚类树,调整分支顺序后再传入heatmap.2,完全保留聚类层级结构的同时修改列顺序。

步骤说明

  1. 先给矩阵列名添加编号避免重名,方便聚类树操作
  2. 使用和原代码完全一致的参数提前计算列的距离矩阵和聚类树,拿到可操作的聚类树对象
  3. 用dendextend包的rotate函数调整聚类树分支顺序,确保同组样本相邻
  4. 将调整完成的聚类树直接传入heatmap.2的Colv参数即可

完整可运行代码

# 加载所需包,dendextend用于处理聚类树
library(gplots)
library(dendextend)

# 生成示例矩阵,列名添加编号避免重名
m1 <- matrix(data = runif(600, 1, 1000),
             nrow = 100,
             ncol = 6)
colnames(m1) <- paste0(rep(c("HIGH", "MEDIUM", "LOW"), each = 2), 1:2)

# 调色盘参数和原代码保持一致
my.colors <- colorpanel(64, low = "blue", mid = "white", high = "red")

# 提前计算列聚类树,参数和原代码完全匹配
col_dist <- dist(t(m1), method = "euclidean")
col_hclust <- hclust(col_dist, method = "ward.D") # 原hclust.ward已弃用,替换为ward.D
col_dend <- as.dendrogram(col_hclust)

# 调整聚类树分支顺序,按需求将HIGH组移到最右侧,不改变聚类层级结构
col_dend_adj <- rotate(col_dend, c("MEDIUM1", "MEDIUM2", "LOW1", "LOW2", "HIGH1", "HIGH2"))

# 绘制热图,传入调整好的列聚类树
heatmap.2(m1,
          scale = "row",
          distfun = function(x) dist(x, method = 'euclidean'), 
          hclustfun = function(x) hclust(x, method = 'ward.D'), 
          Colv = col_dend_adj,
          trace = "none",
          col = my.colors,
          main = "调整列顺序后的热图",
          srtCol = 45)

注意事项

  • 如果需要调整其他分支顺序,仅需修改rotate函数第二个参数的标签顺序即可,只要顺序符合原聚类树的层级关系,就不会改变聚类树的结构
  • 若热图行也需要调整顺序,可使用相同逻辑提前计算行聚类树,调整后传入Rowv参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:39:03