按照热图聚类结果来给样本分组

1.需求


如图,热图自带聚类树,将样本(列)分成了三个簇。想要按照聚类的结果,获取到每个样本具体属于哪一簇的信息,并将这个信息添加到热图上。

2.作图的数据

输入数据是个表达矩阵,行为基因,列为样本,用随机数整一个。

rm(list = ls())
n = matrix(rnorm(800),nrow = 8)
n[,1:30] = n[,1:30]+ 3
n[,60:100] = n[,60:100] +6
n = n[,sample(1:100,100)]
rownames(n) = paste0("gene",1:8)
colnames(n) = paste0("sample",1:100)
n[1:4,1:4]
##          sample1  sample2  sample3  sample4
## gene1  0.5794523 3.837055 2.779561 2.817760
## gene2  0.3623024 4.440195 3.973745 1.896885
## gene3 -0.7953442 3.026784 2.260808 2.363162
## gene4 -0.2121879 1.033756 1.997658 3.837127

3.热图探索

常规的热图很简单

p = pheatmap::pheatmap(n,show_colnames = F,scale = "row")

我们能知道图上样本的排列顺序,但是不知道每一簇都有多少个样本,对应着哪些。

让三簇分的更清楚一些

p2 = pheatmap::pheatmap(n,show_colnames = F,scale = "row",cutree_cols = 3)

加上cutree_cols参数,热图上就有了沟,将样本分成了指定数量的组。

还是不知道怎样能得出三组个自是哪些样本的信息。我以为p2$tree_col$order里面会指明,然而并没有。

遂,搜索关键词get cluster in pheatmap,找到了一个网页:https://www.biostars.org/p/287512/ ,看到cutree居然还是个单独的函数。摸索了一下怎么使用

m = cutree(p2$tree_col,k = 3)
head(m)
## sample1 sample2 sample3 sample4 sample5 sample6 
##       1       2       2       2       1       3

这就完事儿了。m里面记录了每个样本属于哪个分组。这就是我想要的信息。

3.在热图上添加聚类分组信息

常规的差异分析也会用到列注释热图来展示数据的分组,那是已知分组,直接展示两组间差别的,和今天做的根据聚类的结果来分组不一样的哦

至于列注释如何添加上去查看帮助文档,按照annotation_col参数的示例来组织数据即可啦!

an = data.frame(row.names = colnames(n),
                m = factor(m,labels = c("A","B","C")))
pheatmap::pheatmap(n,show_colnames = F,scale = "row",cutree_cols = 3,
                   annotation_col = an)

这样 我们就根据聚类的结果来给原来的矩阵列(样本)分了组~

你可能感兴趣的:(按照热图聚类结果来给样本分组)