Skip to contents

Plot dynamic features across pseudotime

Usage

DynamicPlot(
  srt,
  lineages,
  features,
  group.by = NULL,
  cells = NULL,
  layer = "counts",
  assay = NULL,
  family = NULL,
  exp_method = c("log1p", "raw", "zscore", "fc", "log2fc"),
  lib_normalize = identical(layer, "counts"),
  libsize = NULL,
  compare_lineages = TRUE,
  compare_features = FALSE,
  add_line = TRUE,
  add_interval = TRUE,
  line.size = 1,
  line_palette = "Dark2",
  line_palcolor = NULL,
  add_point = TRUE,
  pt.size = 1,
  point_palette = "Chinese",
  point_palcolor = NULL,
  add_rug = TRUE,
  flip = FALSE,
  reverse = FALSE,
  x_order = c("value", "rank"),
  aspect.ratio = NULL,
  legend.position = "right",
  legend.direction = "vertical",
  theme_use = "theme_scop",
  theme_args = list(),
  combine = TRUE,
  nrow = NULL,
  ncol = NULL,
  byrow = TRUE,
  cores = 1,
  verbose = TRUE,
  seed = 11
)

Arguments

srt

A Seurat object.

lineages

A character vector specifying the lineages to plot.

features

A character vector of features to use.

group.by

Name of one or more meta.data columns to group (color) cells by.

cells

A character vector of cell names to use. Default is NULL.

layer

Which layer to use. Default is "counts".

assay

Which assay to use. If NULL, the default assay of the Seurat object will be used. When the object also contains ChromatinAssay, the default assay and additional ChromatinAssay will be preprocessed sequentially.

family

A character specifying the model used to calculate the dynamic features if needed. By default, this parameter is set to NULL, and the appropriate family will be automatically determined.

exp_method

A character specifying the method to transform the expression values. Default is "log1p" with options "log1p", "raw", "zscore", "fc", "log2fc".

lib_normalize

A boolean specifying whether to normalize the expression values using library size. Default the layer is counts, this parameter is set to TRUE. Otherwise, it is set to FALSE.

libsize

A numeric vector specifying the library size for each cell. Default is NULL.

compare_lineages

A boolean specifying whether to compare the lineages in the plot. Default is TRUE.

compare_features

A boolean specifying whether to compare the features in the plot. Default is FALSE.

add_line

A boolean specifying whether to add lines to the plot. Default is TRUE.

add_interval

A boolean specifying whether to add confidence intervals to the plot. Default is TRUE.

line.size

A numeric specifying the size of the lines. Default is 1.

line_palette

A character string specifying the name of the palette to use for the line colors. Default is "Dark2".

line_palcolor

A vector specifying the colors to use for the line palette. Default is NULL.

add_point

A boolean specifying whether to add points to the plot. Default is TRUE.

pt.size

A numeric specifying the size of the points. Default is 1.

point_palette

A character string specifying the name of the palette to use for the point colors. Default is "Chinese".

point_palcolor

A vector specifying the colors to use for the point palette. Default is NULL.

add_rug

A boolean specifying whether to add rugs to the plot. Default is TRUE.

flip

A boolean specifying whether to flip the x-axis. Default is FALSE.

reverse

A boolean specifying whether to reverse the x-axis. Default is FALSE.

x_order

A character specifying the order of the x-axis values. Default is c("value", "rank").

aspect.ratio

Aspect ratio of the panel. Default is NULL.

legend.position

The position of legends, one of "none", "left", "right", "bottom", "top". Default is "right".

legend.direction

The direction of the legend in the plot. Can be one of "vertical" or "horizontal".

theme_use

Theme used. Can be a character string or a theme function. Default is "theme_scop".

theme_args

Other arguments passed to the theme_use. Default is list().

combine

Combine plots into a single patchwork object. If FALSE, return a list of ggplot objects.

nrow

Number of rows in the combined plot. Default is NULL, which means determined automatically based on the number of plots.

ncol

Number of columns in the combined plot. Default is NULL, which means determined automatically based on the number of plots.

byrow

Whether to arrange the plots by row in the combined plot. Default is TRUE.

cores

The number of cores to use for parallelization with foreach::foreach. Default is 1.

verbose

Whether to print the message. Default is TRUE.

seed

Random seed for reproducibility. Default is 11.

Examples

data(pancreas_sub)
pancreas_sub <- standard_scop(pancreas_sub)
#>  [2026-04-26 01:17:39] Start standard processing workflow...
#>  [2026-04-26 01:17:39] Checking a list of <Seurat>...
#> ! [2026-04-26 01:17:40] Data 1/1 of the `srt_list` is "unknown"
#>  [2026-04-26 01:17:40] Perform `NormalizeData()` with `normalization.method = 'LogNormalize'` on 1/1 of `srt_list`...
#>  [2026-04-26 01:17:42] Perform `Seurat::FindVariableFeatures()` on 1/1 of `srt_list`...
#>  [2026-04-26 01:17:42] Use the separate HVF from `srt_list`
#>  [2026-04-26 01:17:42] Number of available HVF: 2000
#>  [2026-04-26 01:17:43] Finished check
#>  [2026-04-26 01:17:43] Perform `Seurat::ScaleData()`
#>  [2026-04-26 01:17:43] Perform pca linear dimension reduction
#>  [2026-04-26 01:17:44] Use stored estimated dimensions 1:20 for Standardpca
#>  [2026-04-26 01:17:44] Perform `Seurat::FindClusters()` with `cluster_algorithm = 'louvain'` and `cluster_resolution = 0.6`
#>  [2026-04-26 01:17:44] Reorder clusters...
#>  [2026-04-26 01:17:44] Skip `log1p()` because `layer = data` is not "counts"
#>  [2026-04-26 01:17:44] Perform umap nonlinear dimension reduction
#>  [2026-04-26 01:17:44] Perform umap nonlinear dimension reduction using Standardpca (1:20)
#>  [2026-04-26 01:17:49] Perform umap nonlinear dimension reduction using Standardpca (1:20)
#>  [2026-04-26 01:17:53] Standard processing workflow completed
pancreas_sub <- RunSlingshot(
  pancreas_sub,
  group.by = "SubCellType",
  reduction = "UMAP"
)
#> Warning: Removed 9 rows containing missing values or values outside the scale range
#> (`geom_path()`).
#> Warning: Removed 9 rows containing missing values or values outside the scale range
#> (`geom_path()`).


CellDimPlot(
  pancreas_sub,
  group.by = "SubCellType",
  reduction = "UMAP",
  lineages = paste0("Lineage", 1:2),
  lineages_span = 0.1
)


DynamicPlot(
  pancreas_sub,
  lineages = "Lineage1",
  features = c("Arxes1", "Ncoa2", "G2M_score"),
  group.by = "SubCellType",
  compare_features = TRUE
)
#>  [2026-04-26 01:17:56] Start find dynamic features
#>  [2026-04-26 01:17:57] Data type is raw counts
#>  [2026-04-26 01:17:57] Number of candidate features (union): 3
#>  [2026-04-26 01:17:58] Data type is raw counts
#> ! [2026-04-26 01:17:58] Negative values detected
#>  [2026-04-26 01:17:58] Calculating dynamic features for "Lineage1"...
#>  [2026-04-26 01:17:58] Using 1 core
#>  [2026-04-26 01:17:58] Running for Arxes1 [1/3] ■■■         33% | ETA:  0s
#>  [2026-04-26 01:17:58] Completed 3 tasks in 127ms
#> 
#>  [2026-04-26 01:17:58] Building results
#>  [2026-04-26 01:17:58] Find dynamic features done


DynamicPlot(
  pancreas_sub,
  lineages = c("Lineage1", "Lineage2"),
  features = c("Arxes1", "Ncoa2", "G2M_score"),
  group.by = "SubCellType",
  compare_lineages = TRUE,
  compare_features = FALSE
)
#>  [2026-04-26 01:17:59] Start find dynamic features
#>  [2026-04-26 01:18:00] Data type is raw counts
#>  [2026-04-26 01:18:01] Number of candidate features (union): 3
#>  [2026-04-26 01:18:01] Data type is raw counts
#> ! [2026-04-26 01:18:01] Negative values detected
#>  [2026-04-26 01:18:01] Calculating dynamic features for "Lineage1"...
#>  [2026-04-26 01:18:01] Using 1 core
#>  [2026-04-26 01:18:01] Running for Arxes1 [1/3] ■■■         33% | ETA:  0s
#>  [2026-04-26 01:18:01] Completed 3 tasks in 130ms
#> 
#>  [2026-04-26 01:18:01] Building results
#>  [2026-04-26 01:18:01] Find dynamic features done
#>  [2026-04-26 01:18:01] Start find dynamic features
#>  [2026-04-26 01:18:03] Data type is raw counts
#>  [2026-04-26 01:18:03] Number of candidate features (union): 3
#>  [2026-04-26 01:18:04] Data type is raw counts
#> ! [2026-04-26 01:18:04] Negative values detected
#>  [2026-04-26 01:18:04] Calculating dynamic features for "Lineage2"...
#>  [2026-04-26 01:18:04] Using 1 core
#>  [2026-04-26 01:18:04] Running for Arxes1 [1/3] ■■■         33% | ETA:  0s
#>  [2026-04-26 01:18:04] Completed 3 tasks in 114ms
#> 
#>  [2026-04-26 01:18:04] Building results
#>  [2026-04-26 01:18:04] Find dynamic features done
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.


DynamicPlot(
  pancreas_sub,
  lineages = c("Lineage1", "Lineage2"),
  features = c("Arxes1", "Ncoa2", "G2M_score"),
  group.by = "SubCellType",
  compare_lineages = FALSE,
  compare_features = FALSE
)
#>  [2026-04-26 01:18:05] Start find dynamic features
#>  [2026-04-26 01:18:06] Data type is raw counts
#>  [2026-04-26 01:18:07] Number of candidate features (union): 3
#>  [2026-04-26 01:18:07] Data type is raw counts
#> ! [2026-04-26 01:18:07] Negative values detected
#>  [2026-04-26 01:18:07] Calculating dynamic features for "Lineage1"...
#>  [2026-04-26 01:18:07] Using 1 core
#>  [2026-04-26 01:18:07] Running for Arxes1 [1/3] ■■■         33% | ETA:  0s
#>  [2026-04-26 01:18:07] Completed 3 tasks in 130ms
#> 
#>  [2026-04-26 01:18:07] Building results
#>  [2026-04-26 01:18:08] Find dynamic features done
#>  [2026-04-26 01:18:08] Start find dynamic features
#>  [2026-04-26 01:18:09] Data type is raw counts
#>  [2026-04-26 01:18:09] Number of candidate features (union): 3
#>  [2026-04-26 01:18:10] Data type is raw counts
#> ! [2026-04-26 01:18:10] Negative values detected
#>  [2026-04-26 01:18:10] Calculating dynamic features for "Lineage2"...
#>  [2026-04-26 01:18:10] Using 1 core
#>  [2026-04-26 01:18:10] Running for Arxes1 [1/3] ■■■         33% | ETA:  0s
#>  [2026-04-26 01:18:10] Completed 3 tasks in 154ms
#> 
#>  [2026-04-26 01:18:10] Building results
#>  [2026-04-26 01:18:10] Find dynamic features done
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.