pheatmap 坐标轴排序

简介

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
pheatmap 坐标轴排序_第1张图片
  1. hclust_mat$order
    [1] 11 14 16 8 17 5 20 12 1 6 9 7 10 18 3 2 19 4 13 15

  2. 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)
pheatmap 坐标轴排序_第2张图片

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))
pheatmap 坐标轴排序_第3张图片

由此可见,通过reorder 函数中的wts(权重)来控制热图坐标顺序是有效且清晰的。

你可能感兴趣的:(pheatmap 坐标轴排序)