日常瞎掰
通过标题大家已经知道今天我们分享的主要内容了。DoHeatmap这个函数来自于Seurat包,处理过单细胞的人应该都知道这个函数就是用来画每个cluster的marker基因热图的。那么,用这个函数的时候需要注意哪些关键的点呢?不要认为任何数据都可以一键处理得到结果,也许咱们的结果遗漏了重要的信息,也许咱们就无法画出热图。不要问我是怎么知道的!下面我就来分享一下踩坑后知道的两个点:
1、首先搞清楚做热图前ScaleData时用的基因数量;
2、细胞数量是不是超过30k。
为什么要搞清楚ScaleData时用的基因数量呢?我们都知道Seurat中函数都有默认的参数,比如默认FindVariableFeatures不设定基因数时默认是前个高变基因。而ScaleData默认使用的基因是FindVariableFeatures找出来的基因,这样一来如果ScaleData函数也没有指定哪些基因,那么该函数用的也就是前2000个高变基因。关键来了,由于DoHeatmap画图时用的数据是ScaleData后的数据集,而FindAllMarkers用的数据集是NormalizeData后的数据集,这就会造成DoHeatmap画热图用的是前2000个高变基因中的marker基因,不在前2000个高变基因中的marker是不会出现在热图中的!
为什么要注意细胞量是不是超过30k?这是因为超过30k细胞集有可能由于数据集过大而导致画不出热图,这个时候我们可以采取随机取样的方式将细胞数量downsample到30k以下,这样操作一番基本就可以正常出图了。
代码演练
例如有一个Seurat的对象包含69000个细胞和36615个基因,这里仅为了说明如何避免以上两点可能带来的坑,示例代码不是很完整:
>library(Seurat)
>library(dplyr)
>sceagg
An object of class Seurat
36615 features across 69000 samples within 1 assay
Active assay: RNA (36615 features, 0 variable features)
# 给所有基因都做一下scale
>sceagg <- ScaleData(object = sceagg, features = rownames(sceagg))
# 每个cluster选取300个细胞来画热图
>all.markers %>%
group_by(cluster) %>%
top_n(n = 10, wt = avg_log2FC) -> top10
>set.seed(42)
>subobj <- subset(sceagg, downsample = 300)
>options(repr.plot.width = 13, repr.plot.height=13)
>DoHeatmap(subobj, features = top10$gene, disp.min=-2.5, disp.max=2.5)
结果如下图:
以上操作我们将所有基因都做了一下scale,以免绘制热图时可能遗漏marker基因,并且数据集含有69000个细胞,由于细胞数过大直接画DoHeatmap没法出图,所以这里我们每个cluster选取300个细胞来做热图。
结束语
每当使用Seurat包的时候,心里都不由的感叹!开发这个包的那些人真是厉害,可以让Seurat包用起来这么友好。虽然Seurat包用来处理单细胞很好用,但还是有很多细节有时候需要特别的注意,不然有可能会错过一些信息。
参考原文<<DoHeatmap画热图时应该注意的点>>