按照热图聚类结果来给样本分组
2020-12-03 本文已影响0人
小洁忘了怎么分身
1.需求
![](https://img.haomeiwen.com/i9475888/d827e48bbad42fbe.png)
如图,热图自带聚类树,将样本(列)分成了三个簇。想要按照聚类的结果,获取到每个样本具体属于哪一簇的信息,并将这个信息添加到热图上。
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")
![](https://img.haomeiwen.com/i9475888/d827e48bbad42fbe.png)
我们能知道图上样本的排列顺序,但是不知道每一簇都有多少个样本,对应着哪些。
让三簇分的更清楚一些
p2 = pheatmap::pheatmap(n,show_colnames = F,scale = "row",cutree_cols = 3)
![](https://img.haomeiwen.com/i9475888/92484369a86fe0eb.png)
加上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)
![](https://img.haomeiwen.com/i9475888/84ec2fdc41b11551.png)
这样 我们就根据聚类的结果来给原来的矩阵列(样本)分了组~