细胞通讯分析实战:Scanpy + Squidpy 完整教程
·
单细胞转录组分析做到细胞注释这一步,你已经知道组织里有哪些细胞了。但论文要讲的故事不只是"有哪些细胞"——更关键的是细胞之间在说什么。
细胞通讯分析(Cell-Cell Communication)就是回答这个问题的工具。今天用 Python 生态的 Squidpy,从零跑一遍完整的细胞通讯分析流程。
1. 环境准备
pip install scanpy squidpy matplotlib
2. 加载数据与预处理
import scanpy as sc import squidpy as sq import matplotlib.pyplot as plt # 加载空间转录组示例数据(Visium 小鼠脑) adata = sq.datasets.visium_fluo_adata() adata.var_names_make_unique() # 常规 Scanpy 预处理 sc.pp.normalize_total(adata, target_sum=1e4) sc.pp.log1p(adata) sc.pp.highly_variable_genes(adata, n_top_genes=2000, flavor='seurat_v3') adata = adata[:, adata.var.highly_variable].copy() sc.pp.scale(adata, max_value=10) sc.tl.pca(adata) sc.pp.neighbors(adata, n_pcs=30) sc.tl.leiden(adata, resolution=0.6) adata.obs['cluster'] = adata.obs['leiden']
3. 空间邻域富集分析
# 计算空间邻域图
sq.gr.spatial_neighbors(adata, n_neighs=6)
# 邻域富集:哪些细胞类型在空间上经常相邻
sq.gr.nhood_enrichment(adata, cluster_key='cluster')
sq.pl.nhood_enrichment(adata, cluster_key='cluster',
title='Neighborhood Enrichment', show=False)
plt.savefig('nhood_enrichment.pdf', dpi=300, bbox_inches='tight')
4. 配体-受体对分析
# 使用内置的配体-受体数据库(来自 CellPhoneDB / Omnipath)
sq.gr.ligrec(
adata,
n_perms=1000, # 置换检验次数
cluster_key='cluster',
interactions_params={'resources': 'CellPhoneDB'},
seed=42
)
# 可视化显著的配体-受体对
sq.pl.ligrec(
adata,
cluster_key='cluster',
source_groups='0', # 发送信号的 cluster
target_groups='1', # 接收信号的 cluster
means_range=(0.5, 5), # 均值范围过滤
pvalue_threshold=0.05, # 显著性阈值
alpha=0.001
)
plt.savefig('ligrec_cluster0_to_1.pdf', dpi=300, bbox_inches='tight')
5. 空间共表达分析
# 计算基因的空间共表达
genes = ['Gad1', 'Slc17a7', 'Aqp4']
sq.gr.co_occurrence(adata, cluster_key='cluster')
sq.pl.co_occurrence(
adata,
cluster_key='cluster',
clusters='0',
figsize=(8, 4)
)
plt.savefig('co_occurrence.pdf', dpi=300, bbox_inches='tight')
6. 提取通讯结果为表格
import pandas as pd
# 获取显著的配体-受体交互
ligrec_result = adata.uns['ligrec']
means = ligrec_result['means']
pvalues = ligrec_result['pvalues']
# 整理为 DataFrame
records = []
for (source, target, interaction), pval in pvalues.stack().items():
mean_val = means.loc[(source, target), interaction] if (source, target) in means.index else None
if pval < 0.05 and mean_val is not None and mean_val > 0.5:
records.append({
'source': source, 'target': target,
'interaction': interaction,
'mean': round(mean_val, 3),
'pvalue': round(pval, 4)
})
df = pd.DataFrame(records).sort_values('pvalue')
print(f"显著交互数: {len(df)}")
df.to_csv('significant_interactions.csv', index=False)
7. 非空间数据的通讯分析
如果你的数据没有空间坐标(普通 scRNA-seq),可以只做配体-受体分析:
# 对于非空间数据,跳过空间邻域步骤
adata_sc = sc.datasets.pbmc68k_reduced()
sc.tl.leiden(adata_sc, resolution=0.8)
# 直接用 ligrec 做配体-受体分析
sq.gr.ligrec(
adata_sc,
n_perms=500,
cluster_key='leiden',
interactions_params={'resources': 'CellPhoneDB'},
seed=42
)
8. 与 CellChat 结果对比
| 功能 | Squidpy (Python) | CellChat (R) |
|---|---|---|
| 配体-受体分析 | ✅ CellPhoneDB/Omnipath | ✅ 自建数据库 |
| 空间分析 | ✅ 原生支持 | ❌ 不支持 |
| 信号流图 | ❌ | ✅ 出图漂亮 |
| 计算速度 | 快 | 中 |
| 与 Scanpy 整合 | 无缝 | 需转换格式 |
细胞通讯分析是论文中非常有说服力的"故事线",但分析本身需要经验来判断哪些交互是生物学上有意义的。如果你需要专业的分析支持,标准化流程能确保结果既全面又可靠。
🔗 Run2AI 运智(研算AI(Run2AI) · 专注AI驱动生物科研计算与智能生信分析)——细胞通讯分析 + 全流程标准化分析,交付矢量图表可直接用于论文。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)