和Seurat一樣暖呕,Scanpy也提供了多樣本空轉(zhuǎn)數(shù)據(jù)的整合
https://scanpy-tutorials.readthedocs.io/en/latest/spatial/integration-scanorama.html
單細(xì)胞空間轉(zhuǎn)錄分析之Scanpy:http://www.reibang.com/p/8dc231c06932
單細(xì)胞空間轉(zhuǎn)錄分析之Scanpy-多樣本整合:http://www.reibang.com/p/caa98aeac191
單細(xì)胞空間轉(zhuǎn)錄分析之Seurat:http://www.reibang.com/p/c9a601ced91f
單細(xì)胞空間轉(zhuǎn)錄分析之Seurat-多樣本整合(淺談空間批次):http://www.reibang.com/p/609b04096b79
這是也使用了10X官網(wǎng),下載獲得小鼠大腦同一張切片前端和后端空轉(zhuǎn)數(shù)據(jù)布疙,包括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
導(dǎo)入相關(guān)包
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
##設(shè)置輸入路徑
import os
os.chdir('./scanpy/Integrate') ##修改路徑
results_file = 'integrat_spatial.h5ad' ##設(shè)置結(jié)果文件保存路徑
讀取數(shù)據(jù)辰如,標(biāo)準(zhǔn)化
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)
Scanorama數(shù)據(jù)整合
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")
相比Seurat merge直接整合拌牲,我們可以看到Scanpy去掉了部分批次,兩張切片連接處有所改善撮珠。