#| label: setup #| include: false knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5 )
#| label: load-packages library(ggseg) library(ggplot2)
A brain atlas typically has several views -- lateral and medial for cortical
atlases, or axial, coronal, and sagittal slices for subcortical and tract
atlases. position_brain() controls how those views are arranged in the
final plot.
The function works differently depending on the atlas type, so this vignette covers cortical and subcortical/tract atlases separately.
Cortical atlases like dk have two layout dimensions: hemi (left or
right) and view (lateral, medial, etc.). The formula syntax mirrors
facet_grid() -- left side is rows, right side is columns:
#| label: fig-hemi-by-view #| fig-cap: "Cortical atlas with hemispheres as rows and views as columns." ggplot() + geom_brain( atlas = dk(), position = position_brain(hemi ~ view), show.legend = FALSE ) + theme_void()
Flip the formula to transpose the layout:
#| label: fig-view-by-hemi #| fig-cap: "Transposed layout with views as rows and hemispheres as columns." ggplot() + geom_brain( atlas = dk(), position = position_brain(view ~ hemi), show.legend = FALSE ) + theme_void()
Use . with + to collapse everything into a single row or column. This
is handy for compact figures:
#| label: fig-single-row #| fig-cap: "All brain views stacked in a single row." ggplot() + geom_brain( atlas = dk(), position = position_brain(. ~ hemi + view), show.legend = FALSE ) + theme_void()
#| label: fig-single-column #| fig-cap: "All brain views stacked in a single column." ggplot() + geom_brain( atlas = dk(), position = position_brain(hemi + view ~ .), show.legend = FALSE ) + theme_void()
Subcortical atlases like aseg and tract atlases like tracula don't have
the hemisphere/view pairing that cortical atlases do. Their views are
individual slices (e.g. "axial_3", "sagittal"). That opens up a
different set of positioning tools.
The simplest options. "horizontal" is the default:
#| label: fig-aseg-horizontal #| fig-cap: "Subcortical atlas views arranged horizontally." ggplot() + geom_brain( atlas = aseg(), position = position_brain("horizontal"), show.legend = FALSE ) + theme_void()
#| label: fig-aseg-vertical #| fig-cap: "Subcortical atlas views arranged vertically." ggplot() + geom_brain( atlas = aseg(), position = position_brain("vertical"), show.legend = FALSE ) + theme_void()
When you have many views, a grid keeps things readable. Specify nrow,
ncol, or both:
#| label: fig-aseg-nrow #| fig-cap: "Subcortical atlas views in a two-row grid." ggplot() + geom_brain( atlas = aseg(), position = position_brain(nrow = 2), show.legend = FALSE ) + theme_void()
#| label: fig-aseg-ncol #| fig-cap: "Subcortical atlas views in a three-column grid." ggplot() + geom_brain( atlas = aseg(), position = position_brain(ncol = 3), show.legend = FALSE ) + theme_void()
The views parameter lets you select which views to include and in what
order. Check what's available with ggseg.formats::atlas_views():
#| label: aseg-views ggseg.formats::atlas_views(aseg())
#| label: fig-aseg-select-views #| fig-cap: "A subset of subcortical views selected by name." ggplot() + geom_brain( atlas = aseg(), position = position_brain( views = c("sagittal", "axial_3", "coronal_3") ), show.legend = FALSE ) + theme_void()
Combine views with nrow or ncol for a custom grid:
#| label: fig-aseg-custom-grid #| fig-cap: "Custom two-row grid with selected subcortical views." ggplot() + geom_brain( atlas = aseg(), position = position_brain( views = c("sagittal", "axial_3", "axial_5", "coronal_3"), nrow = 2 ), show.legend = FALSE ) + theme_void()
The type ~ . formula groups views by their orientation -- all axial slices
together, all coronal slices together, and so on. The type is extracted from
the view name (everything before the first underscore):
#| label: aseg-type-group #| eval: false ggplot() + geom_brain( atlas = aseg(), position = position_brain(type ~ .), show.legend = FALSE ) + theme_void()
If you're using the geom_sf() workflow instead of geom_brain(), use
reposition_brain() to rearrange the data before plotting. It takes the
same arguments:
#| label: fig-reposition-brain #| fig-cap: "Repositioned subcortical data plotted with geom_sf()." atlas_data <- as.data.frame(aseg()) repositioned <- reposition_brain( atlas_data, views = c("sagittal", "axial_3", "coronal_3"), nrow = 1 ) ggplot(repositioned) + geom_sf(aes(fill = region), show.legend = FALSE) + theme_void()
Use annotate_brain() to label each view with its name. For cortical
atlases the label combines hemisphere and view (e.g. "left lateral"); for
subcortical and tract atlases it uses the view name directly.
Store the position_brain() specification in an object so both layers share
the same layout:
#| label: fig-dk-view-labels #| fig-cap: "Cortical atlas with view labels." pos <- position_brain(hemi ~ view) ggplot() + geom_brain(atlas = dk(), position = pos, show.legend = FALSE) + annotate_brain(atlas = dk(), position = pos) + theme_void()
It works with any positioning — horizontal, vertical, grid, and formula layouts:
#| label: fig-aseg-view-labels #| fig-cap: "Subcortical atlas with view labels in a two-row grid." pos <- position_brain(nrow = 2) ggplot() + geom_brain(atlas = aseg(), position = pos, show.legend = FALSE) + annotate_brain(atlas = aseg(), position = pos) + theme_void()
Text appearance is customisable through standard annotate() arguments:
#| label: fig-styled-labels #| fig-cap: "View labels with custom styling." ggplot() + geom_brain(atlas = dk(), show.legend = FALSE) + annotate_brain( atlas = dk(), size = 2.5, colour = "grey50", fontface = "italic" ) + theme_void()
| Atlas type | Options |
|---|---|
| Cortical | hemi ~ view, view ~ hemi, . ~ hemi + view, hemi + view ~ . |
| Subcortical / Tract | "horizontal", "vertical", nrow, ncol, views, type ~ . |
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.