实用Seurat自带的热图函数DoHeatmap
绘制的热图,感觉有点不上档次,于是我尝试使用ComplexHeatmap
这个R包来对结果进行展示。
个人觉得好的热图有三个要素
- 聚类: 能够让别人一眼就看到模式
- 注释: 附加注释能提供更多信息
- 配色: 要符合直觉,比如说大部分都会认为红色是高表达,蓝色是低表达
在正式开始之前,我们需要先获取一下pbmc的数据,Seurat提供了R包SeuratData
专门用于获取数据
1 | devtools::install_github('satijalab/seurat-data') |
加载数据并进行数据预处理,获取绘制热图所需的数据
1 | library(SeuratData) |
先感受下Seurat自带热图
1 | top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC) |
下面则是介绍如何用R包ComplexHeatmap
进行组图,虽然这个R包名带着Complex,但是并不是说这个R包很复杂,这个Complex应该翻译成复合,也就是说这个R包能在热图的基础上整合很多信息。
先安装并加载R包。
1 | BiocManager::install("ComplexHeatmap") |
为了手动绘制一个热图,要从Seurat对象中提取所需要的表达量矩阵。我提取的是原始的count值,然后用log2(count + 1)
的方式进行标准化
1 | mat <- GetAssayData(pbmc, slot = "counts") |
获取基因和细胞聚类信息
1 | gene_features <- top10 |
对表达量矩阵进行排序和筛选
1 | mat <- as.matrix(mat[top10$gene, names(cluster_info)]) |
用Heatmap
绘制热图。对于单细胞这种数据,一定要设置如下4个参数
cluster_rows= FALSE
: 不作行聚类cluster_columns= FALSE
: 不作列聚类show_column_names=FALSE
: 不展示列名show_row_names=FALSE
: 不展示行名,基因数目不多时候可以考虑设置为TRUE
1 | Heatmap(mat, |
从图中,我们可以发现以下几个问题:
- 长宽比不合理,当然这和绘图函数无关,可以在保存时修改长宽比
- 基因名重叠,考虑调整大小,或者不展示,或者只展示重要的基因
- 颜色可以调整
- 缺少聚类信息
这些问题,我们可以通过在ComplexHeatmap Complete Reference查找对应信息来解决。
配色方案
在热图中会涉及到两类配色,一种用来表示表达量的连续性变化,一种则是展示聚类。有一个神奇的R包就是用于处理配色,他的Github地址为https://github.com/caleblareau/BuenColors。
1 | devtools::install_github("caleblareau/BuenColors") |
它提供了一些列预设的颜色,比方说jdb_color_maps
1 | HSC MPP LMPP CMP CLP MEP GMP |
这些颜色就能用于命名单细胞的类群,比如说我选择了前9个
1 | col <- jdb_color_maps[1:9] |
增加列聚类信息
Heatmap
的row_split
和column_split
参数可以通过设置分类变量对热图进行分隔。更多对热图进行拆分,可以参考Heatmap split
1 | Heatmap(mat, |
只用文字描述可能不够好看,最好是带有颜色的分块图,其中里面的颜色和t-SNE或UMAP聚类颜色一致,才能更好的展示信息。
为了增加聚类注释,我们需要用到HeatmapAnnotation
函数,它对细胞的列进行注释,而rowAnnotation
函数可以对行进行注释。这两个函数能够增加各种类型的注释,包括条形图,点图,折线图,箱线图,密度图等等,这些函数的特征是anno_xxx
,例如anno_block
就用来绘制区块图。
1 | top_anno <- HeatmapAnnotation( |
其中anno_block
中的gp
参数用于设置各类图形参数,labels
设置标签,labels_gp
设置和标签相关的图形参数。可以用?gp
来了解有哪些图形参数。
1 | Heatmap(mat, |
突出重要基因
由于基因很多直接展示出来,根本看不清,我们可以强调几个标记基因。用到两个函数是rowAnnotation
和anno_mark
已知不同类群的标记基因如下
Cluster ID | Markers | Cell Type |
---|---|---|
0 | IL7R, CCR7 | Naive CD4+ T |
1 | IL7R, S100A4 | Memory CD4+ |
2 | CD14, LYZ | CD14+ Mono |
3 | MS4A1 | B |
4 | CD8A | CD8+ T |
5 | FCGR3A, MS4A7 | FCGR3A+ Mono |
6 | GNLY, NKG7 | NK |
7 | FCER1A, CST3 | DC |
8 | PPBP | Platelet |
我们需要给anno_mark
提供基因所在行即可。
1 | mark_gene <- c("IL7R","CCR7","IL7R","S100A4","CD14","LYZ","MS4A1","CD8A","FCGR3A","MS4A7","GNLY","NKG7","FCER1A", "CST3","PPBP") |
接着绘制热图
1 | Heatmap(mat, |
关于如何增加标记注释,参考mark-annotation
调增图例位置
目前的热图还有一个问题,也就是表示表达量范围的图例太占位置了,有两种解决方法
- 参数设置
show_heatmap_legend=FALSE
直接删掉。 - 利用
heatmap_legend_param
参数更改样式
我们根据legends这一节的内容进行一些调整
1 | Heatmap(mat, |
因为ComplextHeatmap是基于Grid图形系统,因此可以先绘制热图,然后再用grid::draw
绘制图例,从而实现将条形图的位置移动到图中的任意位置。
先获取绘制热图的对象
1 | p <- Heatmap(mat, |
根据p@matrix_color_mapping
获取图例的颜色的设置,然后用Legend
构建图例
1 | col_fun <- circlize::colorRamp2(c(0, 1, 2 ,3, 4), |
绘制图形
1 | grid.newpage() #新建画布 |
ComplexHeatmap绘制热图非常强大的工具,大部分我想要的功能它都有,甚至我没有想到的它也有,这个教程只是展示其中一小部分功能而已,还有很多功能要慢慢探索。