目录
- Scatter plots for embeddings(embedding的散点图)
- 基于marker基因的簇识别
- Combining plots in subplots使用子图
- Heatmaps
- Tracksplot
- 基因差异化的表达
下面了解在scanpy中,与可视化相关的函数,它们基本分为三个部分:
- embedding降维后的散点图(t-SNE,UMAP);
- 使用已知的marker基因识别簇;
- 基因差异表达的可视化;
我们将使用 10x 平台提供的数据集,其中包含来自 PBMC 的 68k 个 cell。 Scanpy 在其分布中包含该数据集的缩减样本,该样本仅包含 700 个细胞和 765 个高变基因。 该数据集已经过预处理和 UMAP 降维计算。
另外我们使用到以下细胞类型和marker基因:
B-cell: CD79A, MS4A1
Plasma: IGJ (JCHAIN)
T-cell: CD3D
NK: GNLY, NKG7
Myeloid: CST3, LYZ
Monocytes: FCGR3A
Dendritic: FCER1A
Scatter plots for embeddings(embedding的散点图)
使用 scanpy,可以使用 sc.pl.tsne
、sc.pl.umap
等函数轻松获得 tSNE、UMAP 和其他几种嵌入的散点图。
这些函数访问存储在 adata.obsm
中的数据。 例如 sc.pl.umap
使用存储在 adata.obsm['X_umap']
中的信息。 为了获得更大的灵活性,存储在 adata.obsm
中的任何键都可以与通用函数 sc.pl.embedding
一起使用。
import scanpy as sc
import pandas as pd
from matplotlib.pyplot import rc_contextsc.set_figure_params(dpi=100, color_map = 'viridis_r')
sc.settings.verbosity = 1
sc.logging.print_header()
"""
scanpy==1.7.2 anndata==0.7.6 umap==0.5.1 numpy==1.19.5 scipy==1.5.4 pandas==1.1.5 scikit-learn==0.24.2
statsmodels==0.12.2 python-igraph==0.9.6 louvain==0.7.0
"""
加载pbmc数据集:
pbmc = sc.datasets.pbmc68k_reduced()
pbmc
"""
AnnData object with n_obs × n_vars = 700 × 765obs: 'bulk_labels', 'n_genes', 'percent_mito', 'n_counts', 'S_score', 'G2M_score', 'phase', 'louvain'var: 'n_counts', 'means', 'dispersions', 'dispersions_norm', 'highly_variable'uns: 'bulk_labels_colors', 'louvain', 'louvain_colors', 'neighbors', 'pca', 'rank_genes_groups'obsm: 'X_pca', 'X_umap'varm: 'PCs'obsp: 'distances', 'connectivities'
"""
对于散点图,要绘制的值作为参数color给出。 这可以是 .obs
中的任何基因或任何列,其中 .obs
adata观测数据的 DataFrame
。下图显示了每个细胞包含基因CD79A数量的分布情况:
with rc_context({'figure.figsize': (4, 4)}):sc.pl.umap(pbmc, color='CD79A')
可以为颜色指定多个值。 在以下示例中,我们将绘制 6 个基因:“CD79A”、“MS4A1”、“IGJ”、CD3D、“FCER1A”和“FCGR3A”,以了解这些标记基因的表达。
此外,我们还将绘制另外两个值:n_counts
是每个 cell 的 UMI 计数(存储在 .obs
中),而 bulk_labels
是包含 10X 平台中 cell 原始标签的分类值。
每行的绘图数是使用 ncols
参数控制的。此外,我们使用 frameon=False
删除图周围的框,使用 s=50
设置点大小。
with rc_context({'figure.figsize': (3, 3)}):sc.pl.umap(pbmc, color=['CD79A', 'MS4A1', 'IGJ', 'CD3D', 'FCER1A', 'FCGR3A', 'n_counts', 'bulk_labels'], s=50, frameon=False, ncols=4, vmax='p99')
在此图中,我们可以看到marker基因的细胞组以及与原始细胞标签的一致性。
散点图的函数有许多选项,可以对图像进行微调。 例如,我们可以按如下方式查看聚类结果:
# 使用 leiden 方法计算聚类,并使用名称“clusters”存储结果
sc.tl.leiden(pbmc, key_added='clusters', resolution=0.5)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')
基于marker基因的簇识别
通过基因分布的散点图,我们可以看到一个基因的表达信息,并可能将它与一个集群相关联。 在这里,我们将展示使用点图dotplot、小提琴图violin plot、热图heatmaps和我们称之为“轨迹图tracksplot”的东西将marker基因与集群相关联的其他视觉方法。所有这些可视化都总结了相同的信息,按簇分割表达,最佳结果的选择由研究人员决定。
首先,我们建立一个带有marker基因的字典,因为这将确保 scanpy 自动标记基因组:
marker_genes_dict = {'B-cell': ['CD79A', 'MS4A1'],'Dendritic': ['FCER1A', 'CST3'],'Monocytes': ['FCGR3A'],'NK': ['GNLY', 'NKG7'],'Other': ['IGLL1'],'Plasma': ['IGJ'],'T-cell': ['CD3D'],
}
注意一共有9类细胞,但是我们做了一个假设,假设我们只知道8类细胞,并找到了各自对应的marker基因;
检查每个簇中这些基因表达的快速方法是使用点图。 这种类型的图总结了两种类型的信息:颜色代表每类cell中的基因平均表达(对于某类细胞,某个基因在该细胞簇中的平均数量),点大小表示每类基因中各类细胞的比例(对于某个基因,它在各类细胞中出现的次数比例)。
此外,向图中添加树状图以将相似的簇聚集在一起也很有用(层次聚类),如下图的右边"树结构":
sc.pl.dotplot(pbmc, marker_genes_dict, 'clusters', dendrogram=True)
使用此图,我们可以看到簇 4 对应于 B 细胞,簇 2 是 T 细胞等。此信息可用于手动注释细胞,如下所示:
# 手动创建字典将注释与簇关联
cluster2annotation = {'0': 'Monocytes','1': 'Dendritic','2': 'T-cell','3': 'NK','4': 'B-cell','5': 'Dendritic','6': 'Plasma','7': 'Other','8': 'Dendritic',
}# 通过使用pandas`map`函数将簇映射到注释,添加一个名为`cell type`的新`.obs`列
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)
探索marker的另一种方法是使用小提琴图。在这里我们可以看到 CD79A 在簇 5 和 8 中的表达,以及 MS4A1 在簇 5 中的表达。与点图相比,小提琴图为我们提供了基因表达值在细胞中的分布情况:
with rc_context({'figure.figsize': (4.5, 3)}):sc.pl.violin(pbmc, ['CD79A', 'MS4A1'], groupby='clusters' )
注意小提琴图也可用于绘制存储在 .obs
中的任何数值。 例如,这里使用小提琴图来比较不同簇之间的基因数量和线粒体基因的百分比:
with rc_context({'figure.figsize': (4.5, 3)}):# 使用 stripplot=False 删除内部点,inner='box' 在小提琴内添加一个箱线图sc.pl.violin(pbmc, ['n_genes', 'percent_mito'], groupby='clusters', stripplot=False, inner='box')
为了同时查看所有marker基因的小提琴图,我们使用 sc.pl.stacked_violin
。 和以前一样,添加了一个树状图来对相似的集群进行分组:
ax = sc.pl.stacked_violin(pbmc, marker_genes_dict, groupby='clusters', swap_axes=False, dendrogram=True)
可视化基因表达的一种简单方法是使用矩阵图。 这是按类别分组的每个基因的平均表达值的热图。 这种类型的图基本上呈现出与点图中的颜色所相同的信息。
在这里,将基因的表达从 0 缩放到 1:
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
表示反转):
# 在layer中缩放和存储结果
pbmc.layers['scaled'] = sc.pp.scale(pbmc, copy=True).Xsc.pl.matrixplot(pbmc, marker_genes_dict, 'clusters', dendrogram=True,colorbar_title='mean z-score', layer='scaled', vmin=-2, vmax=2, cmap='RdBu_r')
Combining plots in subplots使用子图
我们也可以将多个plot组合表示:
import matplotlib.pyplot as pltfig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(20,4), gridspec_kw={'wspace':0.9})ax1_dict = sc.pl.dotplot(pbmc, marker_genes_dict, groupby='bulk_labels', ax=ax1, show=False)
ax2_dict = sc.pl.stacked_violin(pbmc, marker_genes_dict, groupby='bulk_labels', ax=ax2, show=False)
ax3_dict = sc.pl.matrixplot(pbmc, marker_genes_dict, groupby='bulk_labels', ax=ax3, show=False, cmap='viridis')
Heatmaps
热图不会像之前的 matrixplot 中那样折叠 cell。相反,每个单元格显示在一行(或列,如果 swap_axes=True
)。可以添加 groupby
信息,并使用为 sc.pl.umap
或任何其他嵌入找到的相同颜色代码显示:
ax = sc.pl.heatmap(pbmc, marker_genes_dict, groupby='clusters', cmap='viridis', swap_axes=True, dendrogram=True)
热图也可以绘制在缩放数据上。 在下一张图片中,与之前的矩阵图类似,最小值和最大值已经过调整,并使用了发散色图:
ax = sc.pl.heatmap(pbmc, marker_genes_dict, groupby='clusters', layer='scaled', vmin=-2, vmax=2, cmap='RdBu_r', dendrogram=True, swap_axes=True, figsize=(11,4))
Tracksplot
轨迹图显示与热图相同的信息,但基因表达由高度表示,而不是色标:
ax = sc.pl.tracksplot(pbmc, marker_genes_dict, groupby='clusters', dendrogram=True)
基因差异化的表达
在scanpy中,可以通过分裂的小提琴图体现不同簇间某个指定基因的分布差异:
with rc_context({'figure.figsize': (9, 1.5)}):sc.pl.rank_genes_groups_violin(pbmc, n_genes=20, jitter=False)
下面截取了两个子图:簇0和其余所有簇,簇1和其余所有簇的基因差异化分布