Skip to content

细胞分化往哪走?Monocle2 一条轨迹画清楚——云服务器预装,登录即跑 ​

看别人的单细胞文章,拟时序轨迹图分支清晰、伪时间梯度漂亮、基因动态热图层次分明;轮到自己用 Monocle2,从 Seurat 对象转 Monocle、降维、排序、画轨迹、找分支点、画热图……步骤多、参数杂、一个报错卡半天。

这篇把 Monocle2 拟时序分析的全流程可视化封装成一篇代码,代码、数据、环境放在一个文件夹,全部预置在服务器公共路径,使用绝对路径激活,登录直接跑。

一、Monocle2 的“六件套”可视化 ​

Monocle2 是单细胞拟时序分析的经典工具,核心就围绕一件事:

把细胞按分化顺序排成一条线,再告诉你关键的分叉口在哪。

围绕这件事,它产出的六类图基本覆盖了发文所需的全部拟时序可视化:

图函数看什么
细胞轨迹图plot_cell_trajectory细胞在二维流形上的分布,按状态或伪时间着色
基因动态趋势图plot_genes_in_pseudotime指定基因沿伪时间轴的表达变化曲线
分支热图plot_genes_branched_heatmap分支点两侧基因的表达模式差异
拟时序基因热图plot_pseudotime_heatmap全基因组层面随伪时间显著变化的基因聚类
状态统计图plot_cell_trajectory(..., color_by = "State")各状态细胞的数量与空间分布
伪时间梯度图plot_cell_trajectory(..., color_by = "Pseudotime")从起点到终点的连续时间梯度

共同特点:一张图讲清楚一个生物学问题。轨迹图看分化方向,热图看基因动态,分支图看命运决定——组合起来就是一套完整的故事线。

二、用大白话讲一遍原理 ​

把单细胞数据想象成一张城市地铁图。每个细胞是一个地铁站,基因表达量就是各站的人流量。Monocle2 的工作分三步:

  1. 铺轨(DDRTree 降维):根据各站的人流量变化规律,反推地铁线路是怎么铺的——哪站是起点、哪站是换乘点、哪条线通往哪个终点。DDRTree 算法把高维的地铁网络压成一张二维地图。
  2. 排号(orderCells):给每个站标上“距起点的距离”,这就是伪时间(Pseudotime)。越靠近起点的站,分化程度越低;越远的,越成熟。
  3. 找分叉口(BEAM):看哪条线路在哪个换乘点分道扬镳,鉴定决定细胞命运走向的关键基因。

你不需要懂背后的数学,只需要知道:跑完这套流程,你能得到一张“细胞分化地铁图”。

三、环境:登录即用 ​

Monocle2 已预装在公共 condaR 环境中,代码、数据、环境放在一个文件夹,环境绝对路径为:

text
/media/share/share_code/一篇代码搞定monocle2的所有可视化/monocle

环境内置 R 4.4.3。RStudio 自带 R 与该环境大版本一致即可直接使用:4.4.x 通用 4.4,4.5.x 通用 4.5;可先在 RStudio Console 输入 R.version.string 查看版本。

情况一:版本匹配 ​

直接在 RStudio Console 指定库路径并加载:

r
.libPaths("/media/share/share_code/一篇代码搞定monocle2的所有可视化/monocle/lib/R/library")
library(monocle)

情况二:版本不匹配 ​

在 RStudio Terminal 激活环境,再输入大写 R:

bash
source /media/share/share_code/一篇代码搞定monocle2的所有可视化/monocle/bin/activate
R

工作目录请设到自己目录,不在公共路径下读写。

四、实战:从 Seurat 到六张拟时序图 ​

示例数据是一份 Seurat 对象,需要先从 Seurat 构建 Monocle 的 CellDataSet,再跑降维、排序、可视化。完整流程一条代码到底,不需要自己拆步骤。

4.1 数据导入与 Monocle 对象构建 ​

先在 RStudio Terminal 创建工作目录并启动公共环境:

bash
mkdir -p ~/monocle2_demo
cd ~/monocle2_demo
source /media/share/share_code/一篇代码搞定monocle2的所有可视化/monocle/bin/activate
R

进入 R 后,指定公共库路径、读取示例数据并构建 Monocle 对象:

r
.libPaths("/media/share/share_code/一篇代码搞定monocle2的所有可视化/monocle/lib/R/library")
library(monocle)
library(Seurat)

# 读取示例数据(Seurat 对象)
raw_seurat <- readRDS(
  "/media/share/share_code/一篇代码搞定monocle2的所有可视化/test.rds"
)

# 构建 Monocle CellDataSet
pd <- new("AnnotatedDataFrame", data = raw_seurat@meta.data)
fData <- data.frame(
  gene_short_name = row.names(raw_seurat),
  row.names = row.names(raw_seurat)
)
fd <- new("AnnotatedDataFrame", data = fData)

# expressionFamily:TPM/FPKM 数据用 tobit(Lower = 0.1),count 数据用 negbinomial.size()
# Seurat v5 版本取 counts
counts_matrix <- GetAssayData(raw_seurat, assay = "RNA", layer = "counts")

cds <- newCellDataSet(
  as(as.matrix(counts_matrix), "sparseMatrix"),
  phenoData = pd,
  featureData = fd,
  lowerDetectionLimit = 0.5,
  expressionFamily = negbinomial.size()
)

# 估计 size factors 和 dispersions(negbinomial.size 必需)
cds <- estimateSizeFactors(cds)
cds <- estimateDispersions(cds)

# 挑选高离散基因作为排序基因
disp_table <- dispersionTable(cds)
ordering_genes <- subset(
  disp_table,
  mean_expression >= 0.1 & dispersion_empirical >= 1 * dispersion_fit
)$gene_id
cds <- setOrderingFilter(cds, ordering_genes)

# 降维(DDRTree)
tryCatch(
  {
    cds <- reduceDimension(cds, max_components = 2, method = "DDRTree")
  },
  error = function(e) {
    cds <- reduceDimension(
      cds,
      max_components = 2,
      method = "DDRTree",
      auto_param_selection = FALSE
    )
  }
)

# 排序细胞
cds <- orderCells(cds)

图 1|细胞轨迹图(按状态着色) ​

r
plot_cell_trajectory(cds, color_by = "State")

细胞轨迹图(状态着色)

细胞在二维流形上铺展开,不同颜色代表不同的推断状态(State),能一眼看出细胞群体分成了几条“线”、几个“簇”。

也可按细胞类型着色:

r
plot_cell_trajectory(cds, color_by = "final_cell_type")

细胞轨迹图(细胞类型着色)

图 2|细胞轨迹图(按伪时间着色) ​

r
plot_cell_trajectory(cds, color_by = "Pseudotime")

细胞轨迹图(伪时间着色)

同一轨迹,这次按伪时间渐变着色——从蓝到红的连续梯度,就是细胞从低分化到高分化的“时间轴”。

图 3|关键基因动态趋势 ​

r
marker_genes <- c("PDCD1", "CCR7") # 请替换为实际基因名
cds_subset <- cds[marker_genes, ]
plot_genes_in_pseudotime(cds_subset, color_by = "State")

关键基因动态趋势图

指定几个你关心的 marker 基因,看它们沿伪时间轴的表达起伏。哪些基因在分化早期高表达、哪些在晚期才启动,曲线一目了然。

图 4|分支命运决定热图 ​

r
beam_res <- BEAM(cds, branch_point = 2)
plot_genes_branched_heatmap(cds, branch_point = 2, num_clusters = 4)

分支命运决定热图

在分支点两侧,哪些基因的表达模式发生了“分道扬镳”式的变化?热图按聚类排列,每一类基因对应一种命运走向的分子标签。

如果轨迹没有分支,可跳过此步骤。

图 5|拟时序相关基因热图(Top 50) ​

r
p <- plot_pseudotime_heatmap(
  cds,
  num_clusters = 2,
  show_rownames = TRUE,
  return_heatmap = TRUE
)
ggsave(
  "pseudotime_dependent_gene_heatmap_top50.pdf",
  p,
  width = 9,
  height = 5,
  limitsize = FALSE
)

拟时序相关基因热图

全基因组层面筛选随伪时间显著变化的基因,取 Top 50 画热图并按表达模式聚类。行是基因、列是细胞,颜色深浅是表达量——这张图直接放进文章当 Figure 都够格。

表 6|基因聚类结果表 ​

热图聚类结果同时输出为表格文件,方便后续按 cluster 提取基因名单做功能注释:

r
clusters <- cutree(p$tree_row, k = 2)
clustering <- as.data.frame(clusters) %>%
  rownames_to_column(var = "gene")
write.table(
  clustering,
  "pseudotime_dependent_gene_heatmap_top50_gene_by_cluster11.xls",
  sep = "\t",
  quote = FALSE,
  col.names = TRUE,
  row.names = FALSE
)

五、结果文件一览 ​

运行完成后,五张图和一个配套表格输出到你的个人工作目录:

  • trajectory_state.pdf——细胞轨迹图(状态着色)
  • trajectory_pseudotime.pdf——细胞轨迹图(伪时间着色)
  • gene_pseudotime_trends.pdf——基因动态趋势图
  • branch_heatmap.pdf——分支命运决定热图
  • pseudotime_dependent_gene_heatmap_top50.pdf——拟时序基因热图(Top 50)
  • pseudotime_dependent_gene_heatmap_top50_gene_by_cluster11.xls——基因聚类表

六、小结 ​

  • Monocle2 = 经典拟时序分析工具,从 Seurat 对象构建 → DDRTree 降维 → 伪时间排序 → 分支命运分析,一张“细胞分化地铁图”讲清楚分化故事。
  • 五张图覆盖发文所需的拟时序可视化:轨迹图、伪时间梯度、基因动态、分支热图、全基因热图、聚类表格。
  • 代码、数据、环境放在一个文件夹,使用绝对路径激活,登录即用。
  • 工作目录设到自己目录,跑完结果就在你手里。

想给自己的单细胞数据也画一条“分化轨迹”,欢迎联系我们的技术团队开通体验。