简介
heatmap 排序的实质是对hclust的结果进行排序,由于存在聚类这一客观情况,所以我们期望的排序结果是一个局域型排序产物(在同一聚类水平下的排序)。
基本实现过程是以目前聚类树的排列顺序为基准,通过给对应位置的值一个坐标来实现顺序重排。
解析 hclust
hclust 的顺序是靠order 和 labels 两个数据控制,labels 是有顺序的名称,其座次可以被索引提取。order 则相当于索引,从labels 的相应座次选取并调整hclut的名称。
library(pheatmap)
set.seed(13)
test = matrix(rnorm(200), ncol = 10, nrow = 20,
dimnames = list(
row_names = paste0("Geno", 1:20),
col_names = paste0("Test", 1:10)
))
# heatmap
pheatmap(test)
# dist mat
mat <- dist(test)
hclust_mat <- hclust(mat)
hclust_mat$order
hclust_mat$labels
-
hclust_mat$order
[1] 11 14 16 8 17 5 20 12 1 6 9 7 10 18 3 2 19 4 13 15 -
hclust_mat$labels
[1] "Geno1" "Geno2" "Geno3" "Geno4" "Geno5" "Geno6"
[7] "Geno7" "Geno8" "Geno9" "Geno10" "Geno11" "Geno12"
[13] "Geno13" "Geno14" "Geno15" "Geno16" "Geno17" "Geno18"
[19] "Geno19" "Geno20"
强制重排序
因此,可以直接用order去强制控制hclust的顺序,从而控制热图的顺序,但这样热图的聚类树状图会非常混乱。
# reorder row_clust
index <- seq(1,20, by = 1)
hclust_mat$order <- index
pheatmap(test, cluster_rows = hclust_mat)
reorder 函数
reorder.dendrogram {stats}可以通过一个值向量实现聚类树次序重排,从而控制pheatmap的顺序,这样做的好处是实现了局域型排序,即同聚类水平的数据按照给定index排序,避免了聚类树乱序。
require(gridExtra)
# reorder 1
index <- order(rowSums(test), decreasing = TRUE)
dend = reorder(as.dendrogram(hclust_mat),
wts = index)
row_cluster <- as.hclust(dend)
p1 <- pheatmap(test, cluster_rows = row_cluster,
show_colnames = FALSE)
# reorder 2
index <- order(rowSums(test), decreasing = FALSE)
dend = reorder(as.dendrogram(hclust_mat),
wts = index)
row_cluster <- as.hclust(dend)
p2 <- pheatmap(test, cluster_rows = row_cluster,
show_colnames = FALSE)
# extract plot list
plot_list <- list(p1[[4]], p2[[4]])
grid.arrange(arrangeGrob(grobs= plot_list,ncol=2))
由此可见,通过reorder 函数中的wts(权重)来控制热图坐标顺序是有效且清晰的。
网友评论