单细胞转录组分析做到细胞注释这一步,你已经知道组织里有哪些细胞了。但论文要讲的故事不只是"有哪些细胞"——更关键的是细胞之间在说什么

细胞通讯分析(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驱动生物科研计算与智能生信分析)——细胞通讯分析 + 全流程标准化分析,交付矢量图表可直接用于论文。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐