{"id":32204301,"url":"https://github.com/dynverse/dynplot","last_synced_at":"2025-10-22T04:53:35.971Z","repository":{"id":30248418,"uuid":"101055344","full_name":"dynverse/dynplot","owner":"dynverse","description":"Visualising single-cell trajectories, including comparisons between two models 📈","archived":false,"fork":false,"pushed_at":"2021-12-09T08:15:45.000Z","size":37884,"stargazers_count":31,"open_issues_count":10,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-22T04:53:02.591Z","etag":null,"topics":["trajectory-inference","visualisation"],"latest_commit_sha":null,"homepage":"","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dynverse.png","metadata":{"files":{"readme":"README.Rmd","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-22T11:24:51.000Z","updated_at":"2025-05-08T14:05:03.000Z","dependencies_parsed_at":"2022-09-25T02:41:19.698Z","dependency_job_id":null,"html_url":"https://github.com/dynverse/dynplot","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/dynverse/dynplot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynverse%2Fdynplot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynverse%2Fdynplot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynverse%2Fdynplot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynverse%2Fdynplot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dynverse","download_url":"https://codeload.github.com/dynverse/dynplot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynverse%2Fdynplot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280382997,"owners_count":26321423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-22T02:00:06.515Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["trajectory-inference","visualisation"],"created_at":"2025-10-22T04:53:34.832Z","updated_at":"2025-10-22T04:53:35.958Z","avatar_url":"https://github.com/dynverse.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"---\ntitle: \"dynplot: Plotting Single-Cell Trajectories\"\noutput:\n  github_document:\n    html_preview: false\neditor_options: \n  chunk_output_type: console\n---\n\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n```{r setup1, include=FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#\u003e\",\n  out.width = \"100%\",\n  fig.path = \"man/figures/\",\n  message = FALSE,\n  dpi = 300\n)\nset.seed(1)\n```\n\n\u003ca href=\"https://github.com/dynverse/dynplot/actions?query=workflow%3AR-CMD-check\"\u003e\u003cimg src=\"https://github.com/dynverse/dynplot/workflows/R-CMD-check/badge.svg\" align=\"left\"\u003e\u003c/a\u003e \n\u003ca href=\"https://codecov.io/gh/dynverse/dynplot\"\u003e\u003cimg src=\"https://codecov.io/gh/dynverse/dynplot/branch/master/graph/badge.svg\" align=\"left\" /\u003e\u003c/a\u003e  \n[**ℹ️ Tutorials**](https://dynverse.org)  \u0026nbsp;  \u0026nbsp; \n[**ℹ️ Reference documentation**](https://dynverse.org/reference/dynplot) \u003cbr\u003e\u003cimg src=\"man/figures/logo.png\" align=\"right\" /\u003e\n\n\nVisualise a single-cell trajectory as a graph or dendrogram, \nas a dimensionality reduction or heatmap of the expression data, \nor a comparison between two trajectories as a pairwise scatterplot\nor dimensionality reduction projection.\n\n\nHere's a summary of the different plotting functions for visualising single-cell trajectories.\n\n```{r setup, warning=FALSE}\nlibrary(tidyverse)\nlibrary(dyno)\n\n# get trajectory\ndata(example_bifurcating)\n\ntrajectory \u003c- example_bifurcating %\u003e% add_root()\n\n# gather some prior information\ngrouping \u003c- trajectory$prior_information$groups_id\n\ngroups \u003c- tibble(\n  group_id = trajectory$milestone_ids,\n  color = dynplot:::milestone_palette_list$auto(length(group_id))\n)\nfeatures_oi \u003c- apply(as.matrix(trajectory$counts), 2, sd) %\u003e% sort() %\u003e% names() %\u003e% tail(10)\nfeature_oi \u003c- features_oi[[10]]\n```\n\n## `plot_dendro()`: Plot a trajectory as a dendrogram\n\n```{r dendro, fig.width=8, fig.height=6}\npatchwork::wrap_plots(\n  plot_dendro(trajectory) + labs(title = \"Topology\"),\n  plot_dendro(trajectory, \"milestone\") + labs(title = \"Ordering\"),\n  plot_dendro(trajectory, grouping=grouping, groups=groups) + labs(title = \"Grouping/clustering\"),\n  plot_dendro(trajectory, feature_oi=feature_oi) + labs(title = \"Expression of\\na single gene\"),\n  plot_dendro(trajectory, \"pseudotime\") + labs(title = \"Pseudotime\"),\n  byrow = TRUE,\n  ncol = 3\n) \u0026 theme(legend.position = \"none\")\n```\n\n## `plot_onedim()`: Plot a trajectory as a one-dimensional set of connected segments\n\n```{r onedim, fig.width=8, fig.height=8}\npatchwork::wrap_plots(\n  plot_onedim(trajectory) + labs(title = \"Topology\"),\n  plot_onedim(trajectory, \"milestone\") + labs(title = \"Ordering\"),\n  plot_onedim(trajectory, grouping=grouping, groups=groups) + labs(title = \"Grouping/clustering\"),\n  plot_onedim(trajectory, feature_oi=feature_oi) + labs(title = \"Expression of\\na single gene\"),\n  plot_onedim(trajectory, \"pseudotime\") + labs(title = \"Pseudotime\"),\n  byrow = TRUE,\n  ncol = 2\n) \u0026 theme(legend.position = \"none\")\n```\n\n## `plot_graph()`: Plot a trajectory and cellular positions as a graph\n\n```{r graph, fig.width=8, fig.height=5}\npatchwork::wrap_plots(\n  plot_graph(trajectory) + labs(title = \"Topology\"),\n  plot_graph(trajectory, \"milestone\") + labs(title = \"Ordering\"),\n  plot_graph(trajectory, grouping=grouping, groups=groups) + labs(title = \"Grouping/clustering\"),\n  plot_graph(trajectory, feature_oi=feature_oi) + labs(title = \"Expression of\\na single gene\"),\n  plot_graph(trajectory, \"pseudotime\") + labs(title = \"Pseudotime\"),\n  byrow = TRUE,\n  ncol = 3\n) \u0026 theme(legend.position = \"none\")\n```\n\n\n## `plot_dimred()`: Plot a trajectory in a (given) dimensionality reduction\n\n```{r dimred, fig.width=8, fig.height=5}\npatchwork::wrap_plots(\n  plot_dimred(trajectory) + labs(title = \"Topology\"),\n  plot_dimred(trajectory, \"milestone\") + labs(title = \"Ordering\"),\n  plot_dimred(trajectory, grouping=grouping, groups=groups) + labs(title = \"Grouping/clustering\"),\n  plot_dimred(trajectory, feature_oi=feature_oi) + labs(title = \"Expression of\\na single gene\"),\n  plot_dimred(trajectory, \"pseudotime\") + labs(title = \"Pseudotime\"),\n  byrow = TRUE,\n  ncol = 3\n) \u0026 theme(legend.position = \"none\")\n```\n\n## `plot_heatmap()`: Plot expression data along a trajectory\n\nIn addition, you can also plot the expression of genes along the trajectory as a heatmap.\n\n```{r heatmap, fig.width=10, fig.height=6}\nplot_heatmap(trajectory, grouping = trajectory$prior_information$grouping_assignment)\n```\n\n## `plot_linearised_comparison()`: Compare two trajectories as a pseudotime scatterplot\n\nYou can compare multiple trajectories (for the same cells) by creating a\nscatterplot between the two trajectories.\n\n```{r scatterplot, fig.width=8, fig.height=4}\nprediction \u003c- infer_trajectory(trajectory, ti_comp1())\n\ntrajectory$id \u003c- \"Bifurcating\"\nprediction$id \u003c- \"Linear\"\nplot_linearised_comparison(trajectory, prediction)\n```\n\n\u003c!--\n\nTODO: create dedicated function for this\n## Alternative: Compare two trajectories by projecting dimensionality reductions\n\nYou can also use the colouring of the cells in order to compare two trajectories.\n\n{r dimredcompare}\ntraj1 \u003c- trajectory %\u003e% dynwrap::add_dimred(dimred = dyndimred::dimred_landmark_mds)\ntraj2 \u003c- prediction %\u003e% dynwrap::add_dimred(dimred = dyndimred::dimred_landmark_mds, expression_source = trajectory)\n\nplot_dimred(traj1, milestone_percentages = traj2$milestone_percentages, milestones = traj2$milestone_ids)\nplot_dimred(\n  traj2,\n  expression_source = traj1,\n  color_cells = \"milestone\",\n  milestones = traj1$milestone_ids,\n  milestone_percentages = traj1$milestone_percentages\n)\n\n\n\n--\u003e\n\n## Latest changes\n\nCheck out `news(package = \"dynwrap\")` or [NEWS.md](NEWS.md) for a full list of changes.\n\n\u003c!-- This section gets automatically generated from inst/NEWS.md --\u003e\n\n```{r news, echo=FALSE, results=\"asis\"}\ncat(dynutils::recent_news())\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdynverse%2Fdynplot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdynverse%2Fdynplot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdynverse%2Fdynplot/lists"}