單細胞空間轉錄分析之Scanpy-多樣本整合

和Seurat一樣,Scanpy也提供了多樣本空轉數據的整合
https://scanpy-tutorials.readthedocs.io/en/latest/spatial/integration-scanorama.html

Scanpy

單細胞空間轉錄分析之Scanpy:http://www.lxweimin.com/p/8dc231c06932
單細胞空間轉錄分析之Scanpy-多樣本整合:http://www.lxweimin.com/p/caa98aeac191
單細胞空間轉錄分析之Seurat:http://www.lxweimin.com/p/c9a601ced91f
單細胞空間轉錄分析之Seurat-多樣本整合(淺談空間批次):http://www.lxweimin.com/p/609b04096b79

這是也使用了10X官網,下載獲得小鼠大腦同一張切片前端和后端空轉數據,包括anterior1,posterior1。https://support.10xgenomics.com/spatial-gene-expression/datasets/1.1.0/V1_Mouse_Brain_Sagittal_Anterior
https://support.10xgenomics.com/spatial-gene-expression/datasets/1.1.0/V1_Mouse_Brain_Sagittal_Posterior
導入相關包

import scanpy as sc
import anndata as an
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import scanorama
sc.logging.print_versions()
sc.set_figure_params(facecolor="white", figsize=(8, 8))
sc.settings.verbosity = 3
##設置輸入路徑
import os 
os.chdir('./scanpy/Integrate') ##修改路徑
results_file = 'integrat_spatial.h5ad' ##設置結果文件保存路徑

讀取數據,標準化

adata_spatial_anterior1 = sc.read_visium("./Mouse/Brain_Section1_Sagittal_Anterior/Brain_anterior1/outs")
adata_spatial_posterior1 = sc.read_visium("./Mouse/Brain_Section1_Sagittal_Posterior/Brain_posterior1/outs")
adata_spatial_anterior1.var_names_make_unique()
adata_spatial_posterior1.var_names_make_unique()
sc.pp.calculate_qc_metrics(adata_spatial_anterior1, inplace=True)
sc.pp.calculate_qc_metrics(adata_spatial_posterior1, inplace=True)
for name, adata in [
    ("anterior", adata_spatial_anterior1),
    ("posterior", adata_spatial_posterior1),
]:
    fig, axs = plt.subplots(1, 4, figsize=(20, 4))
    fig.suptitle(f"Covariates for filtering: {name}")
    sns.distplot(adata.obs["total_counts"], kde=False, bins=60, ax=axs[0])
    sns.distplot(adata.obs["total_counts"][adata.obs["total_counts"] < 20000],kde=False, bins=60,ax=axs[1],)
    sns.distplot(adata.obs["n_genes_by_counts"], kde=False, bins=60, ax=axs[2])
    sns.distplot(adata.obs["n_genes_by_counts"][adata.obs["n_genes_by_counts"] < 4000],kde=False,bins=60,ax=axs[3], )
    plt.savefig(f"QC_plot_{name}.pdf")

for adata in [
    adata_spatial_anterior1,
    adata_spatial_posterior1,
]:
    sc.pp.normalize_total(adata, inplace=True)
    sc.pp.log1p(adata)
    sc.pp.highly_variable_genes(adata, flavor="seurat", n_top_genes=2000, inplace=True)
anterior

posterior

Scanorama數據整合

adatas = [adata_spatial_anterior1,adata_spatial_posterior1]
adatas_cor = scanorama.correct_scanpy(adatas, return_dimred=True)
adata_spatial = adatas_cor[0].concatenate(
    adatas_cor[1],
    batch_key="library_id",
    uns_merge="unique",
    batch_categories=[
        k
        for d in [
            adatas_cor[0].uns["spatial"],
            adatas_cor[1].uns["spatial"],
        ]
        for k, v in d.items()
    ],
)
sc.pp.neighbors(adata_spatial, use_rep="X_scanorama")
sc.tl.umap(adata_spatial)
sc.tl.leiden(adata_spatial, key_added="clusters")
sc.pl.umap(adata_spatial, color=["clusters", "library_id"], palette=sc.pl.palettes.default_20)
plt.savefig("umap.pdf")

clusters_colors = dict(
    zip([str(i) for i in range(18)], adata_spatial.uns["clusters_colors"])
)
fig, axs = plt.subplots(1, 2, figsize=(15, 10))

for i, library in enumerate(
    ['Brain_anterior1','Brain_posterior1']
):
    ad = adata_spatial[adata_spatial.obs.library_id == library, :].copy()
    sc.pl.spatial(
        ad,
        img_key="hires",
        library_id=library,
        color="clusters",
        size=1.5,
        palette=[
            v
            for k, v in clusters_colors.items()
            if k in ad.obs.clusters.unique().tolist()
        ],
        legend_loc=None,
        show=False,
        ax=axs[i],
    )

plt.tight_layout()
plt.savefig("spatial.pdf")
umap
spatial

相比Seurat merge直接整合,我們可以看到Scanpy去掉了部分批次,兩張切片連接處有所改善。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。