---
title: Getting Started with neuroatlas
author: neuroatlas Dev Team
date: '`r Sys.Date()`'
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Getting Started with neuroatlas}
%\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))
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
echo = TRUE,
eval = FALSE # Set to FALSE to avoid downloads during vignette build
)
library(neuroatlas)
```
## Introduction
The `neuroatlas` package provides a unified interface for working with neuroimaging atlases and parcellations in R. Whether you're conducting ROI-based analyses, visualizing brain data, or integrating different parcellation schemes, `neuroatlas` streamlines these tasks with consistent, user-friendly functions.
Key features include:
- **Multiple Atlas Support**: Access to Schaefer, Glasser, FreeSurfer ASEG, and Olsen MTL atlases
- **Flexible Resampling**: Transform atlases to different spaces and resolutions
- **ROI Analysis**: Extract and analyze specific regions of interest
- **Visualization**: Integration with ggseg for beautiful brain visualizations
- **TemplateFlow Integration**: Access to standardized templates and spaces
## Loading Atlases
### Schaefer Cortical Atlas
The Schaefer atlas provides cortical parcellations organized by functional networks. It's available in multiple resolutions (100-1000 parcels) and network configurations (7 or 17 networks).
```{r schaefer_basic}
# Load Schaefer atlas with 200 parcels and 7 networks
atlas_200_7 <- get_schaefer_atlas(parcels = "200", networks = "7")
print(atlas_200_7)
# Use convenience functions for common configurations
atlas_400_17 <- sy_400_17() # 400 parcels, 17 networks
```
The atlas object contains:
- `atlas`: The parcellation volume (ClusteredNeuroVol)
- `labels`: Region names
- `ids`: Numeric region identifiers
- `network`: Network assignment for each region
- `hemi`: Hemisphere designation ("left" or "right")
- `cmap`: Color map for visualization
### Glasser Multi-Modal Parcellation
The Glasser atlas provides 360 cortical areas defined using multi-modal MRI data:
```{r glasser}
# Load the Glasser atlas
glasser <- get_glasser_atlas()
print(glasser)
# Check the number of regions
length(glasser$labels) # 360 regions
table(glasser$hemi) # 180 per hemisphere
```
### FreeSurfer ASEG Subcortical Atlas
For subcortical structures, use the ASEG (Automatic Segmentation) atlas:
```{r aseg}
# Load ASEG subcortical atlas
aseg <- get_aseg_atlas()
print(aseg)
# View available subcortical structures
head(aseg$labels)
# [1] "Thalamus" "Caudate" "Putamen" "Pallidum" "Hippocampus" "Amygdala"
```
### Olsen Medial Temporal Lobe Atlas
For detailed MTL parcellations:
```{r olsen}
# Load Olsen MTL atlas
mtl <- get_olsen_mtl()
print(mtl)
# Get hippocampus-specific parcellation with anterior-posterior divisions
hipp <- get_hipp_atlas(apsections = 3) # Divide into 3 A-P sections
```
## Resampling Atlases to Different Spaces
Often you need atlases in a specific space or resolution. The `resample` function handles this:
```{r resampling}
# Define a target space (e.g., 2mm isotropic)
target_space <- neuroim2::NeuroSpace(
dim = c(91, 109, 91),
spacing = c(2, 2, 2),
origin = c(-90, -126, -72)
)
# Resample atlas to target space
atlas_2mm <- resample(atlas_200_7$atlas, target_space)
# Or specify the space when loading
atlas_in_space <- get_schaefer_atlas(
parcels = "200",
networks = "7",
outspace = target_space
)
```
You can also use TemplateFlow space identifiers:
```{r templateflow_space}
# Resample to MNI152NLin2009cAsym space at 2mm
atlas_mni <- get_schaefer_atlas(
parcels = "200",
networks = "7",
outspace = "MNI152NLin2009cAsym", # TemplateFlow space ID
resolution = "2"
)
```
## Working with Regions of Interest
### Extracting Specific ROIs
Extract individual regions by label or ID:
```{r extract_roi}
# Extract hippocampus from ASEG atlas
hippocampus <- get_roi(aseg, label = "Hippocampus")
# Extract by numeric ID
thalamus <- get_roi(aseg, id = 1)
# Extract multiple regions
subcortical <- get_roi(aseg, label = c("Hippocampus", "Amygdala", "Thalamus"))
```
### Reducing Data by Atlas Regions
Use `reduce_atlas` to summarize neuroimaging data within atlas regions:
```{r reduce_atlas}
# Create example brain data
brain_data <- neuroim2::NeuroVol(
rnorm(prod(dim(atlas_200_7$atlas))),
space = neuroim2::space(atlas_200_7$atlas)
)
# Calculate mean values within each region
region_means <- reduce_atlas(atlas_200_7, brain_data, mean)
print(head(region_means))
# Calculate other statistics
region_sds <- reduce_atlas(atlas_200_7, brain_data, sd, na.rm = TRUE)
region_max <- reduce_atlas(atlas_200_7, brain_data, max)
# Custom function
region_robust_mean <- reduce_atlas(
atlas_200_7,
brain_data,
function(x) mean(x, trim = 0.1)
)
```
### Mapping Values to Atlas Regions
Map statistical values back onto atlas regions for visualization:
```{r map_atlas}
# Simulate some statistical values for each region
n_regions <- length(atlas_200_7$labels)
t_values <- rnorm(n_regions, mean = 0, sd = 2)
# Map values to atlas (threshold at ±1.96)
atlas_mapped <- map_atlas(
atlas_200_7,
vals = t_values,
thresh = c(1.96, Inf) # Only show |t| > 1.96
)
# For Glasser atlas
glasser_vals <- rnorm(360)
glasser_mapped <- map_atlas(glasser, glasser_vals, thresh = c(2, 5))
```
## Visualization
### Using ggseg for 2D Brain Plots
The package integrates with ggseg for publication-quality visualizations:
```{r ggseg_viz}
# Visualize Schaefer atlas with random values
vals <- rnorm(200)
ggseg_schaefer(
atlas_200_7,
vals = vals,
thresh = c(-2, 2), # Threshold values
palette = "RdBu", # Color palette
interactive = TRUE # Interactive plot with tooltips
)
# Visualize Glasser atlas
plot(glasser, vals = rnorm(360), thresh = c(-1, 1))
```
### Interactive 3D Visualization (Glasser)
For the Glasser atlas, use the echarts-based 3D visualization:
```{r echarts_viz}
# Create random data for visualization
glasser_data <- data.frame(
label = glasser$labels,
value = rnorm(360, sd = 2)
)
# Create interactive 3D plot
plot_glasser(vals = glasser_data, value_col = "value")
# Uniform coloring (no data)
plot_glasser() # All regions colored uniformly
```
## Combining and Dilating Atlases
### Merging Multiple Atlases
Combine atlases for comprehensive coverage:
```{r merge_atlases}
# Combine cortical and subcortical atlases
cortical <- get_schaefer_atlas(parcels = "100", networks = "7")
subcortical <- get_aseg_atlas()
# Ensure same space
subcortical_resampled <- get_aseg_atlas(outspace = neuroim2::space(cortical$atlas))
# Merge atlases
combined <- merge_atlases(cortical, subcortical_resampled)
print(combined)
```
### Dilating Atlas Parcels
Fill gaps between parcels using dilation:
```{r dilate_atlas}
# Dilate parcels to fill gaps
dilated <- dilate_atlas(
atlas = cortical,
mask = "MNI152NLin2009cAsym", # Use standard brain mask
radius = 2, # Dilation radius in voxels
maxn = 20 # Max neighbors to consider
)
# Use custom mask
brain_mask <- get_template(
space = "MNI152NLin2009cAsym",
variant = "mask",
resolution = "1"
)
dilated_custom <- dilate_atlas(cortical, mask = brain_mask, radius = 3)
```
Note: When fetching masks from TemplateFlow, `variant = "mask"` resolves the correct
combination of `desc` and `suffix` (typically `desc = "brain"`, `suffix = "mask"`),
so you do not need to set `desc` explicitly.
## Surface-Based Atlases
Work with surface-based versions of atlases using neurosurf `NeuroSurface`
objects:
```{r surface_atlas}
# Get Schaefer atlas on fsaverage6 surface (mesh + labels)
surf_atlas <- schaefer_surf(
parcels = 400,
networks = 17,
space = "fsaverage6",
surf = "inflated" # "inflated", "white", or "pial"
)
# Access hemisphere meshes with vertex-wise labels
lh_surface <- surf_atlas$lh_atlas
rh_surface <- surf_atlas$rh_atlas
# Surface atlases integrate with the neurosurf package
# for downstream surface-based analyses and visualization
```
You can obtain a similar mesh-plus-label structure for the Glasser MMP1.0
parcellation projected to fsaverage:
```{r glasser_surface_atlas, eval=FALSE}
glasser_surf_atlas <- glasser_surf(
space = "fsaverage",
surf = "pial"
)
lh_glasser <- glasser_surf_atlas$lh_atlas
rh_glasser <- glasser_surf_atlas$rh_atlas
```
## Common Workflows
### ROI-Based Analysis Pipeline
```{r roi_pipeline}
# 1. Load atlas
atlas <- get_schaefer_atlas(parcels = "200", networks = "7")
# 2. Load your brain data
# brain_data <- neuroim2::read_vol("my_statistical_map.nii.gz")
# 3. Extract values by region
roi_values <- reduce_atlas(atlas, brain_data, mean)
# 4. Statistical analysis
# Identify significant regions
sig_regions <- roi_values$value[abs(roi_values$value) > 2]
# 5. Visualize results
viz_vals <- rep(0, length(atlas$labels))
viz_vals[abs(roi_values$value) > 2] <- roi_values$value[abs(roi_values$value) > 2]
ggseg_schaefer(atlas, vals = viz_vals, interactive = TRUE)
```
### Multi-Atlas Comparison
```{r multi_atlas}
# Compare parcellations at different resolutions
atlas_100 <- sy_100_7()
atlas_200 <- sy_200_7()
atlas_400 <- sy_400_7()
# Extract same data with different parcellations
values_100 <- reduce_atlas(atlas_100, brain_data, mean)
values_200 <- reduce_atlas(atlas_200, brain_data, mean)
values_400 <- reduce_atlas(atlas_400, brain_data, mean)
# Compare results across resolutions
# Higher resolution captures more spatial detail
```
### Network-Based Analysis
```{r network_analysis}
# Analyze by functional network
atlas <- get_schaefer_atlas(parcels = "200", networks = "17")
# Extract values
roi_values <- reduce_atlas(atlas, brain_data, mean)
# Add network information
roi_values$network <- atlas$network[match(roi_values$region_id, atlas$ids)]
# Summarize by network
library(dplyr)
network_summary <- roi_values %>%
group_by(network) %>%
summarise(
mean_value = mean(value),
sd_value = sd(value),
n_regions = n()
)
print(network_summary)
```
## Tips and Best Practices
1. **Space Consistency**: Always ensure your atlas and data are in the same space before analysis
2. **Resolution Choice**: Higher parcellation counts provide more spatial detail but may reduce statistical power
3. **Visualization**: Use `interactive = TRUE` for exploratory analysis, `FALSE` for publication figures
4. **Caching**: Atlas files are cached locally after first download to speed up subsequent use
5. **Memory**: Large atlases at high resolution can be memory-intensive; consider downsampling if needed
## Summary
The `neuroatlas` package provides a comprehensive toolkit for neuroimaging atlas work:
- **Unified Interface**: Consistent functions across different atlases
- **Flexible Options**: Multiple parcellation schemes and resolutions
- **Integration**: Works seamlessly with neuroim2, ggseg, and TemplateFlow
- **Visualization**: Both 2D and 3D options for different atlases
- **Analysis Ready**: Built-in functions for ROI extraction and data reduction
For more advanced usage, see the TemplateFlow integration vignette and the package documentation.