当前位置: 首页 > news >正文

单细胞学习(13)—— Seurat → Scanpy 分析流程

下面是一份从 Seurat 分析流程转到Scanpy 分析流程的简要笔记,涵盖了从数据读入到细胞注释的主要环节,并附上常用函数的Seurat vs. Scanpy 对照表。该笔记既可作为工作流程指南,也能在两个分析平台之间快速切换和比较。


Seurat → Scanpy 分析流程笔记

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1. 数据读入

Seurat 中的数据读入(回顾)

  • 常规 10x 数据:

    library(Seurat)
    seurat_obj <- Read10X("filtered_feature_bc_matrix/")
    seurat_obj <- CreateSeuratObject(counts = seurat_obj, project = "scRNA")
    
  • RDS 文件读入:

    seurat_obj <- readRDS("seurat_obj.rds")
    

Scanpy 中的数据读入

  • 读入 10x 过滤矩阵(推荐)
    import scanpy as sc
    adata = sc.read_10x_mtx(
        "filtered_feature_bc_matrix", 
        var_names='gene_symbols', 
        cache=True
    )
    
  • 如果有 H5 文件(如 filtered_feature_bc_matrix.h5):
    adata = sc.read_10x_h5("filtered_feature_bc_matrix.h5")
    
  • 若是从 Seurat 对象(.Rds)转换,推荐 SeuratDisk 将其转为 H5AD 后再读入:
    # R 端:
    library(SeuratDisk)
    SaveH5Seurat(seurat_obj, filename="seurat.h5Seurat")
    Convert("seurat.h5Seurat", dest="h5ad", overwrite=TRUE)
    
    # Python 端:
    import scanpy as sc
    adata = sc.read_h5ad("seurat.h5ad")
    

2. 数据预处理 / 质控(QC)

Scanpy 中,你可以类似 Seurat 那样进行 QC 过滤。

Seurat 中的常规 QC

seurat_obj <- subset(seurat_obj, subset = nFeature_RNA > 200 & nFeature_RNA < 6000 & percent.mt < 10)

Scanpy 中的常规 QC

# 过滤低基因表达细胞
sc.pp.filter_cells(adata, min_genes=200)

# 过滤低表达基因
sc.pp.filter_genes(adata, min_cells=3)

# (可选)对于线粒体基因的过滤:
# 1. 计算线粒体基因比例
adata.var['mt'] = adata.var_names.str.startswith('MT-')
adata.obs['percent_mt'] = (
    np.sum(
        adata[:, adata.var['mt']].X, axis=1
    )
    / np.sum(adata.X, axis=1)
) * 100

# 2. 根据线粒体基因比例进行过滤
adata = adata[adata.obs['percent_mt'] < 10, :]

3. 归一化与高变基因选择

Seurat

# 归一化
seurat_obj <- NormalizeData(seurat_obj)

# 查找高变基因
seurat_obj <- FindVariableFeatures(seurat_obj, selection.method="vst", nfeatures=2000)

Scanpy

# Total-count normalize (与 Seurat 的 NormalizeData 相似)
sc.pp.normalize_total(adata, target_sum=1e4)

# 取 log
sc.pp.log1p(adata)

# 查找高变基因(与 Seurat 策略相似)
sc.pp.highly_variable_genes(
    adata,
    flavor='seurat',      # 使用Seurat VST算法
    n_top_genes=2000
)

# 过滤数据,仅保留高变基因
adata = adata[:, adata.var['highly_variable']]

4. 降维与聚类

Seurat

# PCA
seurat_obj <- RunPCA(seurat_obj, npcs=50)

# 邻接图/邻居查找
seurat_obj <- FindNeighbors(seurat_obj, dims=1:30)

# 聚类
seurat_obj <- FindClusters(seurat_obj, resolution=0.5)

# UMAP
seurat_obj <- RunUMAP(seurat_obj, dims=1:30)

Scanpy

# PCA
sc.pp.pca(adata, n_comps=50)

# 邻接图
sc.pp.neighbors(adata, n_neighbors=10, n_pcs=30)

# 聚类(Leiden 算法)
sc.tl.leiden(adata, resolution=0.5)

# UMAP
sc.tl.umap(adata)

注: Seurat 使用 Louvain / SLM 聚类,Scanpy 中 sc.tl.leiden 是一种改进版的社区检测算法,效果与 Seurat 类似或更佳。


5. 不同分辨率下的聚类遍历

Seurat 可以直接传递一个 resolution.range,如:

resolution.range <- c(0.1, 0.2, 0.3, 0.5)
FindClusters(seurat_obj, resolution = resolution.range)

Scanpy 中要手动遍历:

resolutions = [0.1, 0.2, 0.3, 0.5]
for res in resolutions:
    sc.tl.leiden(adata, resolution=res, key_added=f'leiden_{res}')
    sc.pl.umap(adata, color=f'leiden_{res}')

若要保存多个分辨率结果的 UMAP 图到同一个 PDF,可参考:

from matplotlib.backends.backend_pdf import PdfPages
pdf_path = "UMAP_by_resolution.pdf"

with PdfPages(pdf_path) as pdf:
    for res in resolutions:
        sc.tl.leiden(adata, resolution=res, key_added=f'leiden_{res}')
        fig = sc.pl.umap(adata, color=f'leiden_{res}', show=False, return_fig=True)
        pdf.savefig(fig)
        plt.close(fig)

6. 差异基因分析与可视化

Seurat

# FindAllMarkers
markers <- FindAllMarkers(seurat_obj, test.use="wilcox")

可视化:

FeaturePlot(seurat_obj, features="CD3E", cols=c("gray", "red"))
DotPlot(seurat_obj, features=c("CD3E", "NKG7"), group.by="seurat_clusters")

Scanpy

# 差异基因分析
sc.tl.rank_genes_groups(adata, groupby="leiden", method="wilcoxon")

# 查看结果
sc.pl.rank_genes_groups(adata, n_genes=5, sharey=False)

可视化 Marker 基因:

# UMAP feature plot(类似 Seurat FeaturePlot)
sc.pl.umap(adata, color=["CD3E"], cmap="Reds")

# DotPlot(类似 Seurat DotPlot)
marker_genes = ["CD3E","NKG7","CD68","KRT19"]
sc.pl.dotplot(adata, var_names=marker_genes, groupby="leiden", cmap="Reds")

7. 细胞注释

Seurat 中,一般通过 IdentsAddMetaData 给细胞添加类型标签;在 Scanpy 中,你可以修改 adata.obs 列添加注释:

# 假设你对各群集根据 Marker 基因进行了人工判定
celltype_dict = {
    "0": "Epithelial",
    "1": "T Cells",
    "2": "NK Cells",
    # ...
}
# 假设分辨率=0.5时存储在 leiden_0.5
adata.obs["celltype"] = adata.obs["leiden_0.5"].map(celltype_dict)

# 再次绘制UMAP,颜色按 celltype
sc.pl.umap(adata, color="celltype")

Seurat vs. Scanpy 主要函数对照表

分析步骤Seurat ®Scanpy (Python)
数据读入Read10X() / CreateSeuratObject()sc.read_10x_mtx() / sc.read_10x_h5()
质控 (QC)subset()sc.pp.filter_cells() / sc.pp.filter_genes()
线粒体基因过滤PercentageFeatureSet(... pattern = "^MT-")手动提取后过滤 (见 adata.obs['percent_mt'])
归一化NormalizeData()sc.pp.normalize_total() + sc.pp.log1p()
高变基因FindVariableFeatures()sc.pp.highly_variable_genes()
PCARunPCA()sc.pp.pca()
邻居查找FindNeighbors()sc.pp.neighbors()
聚类FindClusters()sc.tl.leiden()
UMAP/t-SNERunUMAP() / RunTSNE()sc.tl.umap() / sc.tl.tsne()
差异基因FindAllMarkers() / FindMarkers()sc.tl.rank_genes_groups()
FeaturePlotFeaturePlot()sc.pl.umap(..., color='GENE')
DotPlotDotPlot()sc.pl.dotplot()
细胞类型注释Idents() / AddMetaData()adata.obs['celltype'] = ...
保存对象saveRDS()adata.write("xxx.h5ad")

8. 小结

  1. 数据读入:如果是 10x 的过滤矩阵,Seurat 用 Read10X(),Scanpy 用 sc.read_10x_mtx()/sc.read_10x_h5();若已在 Seurat 中整合好,可先用 SeuratDisk 转换为 .h5ad
  2. 质控与预处理:二者均可进行基于基因数、细胞数、线粒体基因比例等过滤。Scanpy 常需手动计算线粒体比例。
  3. 高变基因、PCA、聚类、UMAP 等流程在 Scanpy 中与 Seurat 非常相似,只是函数名称与参数略有不同。
  4. 差异基因分析:Seurat 中常用 FindAllMarkers(),Scanpy 中则是 sc.tl.rank_genes_groups().
  5. 可视化:Seurat 提供 FeaturePlot()DotPlot() 等函数;Scanpy 对应 sc.pl.umap(...)sc.pl.dotplot()
  6. 细胞注释:在 Scanpy 中,直接修改 adata.obs["celltype"],并用 sc.pl.umap(color="celltype") 可视化。

总体而言,Seurat 与 Scanpy单细胞分析思路上高度相似,只是实现细节、函数名和可视化风格略有区别。若你已有完备的 Seurat 分析经验,迁移到 Scanpy 通常是逻辑函数名的平移,很快能上手。


参考命令与提示

  • 如果有大规模数据(>10 万细胞),Scanpy 的处理速度与内存占用通常较 Seurat 更有优势。
  • 若仍需 Seurat 强大的可视化整合包(如 SeuratWrappers),可在小规模数据或特定分析环节中继续使用 R + Seurat。
  • 混合使用:在 R 中做部分分析后,将结果(如细胞注释)输出为 .csv,或使用 SeuratDisk 生成 .h5ad 以在 Python 端进一步扩展(如 scanpy, squidpy, cellchat Python 版等)。

以上为 Seurat → Scanpy 的主要流程笔记,涵盖从数据读入、质量控制、归一化、高变基因选择、聚类及可视化、差异基因分析、到细胞注释的完整思路。

相关文章:

  • UnrealEngine开发无人机飞行模拟软件的手柄如何选择
  • JAVA生产环境(IDEA)排查死锁
  • Grafana Windows在 Windows 上轻松实现数据监控与可视化
  • VSCODE - 连接远程linux服务器,报错XHR failed 解决方法
  • C语言-------结构体(1)
  • 华宇TAS应用中间件与因朵科技多款产品完成兼容互认证
  • 内容中台驱动企业数字化内容管理高效协同架构
  • Spring框架中都用到了哪些设计模式?
  • 电商小程序(源码+文档+部署+讲解)
  • 【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析
  • MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
  • 卷积神经网络实战人脸检测与识别
  • java面试题-集合篇
  • 游戏引擎学习第98天
  • 【环境安装】重装Docker-26.0.2版本
  • 欧拉公式在信号处理中的魔法:调幅信号的生成与频谱分析
  • 利用AI智能体创建云端文档知识库并集成第三方数据源(上)
  • 【项目日记(五)】第二层: 中心缓存的具体实现
  • 黑马SpringCloud微服务课程总结(一)
  • 第一章嵌入式系统概论考点04SoC芯片
  • 男子聚餐饮酒后身亡,同桌3人被判赔偿近20万元
  • 民间打拐志愿者上官正义遭人身安全威胁,杭州公安:已立案
  • 美国失去最后的AAA主权评级,继标普、惠誉后再遭穆迪降级
  • 从近200件文物文献里,回望光华大学建校百年
  • 六省会共建交通枢纽集群,中部离经济“第五极”有多远?
  • 王伟妻子人民日报撰文:81192,一架永不停航的战机