如何在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,完全保留聚类层级结构的同时修改列顺序。
步骤说明
- 先给矩阵列名添加编号避免重名,方便聚类树操作
- 使用和原代码完全一致的参数提前计算列的距离矩阵和聚类树,拿到可操作的聚类树对象
- 用
dendextend包的rotate函数调整聚类树分支顺序,确保同组样本相邻 - 将调整完成的聚类树直接传入
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
相关产品推荐
相关产品推荐

