引言

本系列讲解 使用 Scanpy 分析单细胞(scRNA-seq)数据 教程,持续更新,欢迎关注,转发!
简介
本文旨在探索 Scanpy 在数据可视化方面的功能,并分为三个部分:
一是嵌入数据的散点图绘制,例如 UMAP 和 t-SNE;
二是利用已知标记基因识别细胞簇;
三是差异表达基因的可视化。
在本文中,我们将使用一个来自 10x 的数据集,该数据集包含 68,000 个来自外周血单个核细胞(PBMC)的细胞。Scanpy 提供了该数据集的一个简化样本,仅包含 700 个细胞和 765 个高变基因。这个简化样本已经完成了预处理,并且已经计算了 UMAP。
此外,在本文中,我们还将使用以下文献中提到的标记基因:
B 细胞 (B-cell):CD79A、MS4A1
浆细胞 (Plasma):IGJ(JCHAIN)
T 细胞 (T-cell):CD3D
自然杀伤细胞 (NK):GNLY、NKG7
髓系细胞 (Myeloid):CST3、LYZ
单核细胞 (Monocytes):FCGR3A
树突状细胞 (Dendritic):FCER1A
散点图
通过 Scanpy,我们可以轻松地利用 sc.pl.tsne、sc.pl.umap 等函数生成 tSNE、UMAP 以及其他几种嵌入的散点图。
这些函数会调用存储在 adata.obsm 中的数据。例如,sc.pl.umap 函数会读取 adata.obsm['X_umap'] 中的信息。为了提供更高的灵活性,还可以使用通用函数 scanpy.pl.embedding(),它可以处理 adata.obsm 中存储的任意键值。
import scanpy as sc
from matplotlib.pyplot import rc_context
sc.set_figure_params(dpi=100, color_map="viridis_r")
sc.settings.verbosity = 0
sc.logging.print_header()
加载 pbmc 数据集
pbmc = sc.datasets.pbmc68k_reduced()
# inspect pbmc contents
pbmc

基因表达和其他变量的可视化
在绘制散点图时,要展示的值是通过颜色参数来指定的。这个参数可以是任意一个基因,也可以是 .obs 数据框中的任意一列。
# rc_context is used for the figure size, in this case 4x4
with rc_context({
"figure.figsize": (4, 4)}):
sc.pl.umap(pbmc, color="CD79A")

可以同时绘制多个值。在下面的例子中,我们将绘制 6 个基因:“CD79A”、“MS4A1”、“IGJ”、“CD3D”、“FCER1A”和“FCGR3A”,以了解这些标记基因在哪些细胞中表达。
我们还会绘制两个其他变量:n_counts,即每个细胞的 UMI 计数(存储在 .obs 中),以及 bulk_labels,这是一个分类变量,包含来自 10X 的细胞原始分类标签。
每行显示的绘图数量可以通过 ncols 参数来控制。绘制的最大值可以通过 vmax 参数进行调整(类似地,vmin 可以用于调整最小值)。在这个例子中,我们使用 p99,即以 99 百分位数作为最大值。最大值可以是一个固定数值,也可以是一个数值列表,如果需要为多个绘图分别设置 vmax。
此外,我们使用 frameon=False 来移除绘图周围的边框,并通过 s=50 设置点的大小。
color_vars = [
"CD79A",
"MS4A1",
"IGJ",
"CD3D",
"FCER1A",
"FCGR3A",
"n_counts",
"bulk_labels",
]
with rc_context({
"figure.figsize": (3, 3)}):
sc.pl.umap(pbmc, color=color_vars, s=50, frameon=False, ncols=4, vmax="p99")

通过这个图,我们可以观察到表达标记基因的细胞群体,并且可以看到这些群体与原始细胞标签的匹配情况。
散点图的绘制函数提供了许多选项,用于对图像进行精细调整。例如,我们可以按照以下方式查看细胞聚类结果:
# compute clusters using the leiden method and store the results with the name `clusters`
sc.tl.leiden(
pbmc,
key_added="clusters",
resolution=0.5,
n_iterations=2,
flavor="igraph",
directed=False,
)
with rc_context({
"figure.figsize": (5, 5)}):
sc.pl.umap(
pbmc,
color="clusters",
add_outline=True,
legend_loc="on data",
legend_fontsize=12,
legend_fontoutline=2,
frameon=False,
title="clustering of cells",
palette="Set1",
)
