J
Jenny's Space DIGITAL GARDEN
生物信息

现代 Python 单细胞转录组分析实战

从 Scanpy 基础分析流到顶刊级可视化出版图表

全面重构经典 PBMC 3k 单细胞 RNA-seq 分析流:升级现代 API、多维质控、双细胞过滤、Leiden 聚类与顶刊级可视化排版。

#单细胞分析 #Scanpy #Python #生物信息 #数据科学 #完整复刻 #深度批注
🎨 图例色彩导航: 原始经典分析流(灰白底) 生信算法与质控批注(琥珀金) 2026 批次整合与自动注释前沿(青蓝卡)
🟡 编者导读 · 单细胞数据科学新纪元

单细胞 RNA 测序(scRNA-seq)已经成为现代生命科学、肿瘤免疫学和发育生物学的通用核心范式。
早期生信菜鸟团等经典的教程为大量科研同行提供了珍贵的启蒙。但随着工具链的飞速演进,早期很多直接覆盖 `adata.X`、使用 Louvain 分群、缺乏双细胞识别的做法已被现代顶级期刊所淘汰。
本文基于 Scanpy 最新工业级标准,对经典 PBMC 3k 分析流进行全量无删减代码级重构,带你一步步构建符合 Nature/Cell 顶刊标准的端到端分析管线。


🏗️ 一、新旧分析范式对比全景表

分析阶段2021 旧版教程方法2026 现代最佳实践(本文方案)核心优化优势
数据接入手动下载 10x 压缩包并解压目录sc.datasets.pbmc3k() 一行自动挂载零环境依赖,开箱即用
质控(QC)仅依赖人工硬阈值(5% 线粒体)结合 MT、核糖体 Ribo、血红蛋白与自适应质控避免误杀特定高能量代谢功能亚群
双细胞过滤缺失(导致假阳性过渡态)集成 Scrublet 预测并剔除多胞体(Doublets)消除虚假过渡态和人工合成聚集
高变基因(HVG)经验色散阈值(min_disp=0.5flavor='seurat_v3' / n_top_genes=2000筛选稳定性与生物学可解释性更优
聚类算法混用 Louvain 聚类全面采用 Leiden 社区发现算法解决 Louvain 的社区割裂与拓扑连通性缺陷
数据管理破坏性覆盖 adata.X使用 adata.layers 严格隔离原始与缩放数据保证下游差异分析使用真实泊松/负二项分布

💻 二、环境准备与经典数据集载入

pip install scanpy scrublet leidenalg matplotlib seaborn harmonypy
import scanpy as sc
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 全局环境配置
sc.settings.verbosity = 3              # 输出详细计算日志
sc.logging.print_header()
sc.settings.set_figure_params(
    dpi=100,
    dpi_save=300,
    facecolor='white',
    frameon=False,
    vector_friendly=True
)

# 一键载入经典的 10x PBMC 3k 数据集 (2700 个外周血单核细胞)
adata = sc.datasets.pbmc3k()
print(adata)
# AnnData object with n_obs × n_vars = 2700 × 32738

🔬 三、现代多维质量控制(QC)与双细胞剔除

🔘 原始内容 · 质控与过滤全代码
# 1. 标记线粒体、核糖体与血红蛋白基因
adata.var['mt'] = adata.var_names.str.startswith('MT-')
adata.var['ribo'] = adata.var_names.str.startswith(('RPS', 'RPL'))
adata.var['hb'] = adata.var_names.str.startswith('HB')

# 2. 计算标准化质控指标
sc.pp.calculate_qc_metrics(
    adata, 
    qc_vars=['mt', 'ribo', 'hb'], 
    percent_top=None, 
    log1p=False, 
    inplace=True
)

# 3. 基础过滤:过滤过低测序深度的液滴与未表达基因
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=3)

# 4. 质控阈值过滤
adata = adata[adata.obs.pct_counts_mt < 5.0, :].copy()
adata = adata[adata.obs.n_genes_by_counts < 2500, :].copy()

# 5. 运行 Scrublet 算法预测并剔除异型双细胞 (Doublets)
sc.pp.scrublet(adata)
adata = adata[adata.obs['predicted_doublet'] == False, :].copy()
print(f"✅ 质控完成,保留高质量细胞数: {adata.n_obs}")

📐 四、规范化归一化、高变基因与 Leiden 聚类

🔘 原始内容 · 降维与聚类核心步骤
# 保护原始整数 UMI 矩阵
adata.layers["counts"] = adata.X.copy()

# 1. 库容大小归一化至每细胞 10,000 counts 并取 log(1+p)
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
adata.layers["log1p_norm"] = adata.X.copy()
adata.raw = adata  # 冻结状态供下游 Marker 检验

# 2. 筛选 2000 个高变基因 (HVG)
sc.pp.highly_variable_genes(adata, n_top_genes=2000, subset=False)

# 3. PCA 降维与邻近图构建
adata_hvg = adata[:, adata.var.highly_variable].copy()
sc.pp.scale(adata_hvg, max_value=10)
sc.tl.pca(adata_hvg, svd_solver='arpack', n_comps=50)

adata.obsm['X_pca'] = adata_hvg.obsm['X_pca']
adata.varm['PCs'] = adata_hvg.varm['PCs']

sc.pp.neighbors(adata, n_neighbors=15, n_pcs=30)

# 4. UMAP 流形投影与 Leiden 聚类
sc.tl.umap(adata, min_dist=0.3)
sc.tl.leiden(adata, resolution=0.8, key_added='leiden')

🏷️ 五、生物学细胞类型精细注释

# 经典 PBMC 免疫细胞标记物字典
marker_dict = {
    'CD4+ T': ['IL7R', 'CD3D', 'CD4'],
    'CD14+ Monocytes': ['CD14', 'LYZ'],
    'B cells': ['MS4A1', 'CD79A'],
    'CD8+ T': ['CD8A', 'CD8B'],
    'NK cells': ['GNLY', 'NKG7'],
    'FCGR3A+ Monocytes': ['FCGR3A', 'MS4A7'],
    'Dendritic Cells': ['FCER1A', 'CST3'],
    'Megakaryocytes': ['PPBP']
}

# 映射聚类分群
cluster_to_celltype = {
    '0': 'CD4+ T',
    '1': 'CD14+ Monocytes',
    '2': 'B cells',
    '3': 'CD8+ T',
    '4': 'NK cells',
    '5': 'FCGR3A+ Monocytes',
    '6': 'Dendritic Cells',
    '7': 'Megakaryocytes'
}
adata.obs['cell_type'] = adata.obs['leiden'].map(cluster_to_celltype)

📊 六、顶刊级出版图表渲染展示

1. 终极 UMAP 细胞图谱

PBMC 3k Single-Cell Landscape UMAP

2. 标记基因气泡图(DotPlot)

PBMC 3k Marker Genes DotPlot


🚀 七、2026 现代单细胞多样本批次整合与前沿

🔵 2026 深度增补 · 多样本批次效应校正与自动化注释
# 多样本批次校正最佳实践 (Harmony 算法)
# sc.external.pp.harmony_integrate(adata, key='batch', basis='X_pca', adjusted_basis='X_pca_harmony')
# sc.pp.neighbors(adata, use_rep='X_pca_harmony')
# sc.tl.umap(adata)

# 自动化深度学习细胞类型注释 (CellTypist)
# import celltypist
# model = celltypist.models.Model.load(model='Immune_All_Low.pkl')
# predictions = celltypist.annotate(adata, model=model, majority_voting=True)
# adata = predictions.to_adata()

📚 资料出处与致谢