本节概览:
- CellChat简介:了解细胞通讯分析的意义和CellChat的工作原理。
- 数据准备:从Seurat对象提取表达矩阵和元数据,构建CellChat对象。
- 数据库与预处理:加载小鼠(或人类)配受体数据库,识别过表达基因和相互作用。
- 通信网络计算:计算细胞间通信概率,构建加权网络。
- 可视化:绘制整体通讯网络图(circle plot)、信号通路气泡图、特定通路的热图与贡献度分析。
- 结果解读:从宏观到微观解析细胞间“对话”的规律。
在上一节中,我们成功为每个cluster赋予了生物学身份(细胞类型),明确了组织中存在哪些细胞亚群。然而,细胞并非孤立存在——它们通过配体-受体相互作用进行信息传递,协调发育、免疫应答、肿瘤微环境等多种生理病理过程。细胞通讯分析正是从单细胞数据中推断这些“对话”的关键工具。
目前主流的方法包括CellChat、CellPhoneDB、NicheNet等。其中,CellChat因其算法严谨、可视化丰富、易于上手而广受欢迎。它通过整合配体-受体相互作用数据库,量化不同细胞类型之间的通信强度和概率,并识别关键的信号通路。
本文将带领大家从已注释好的Seurat对象出发,一步步完成CellChat分析。。
一、准备工作:加载R包和数据
首先,确保已安装CellChat及相关依赖包。如果未安装,可以运行:
# 若未安装CellChat,取消注释以下行
# devtools::install_github("sqjin/CellChat")
接下来,加载所有必需的包,并读取上一节保存的含细胞类型注释的Seurat对象。
rm(list = ls())
options(stringsAsFactors = F)
library(Seurat)
library(tidyverse)
library(patchwork)
library(RColorBrewer)
library(dplyr)
library(magrittr)
library(CellChat)
library(tidydr)
library(ggalluvial)
library(data.table)
library(ggsci)
# 读取已注释的Seurat对象
scRNA <- readRDS("4_scRNA_celltype.rds")
# 创建输出目录
dir.create("cellchat")
# 查看当前所有细胞类型
unique(scRNA$cell_type)
二、创建CellChat对象与数据库设置
2.1 提取表达数据并构建CellChat对象
CellChat要求输入标准化后的表达矩阵(log-normalized counts)以及包含细胞分组信息的meta.data。我们直接从Seurat对象中提取:
# 获取RNA assay的标准化数据(data slot)
data <- GetAssayData(scRNA, assay = "RNA", layer = "data")
# 创建CellChat对象
cellchat <- createCellChat(data,
meta = scRNA@meta.data,
group.by = "cell_type")
group.by指定了用于定义细胞群落的列名(这里是cell_type)。创建完成后,我们可以查看对象的基本信息。
2.2 加载配体-受体数据库
CellChat内置了小鼠(CellChatDB.mouse)和人类(CellChatDB.human)的数据库,包含已知的配体-受体对及其注释信息(如通路、分类等)。根据我们的物种选择对应的数据库:
# 使用小鼠数据库(请根据实际物种修改)
CellChatDB <- CellChatDB.mouse
# ### 查看数据库信息
# showDatabaseCategory(CellChatDB)
# 可选:查看数据库包含的相互作用类型
unique(CellChatDB$interaction$annotation)
# 将数据库赋值给CellChat对象
cellchat@DB <- CellChatDB


此时,cellchat对象已准备好进行后续的预处理。
三、预处理与通信网络计算
3.1 数据子集与过表达基因识别
CellChat首先需要识别在每个细胞群中过表达的基因(配体或受体),然后筛选出那些过表达配体-受体对。
# 子集化数据(只保留表达矩阵中存在的基因)
cellchat <- subsetData(cellchat)
# 识别过表达基因
cellchat <- identifyOverExpressedGenes(cellchat)
# 识别过表达的配体-受体相互作用(基于数据库)
cellchat <- identifyOverExpressedInteractions(cellchat)
# 将配体-受体对映射到蛋白质-蛋白质相互作用网络(PPI),增强推断准确性
cellchat <- projectData(cellchat, PPI.mouse)
3.2 计算通信概率
核心步骤:利用质量作用定律(即配体在发送细胞中的表达量与受体在接收细胞中的表达量的乘积)计算每对细胞类型之间的通信概率。此外,CellChat还通过网络传播和统计学检验来过滤弱信号。
# 计算通信概率(raw.use = TRUE表示使用原始表达值)
cellchat <- computeCommunProb(cellchat, raw.use = TRUE)
# 过滤低置信度的通信(至少3个细胞表达)
cellchat <- filterCommunication(cellchat, min.cells = 3)
至此,我们得到了每个配体-受体对在不同细胞对之间的通信概率。接下来,汇总到通路水平:
# 计算通路水平的通信概率
cellchat <- computeCommunProbPathway(cellchat)
# 聚合为细胞间总体通信网络(计数和权重)
cellchat <- aggregateNet(cellchat)
最后,计算网络中心性指标(用于后续识别关键发送者/接收者/中介者):
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP")
保存结果,以便后续快速加载:
save(cellchat, file = "cellchat/cellchat_1.RData")
四、可视化细胞通讯网络
4.1 整体通讯概览——Circle Plot
Circle Plot可以直观显示所有细胞类型之间的通信数量和强度。这里我们绘制两张图:一张基于通信次数(count),一张基于通信权重(weight,即概率之和)。
# 定义颜色
colors <- c(pal_npg("nrc", alpha = 1)(10),
pal_jco("default", alpha = 1)(10))
# 通信次数(边越粗代表通信对数越多)
pdf("cellchat/netVisual_cir_count.pdf", width=8, height=7)
par(mar=c(0,0,3,0))
netVisual_circle(cellchat@net$count,
color.use = colors,
vertex.weight = as.numeric(table(cellchat@idents)),
weight.scale = TRUE,
label.edge = FALSE,
title.name = "Number of Communication")
dev.off()
# 通信权重(边越粗代表总通信概率越高)
pdf("cellchat/netVisual_cir_weight.pdf", width=8, height=7)
par(mar=c(0,0,3,0))
netVisual_circle(cellchat@net$weight,
color.use = colors,
vertex.weight = as.numeric(table(cellchat@idents)),
weight.scale = TRUE,
label.edge = FALSE,
title.name = "Weight of Communication")
dev.off()


解读:
- 如果边明显更粗,表明可能通过多种配体强烈影响细胞。
- 节点大小代表该细胞类型的细胞数量,但注意通信强度已进行归一化处理,因此可以比较不同细胞对之间的相对强弱。
4.2 信号通路气泡图(Bubble Plot)
Bubble Plot展示哪些信号通路在不同细胞对之间被显著激活。它可以帮助我们快速识别哪些通路介导了特定细胞间的通信。
# 绘制所有通路的气泡图(全部细胞对)
pdf("cellchat/2_pathway_bubble_all.pdf", width=15, height=20)
netVisual_bubble(cellchat, angle.x = 45)
dev.off()
# 仅展示以Microglia为发送者的通路(例如,查看小胶质细胞如何影响神经元)
pdf("cellchat/2_pathway_bubble_microglia.pdf", width=10, height=8)
netVisual_bubble(cellchat, sources.use = c("Microglia"), angle.x = 45)
dev.off()

气泡图中,横轴为接收细胞,纵轴为信号通路。
五、深入特定信号通路
CellChat计算得到的cellchat@netP$pathways包含了所有被识别的信号通路名称。我们可以针对感兴趣的通路进行深入可视化,如绘制圆圈网络图、热图和贡献度分析。
# 查看所有通路名称
load("cellchat/cellchat_1.RData")
cellchat@netP$pathways
dir.create("cellchat/pathways")
# 遍历每个通路(此处示例仅展示前几个,实际可全部循环)
for (i in seq_along(cellchat@netP$pathways)) {
pathway <- cellchat@netP$pathways[i]
pdf(paste0("cellchat/pathways/", i, "_pathway_", pathway, ".pdf"),
width = 12, height = 6)
# 使用 tryCatch 捕获错误
tryCatch({
# 1) 圆圈网络图
netVisual_aggregate(cellchat,
signaling = pathway,
layout = "circle",
vertex.weight = as.numeric(table(cellchat@idents)))
# 2) 热图
print(netVisual_heatmap(cellchat, signaling = pathway))
# 3) 贡献度分析
print(netAnalysis_contribution(cellchat, signaling = pathway))
}, error = function(e) {
# 如果出错,打印通路名称和错误信息,但不中断循环
message("Error in pathway: ", pathway, " - ", e$message)
})
dev.off()
}



对于每个通路,我们得到三张子图:
- 圆圈图:与总体图类似,但只显示该通路介导的相互作用,边权重为该通路下的总通信概率。
- 热图:纵轴为发送细胞,横轴为接收细胞,颜色表示该通路通信概率,可发现方向性。
- 贡献度条形图:显示该通路内各配体-受体对的相对贡献,帮助我们锁定关键分子对。
六、结果解读与生物学意义
完成上述分析后,我们应当结合文献背景对结果进行解读。可能发现:
- 了解通信占主导的通路。
- 了解特定配体-受体对
cellchat结果不仅能验证已知知识,还可能发现新的调控机制,为后续实验提供方向。
七、总结与拓展
至此,我们完成了从Seurat对象到CellChat细胞通讯分析的完整流程,包括:
- 创建CellChat对象并配置数据库;
- 计算通信概率并构建网络;
- 可视化总体通讯、通路气泡图和特定通路细节;
- 提取关键配体-受体对。
细胞通讯分析打开了从“细胞组成”到“细胞功能”的桥梁,让我们在单细胞水平上理解组织微环境的调控逻辑。希望本文能帮助你顺利开展自己的CellChat分析之旅!
这里是两栖生物手册,中科院生物医学博士,持续记录生物医学实验和生物信息学笔记,干湿结合两不误~正努力成为最贴心负责的生信数据分析者和实验技术分享者,欢迎大家关注~