Skip to content

从一团细胞到一张轨迹网:Monocle3 让分化路径自己“长”出来——云服务器预装,登录即跑 ​

看别人的单细胞文章,拟时序轨迹图不再是一条简单的折线,而是一张能分叉、能汇合的“路网”,细胞在哪个路口转向、哪群细胞共享同一段分化路径,一目了然;轮到自己用 Monocle2,轨迹一旦分叉就画不清楚,大数据集还跑不动。

这篇换用 Monocle3,UMAP 降维 + 图学习轨迹,代码、数据、环境放在一个文件夹,全部预置在服务器公共路径,使用绝对路径激活,登录直接跑。

一、Monocle3 的“四件套”可视化 ​

Monocle3 是 Monocle2 的全面升级,核心变化就一句话:

轨迹不再是人工指定的直线,而是让数据自己“长”出一张路网。

围绕这张图,四张核心可视化基本覆盖发文所需的拟时序展示:

图函数看什么
细胞类型 UMAPplot_cells细胞在 UMAP 空间中的分布,按类型着色
伪时间梯度图plot_cellsUMAP 上从蓝到红的连续伪时间梯度
基因动态趋势图plot_genes_in_pseudotime轨迹相关基因沿伪时间的表达变化
基因表达 UMAPplot_cells(genes = ...)关键基因在 UMAP 上的表达强度分布

共同特点:UMAP 做底图,轨迹是“长”出来的而不是画出来的,分叉、汇合、循环都能自然呈现。

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

把单细胞数据想象成一座城市的出租车 GPS 轨迹。Monocle3 的工作分四步:

  1. 铺地图(UMAP 降维):把城市里所有出租车的实时位置压成一张二维地图,相似的出租车(细胞)聚在一块。
  2. 画路网(learn_graph):看出租车们是怎么移动的——哪些车经常走同一条路、在哪个路口分流、在哪片区域打转,自动“长”出一张路网。
  3. 定起点(order_cells):指定一个“市中心”(根节点),计算每辆车距市中心的距离,这就是伪时间。
  4. 找规律(graph_test):哪些基因的表达量随着车在路网上的移动而规律变化?这些基因就是分化过程的“路标”。

你不需要指定“这条线怎么画”,只需要告诉它“市中心在哪”,剩下的路网自己长出来。这就是 Monocle3 比 Monocle2 最省心的地方。

三、环境:登录即用 ​

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

text
/media/share/share_code/monocle3/

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

情况一:版本匹配 ​

直接在 Console 使用绝对路径激活并加载:

r
renv::activate(project = "/media/share/share_code/monocle3/")
library(monocle3)
library(Seurat)

情况二:版本不匹配 ​

建议在 RStudio Terminal 中使用系统 R 4.4.1 启动,或在 Console 中先切换至匹配版本的 RStudio 后再执行上述代码。

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

四、实战:从 Seurat 到四张轨迹图 ​

示例数据是一份 Seurat 对象,包含多种细胞类型。我们先筛选出目标细胞类型(以 Fibroblasts 为例),再构建 Monocle3 对象、学习轨迹、出图。完整流程一条代码到底。

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

先设工作目录,使用绝对路径激活公共环境,读取示例数据并构建 Monocle3 对象:

r
# 工作目录设到自己目录
dir.create("~/monocle3_demo", showWarnings = FALSE)
setwd("~/monocle3_demo")

# 使用绝对路径激活公共 renv 环境
renv::activate(project = "/media/share/share_code/monocle3/")
library(monocle3)
library(Seurat)
library(dplyr)
library(ggplot2)

# 读取示例数据(Seurat 对象)
scRNA <- readRDS(
  "/media/share/share_code/monocle3/data/scRNA_core_four_types.rds"
)

# 筛选目标细胞类型(以 Fibroblasts 为例)
target_celltype <- "Fibroblasts"
scRNA_sub <- subset(scRNA, celltype == target_celltype)

# 构建 Monocle3 CellDataSet
expr_matrix <- GetAssayData(scRNA_sub, assay = "RNA", layer = "counts")
cds <- new_cell_data_set(
  expr_matrix,
  cell_metadata = scRNA_sub@meta.data,
  gene_metadata = data.frame(
    gene_short_name = rownames(expr_matrix),
    row.names = rownames(expr_matrix)
  )
)

4.2 预处理与轨迹学习 ​

预处理、降维、聚类、学习轨迹,一步接一步:

r
# 预处理(PCA)
cds <- preprocess_cds(cds, num_dim = 100)

# UMAP 降维
cds <- reduce_dimension(cds, reduction_method = "UMAP")

# 聚类
cds <- cluster_cells(cds)

# 学习轨迹图(自动“长”出路网)
cds <- learn_graph(cds, verbose = FALSE)

# 指定根节点(先查看节点标签)
plot_cells(cds, color_cells_by = "celltype", label_principal_points = TRUE)

# 根据上图选择根节点,指定伪时间起点
cds <- order_cells(cds, root_pr_nodes = "Y_8")

图 1|细胞类型 UMAP ​

r
plot_cells(cds, color_cells_by = "celltype", cell_size = 1.5)

Fibroblasts 细胞在 UMAP 空间中铺展开,不同亚群自然聚类。轨迹图就“长”在这张底图上。

图 2|伪时间梯度图 ​

r
plot_cells(cds, color_cells_by = "pseudotime", cell_size = 1.5)

同一 UMAP 底图,这次按伪时间着色——从蓝到红的连续梯度,就是从根节点出发的“分化时间轴”。路网往哪延伸,细胞就往哪分化。

图 3|轨迹相关基因动态趋势 ​

r
# 用 graph_test 找与轨迹显著相关的基因(Moran's I)
trace_genes <- graph_test(cds, neighbor_graph = "principal_graph", cores = 4)
track_genes_sig <- trace_genes %>%
  top_n(6, morans_I) %>%
  pull(gene_short_name)

# 绘制 Top 6 基因的伪时间动态
lineage_cds <- cds[rowData(cds)$gene_short_name %in% track_genes_sig, ]
plot_genes_in_pseudotime(
  lineage_cds,
  color_cells_by = "celltype",
  min_expr = 0.5
)

自动筛选出的轨迹相关基因,沿伪时间轴的表达曲线。哪些基因在分化早期启动、哪些在晚期富集,Moran's I 值越高,基因与轨迹的关联越强。

图 4|关键基因表达 UMAP ​

r
plot_cells(
  cds,
  genes = track_genes_sig,
  cell_size = 1,
  show_trajectory_graph = FALSE,
  label_cell_groups = FALSE
)

把轨迹相关基因的表达强度直接铺在 UMAP 上,基因在哪片区域高表达、哪条路径上活跃,空间分布一目了然。

五、结果文件一览 ​

运行完成后,四张图和基因列表输出到你的个人工作目录:

  • celltype_umap.pdf——细胞类型 UMAP(带轨迹图)
  • pseudotime_umap.pdf——伪时间梯度 UMAP
  • gene_pseudotime_trends.pdf——轨迹相关基因动态趋势图
  • gene_expression_umap.pdf——关键基因表达 UMAP
  • trajectory_genes.txt——Top 轨迹相关基因列表(Moran's I)

六、小结 ​

  • Monocle3 = UMAP 降维 + 图学习轨迹 + 伪时间排序,路网自己“长”出来,分叉、汇合、循环都能自然呈现。
  • 四张图覆盖发文所需的拟时序可视化:细胞类型 UMAP、伪时间梯度、基因动态趋势、基因表达空间分布。
  • 代码、数据、环境放在一个文件夹,使用绝对路径激活,登录即用。
  • 工作目录设到自己目录,跑完结果就在你手里。

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