引言
本系列讲解 使用 Scanpy
分析单细胞(scRNA-seq)数据 教程,持续更新,欢迎关注,转发!
基于已知标记基因识别细胞簇
通常,细胞簇需要利用众所周知的标记基因来进行标注。使用散点图,我们可以查看某个基因的表达情况,并可能将其与某个细胞簇关联起来。在此,我们将展示其他可视化的方式,用点图、小提琴图、热图以及我们称之为 ‘tracksplot’ 的图形,将标记基因与细胞簇关联起来。所有这些可视化方法汇总了相同的信息——按细胞簇拆分的表达量——而挑选最佳结果则留给研究者自行决定。
首先,我们建立一个包含标记基因的字典,因为这将允许 scanpy 自动对这些基因组进行分组标记:
marker_genes_dict = {
"B-cell": ["CD79A", "MS4A1"],
"Dendritic": ["FCER1A", "CST3"],
"Monocytes": ["FCGR3A"],
"NK": ["GNLY", "NKG7"],
"Other": ["IGLL1"],
"Plasma": ["IGJ"],
"T-cell": ["CD3D"],
}
dotplot
一种快速检查这些基因在每个细胞簇中表达情况的方法是使用 dotplot。这种图总结了两类信息:颜色表示每个类别(在此为每个细胞簇)内的平均表达量,而点的大小则指示该类别中表达该基因的细胞比例。
此外,在图中添加 dendrogram 也很有帮助,它能把相似的细胞簇聚集在一起。层级聚类是利用各细胞簇之间 PCA components 的相关性自动计算的。
sc.pl.dotplot(pbmc, marker_genes_dict, "clusters", dendrogram=True)
使用这张图,我们可以看到 cluster 4 对应于 B-cells,cluster 2 是 T-cells 等等。这些信息可以用来按如下方式手动注释细胞:
# create a dictionary to map cluster to annotation label
cluster2annotation = {
"0": "Monocytes",
"1": "NK",
"2": "T-cell",
"3": "Dendritic",
"4": "Dendritic",
"5": "Plasma",
"6": "B-cell",
"7": "Dendritic",
"8": "Other",
}
# add a new `.obs` column called `cell type` by mapping clusters to annotation using pandas `map` function
pbmc.obs["cell type"] = pbmc.obs["clusters"].map(cluster2annotation).astype("category")
sc.pl.dotplot(pbmc, marker_genes_dict, "cell type", dendrogram=True)
sc.pl.umap(
pbmc,
color="cell type",
legend_loc="on data",
frameon=False,
legend_fontsize=10,
legend_fontoutline=2,
)
violin plot
另一种探索标记基因的方法是使用 violin plot。在这里,我们可以看到 CD79A 在 clusters 5 和 8 中的表达,以及 MS4A1 在 cluster 5 中的表达。与 dotplot 相比,violin plot 让我们了解基因表达值在细胞间的分布情况。
with rc_context({
"figure.figsize": (4.5, 3)}):
sc.pl.violin(pbmc, ["CD79A", "MS4A1"], groupby="clusters")
注意:Violin plots 也可用于绘制任何保存在 .obs 中的数值型数据。例如,这里用 violin plots 比较不同 clusters 之间的基因数量以及线粒体基因所占百分比。
with rc_context({
"figure.figsize": (4.5, 3)}):
sc.pl.violin(
pbmc,
["n_genes", "percent_mito"],
groupby="clusters",
stripplot=False, # remove the internal dots
inner="box", # adds a boxplot inside violins
)
stacked-violin plot
为了同时查看所有标记基因的 violin plots,我们使用 sc.pl.stacked_violin。与前文相同,添加了一条 dendrogram 用以将相似的 clusters 归为一组。
ax = sc.pl.stacked_violin(
pbmc, marker_genes_dict, groupby="clusters", swap_axes=False, dendrogram=True
)
matrixplot
可视化基因表达的一种简单方法是使用 matrix plot。这是一种以类别为单位,展示每个基因平均表达量的 heatmap。这种类型的图基本上与 dotplot 中的颜色所传达的信息相同。
在此,我们将基因的表达量缩放到 0 到 1 之间,其中 1 表示该基因在所有 clusters 中的最大平均表达量,0 表示最小平均表达量。
sc.pl.matrixplot(
pbmc,
marker_genes_dict,
"clusters",
dendrogram=True,
cmap="Blues",
standard_scale="var",
colorbar_title="column scaled\nexpression",
)
另一个有用的选项是使用 sc.pp.scale 对基因表达进行标准化。在此,我们将这一结果存储在 scale 层中。随后我们调整图的最小值和最大值,并采用一条发散型色带(本例为 RdBu_r,其中 _r 表示反转)。
# scale and store results in layer
pbmc.layers["scaled"] = sc.pp.scale(pbmc, copy=True).X
sc.pl.matrixplot(
pbmc,
marker_genes_dict,
"clusters",
dendrogram=True,
colorbar_title="mean z-score",
layer="scaled",
vmin=-2,
vmax=2,
cmap="RdBu_r",
)