--- title: Atlas Visualization with Optimal Colours output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Atlas Visualization with Optimal Colours} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} params: family: red css: albers.css resource_files: - albers.css - albers.js includes: in_header: |- --- ```{r setup, include = FALSE} if (requireNamespace("ggplot2", quietly = TRUE) && requireNamespace("albersdown", quietly = TRUE)) ggplot2::theme_set(albersdown::theme_albers(params$family)) can_eval <- requireNamespace("neuroatlas", quietly = TRUE) && requireNamespace("neuroim2", quietly = TRUE) && requireNamespace("ggplot2", quietly = TRUE) can_surface_plot <- can_eval && requireNamespace("neurosurf", quietly = TRUE) && requireNamespace("patchwork", quietly = TRUE) && requireNamespace("scico", quietly = TRUE) knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 8, fig.height = 4, eval = can_eval ) ``` ## Introduction Every atlas in neuroatlas can be visualised with a single call to `plot()`. Behind the scenes, `plot.atlas()` renders coloured parcels as volumetric slices using **neuroim2**'s `plot_montage()` and `plot_ortho()`, with colours assigned automatically by the **roi_colors** system. ```{r load} library(neuroatlas) ``` ## Quick Start ```{r quick-montage} atlas <- get_aseg_atlas() plot(atlas) ``` The default view is a multi-slice **montage** (axial slices) with colours chosen by the `rule_hcl` algorithm --- a fast, deterministic palette that uses network hues and hemisphere luminance differences. For a three-plane **orthogonal** view: ```{r quick-ortho} plot(atlas, view = "ortho") ``` ## Colour Algorithms neuroatlas ships four colour algorithms, each suited to different use cases. Pass the `method` argument to `plot()` to switch between them. ### rule_hcl (default) Deterministic and fast. Assigns hues per network with anterior-posterior gradients and hemisphere luminance offsets. ```{r rule-hcl} plot(atlas, method = "rule_hcl", nslices = 8) ``` ### maximin_view Optimises perceptual separation between spatially neighbouring ROIs across slice views. Best for publication figures where adjacent parcels must be easily distinguished. ```{r maximin} plot(atlas, method = "maximin_view", nslices = 8) ``` ### network_harmony Network-aware: ROIs in the same network share analogous hue families while still maximising local separation. Requires the atlas to have a `$network` field (e.g. Schaefer atlases). ```{r network-harmony, eval = FALSE} # Requires a Schaefer atlas with network metadata (network download) schaefer <- get_schaefer_atlas(parcels = "200", networks = "7") plot(schaefer, method = "network_harmony", nslices = 8) ``` ### embedding Projects ROI features to 2D (PCA or UMAP) and maps polar angle to hue, yielding globally structured gradients. ```{r embedding} plot(atlas, method = "embedding", nslices = 8) ``` ## Custom Colours You can supply your own colours as a named character vector (names are region IDs) or as a tibble from `atlas_roi_colors()`. ### Named vector ```{r custom-named} my_cols <- setNames(rainbow(length(atlas$ids)), atlas$ids) plot(atlas, colors = my_cols, nslices = 6) ``` ### Pre-computed tibble ```{r custom-tibble} color_tbl <- atlas_roi_colors(atlas, method = "maximin_view") head(color_tbl) plot(atlas, colors = color_tbl, nslices = 6) ``` ## Programmatic Colour Access The `atlas_roi_colors()` function is the bridge between atlas objects and the `roi_colors_*()` family. It extracts ROI centroids, builds a metadata tibble, and dispatches to the requested algorithm. ```{r programmatic} cols <- atlas_roi_colors(atlas, method = "rule_hcl") cols ``` This tibble can be joined with other atlas metadata for downstream analyses. ## Controlling Slice Count Use `nslices` to control how many slices appear in the montage: ```{r nslices} plot(atlas, nslices = 4) ``` ## Surface Figures with Layout Control For cortical surface atlases, `plot_brain()` gives you direct control over the static figure layout. You can move the colorbar, add figure titles, and replace the default facet labels without assembling the figure by hand afterward. ```{r surface-layout, eval = can_surface_plot, fig.width = 8, fig.height = 4.5} surf_atl <- schaefer_surf( parcels = 100, networks = 7, space = "fsaverage6", surf = "inflated" ) surf_vals <- seq(-1.5, 1.5, length.out = length(surf_atl$ids)) plot_brain( surf_atl, vals = surf_vals, views = "lateral", interactive = FALSE, style = "ggseg_like", colorbar = "bottom", colorbar_title = "Effect size", title = "Schaefer surface map", subtitle = "Static layout controls are built into plot_brain()", panel_labels = c( "Left Lateral" = "Left hemisphere", "Right Lateral" = "Right hemisphere" ) ) ``` Because this example shows only lateral views, simplifying the facet labels to "Left hemisphere" and "Right hemisphere" is safe here. For a dedicated guide to multi-panel layout, shared legends, and the default hemisphere-orientation convention, see `vignette("surface-panels", package = "neuroatlas")`. ## Existing Visualisation Tools For flatmap-style cortical visualisations (not volumetric), neuroatlas also provides: - `ggseg_schaefer()` --- ggseg-based Schaefer flatmaps - `plot_glasser()` --- Glasser atlas flatmaps These are complementary to `plot()` and remain available as standalone functions.