Child pages
  • Using MRIcrotome to make pretty figures
Skip to end of metadata
Go to start of metadata

I don't know how to use MRIcrotome very well, but on the other hand there doesn't seem to be a Wiki page for this, so I'm starting one. I've copied the basics from Making pretty figures using MRIcrotome (githack.com), where Jason Lerch wrote some good instructions:

Jason Lerch

2018-06-30


Load the required data from a file; for the moment, this contains two 3D volumes; anatVol and stats containing the anatomy to use in the background and the output of some statistical computations. (Note for RMINC users: in these examples anatVol and stats would be the output of mincArray)

load("sliceData.RData")

The best way to use MRIcrotome is through pipes; let’s load the full tidyverse for now (though only pipes are actively used). Also, the graphics subsystem is grid graphics, so let’s go ahead and load that as well.

library(tidyverse)
## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag():    dplyr, stats
## slice():  dplyr, .GlobalEnv, MRIcrotome
library(grid)
library(MRIcrotome)

That’s it for the set-up. On to actual package usage.

Simple figures

Starting off with the simplest figure; a coronal slice through the brain.

sliceSeries(nrow = 1, slices=200) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  draw()

That’s the basic anatomy of displaying MRI anatomy. It always begins with a call to sliceSeries, following by a call to anatomy, and finally the command to draw the results.

Let’s prettify it, and overlay the stats.

sliceSeries(nrow = 1, slices=200) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  overlay(stats, low=2, high=6, symmetric = T) %>%
  draw()

So far, so good. A legend would be nice, though.

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  overlay(stats, low=2, high=6, symmetric = T) %>%
  legend("t-statistics") %>%
  draw()

The command is called sliceSeries for a reason …

sliceSeries(nrow = 5, ncol=5, begin=100, end=350) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  overlay(stats, low=2, high=6, symmetric = T) %>%
  legend("t-statistics") %>%
  draw()

You can also have more than one slice series:

sliceSeries(nrow = 8, begin=100, end=350) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  sliceSeries() %>% # if no arguments are specified, reuse previous sliceSeries args
  anatomy() %>% # if no arguments are specified, reuse previous anatomy call
  overlay(stats, low=2, high=6, symmetric = T) %>%
  legend("t-statistics") %>%
  draw()

And with some titles:

sliceSeries(nrow = 8, begin=100, end=350) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  addtitle("Anatomy") %>%
  sliceSeries() %>%
  anatomy() %>%
  overlay(stats, low=2, high=6, symmetric = T) %>%
  addtitle("Stats") %>%
  legend("t-statistics") %>%
  draw()

And change the layout orientation

sliceSeries(ncol = 8, begin=100, end=350) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  addtitle("Anatomy") %>%
  sliceSeries() %>%
  anatomy() %>%
  overlay(stats, low=2, high=6, symmetric = T) %>%
  addtitle("Stats") %>%
  legend("t-statistics") %>%
  draw(layout = "row")

Multiple legends

sliceSeries(ncol = 8, begin=100, end=350) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  addtitle("Anatomy") %>%
  legend() %>%
  sliceSeries() %>%
  anatomy() %>%
  overlay(stats, low=2, high=6, symmetric = T) %>%
  addtitle("Stats") %>%
  legend("t-statistics") %>%
  draw(layout = "row")

Let’s do multiple legends on the same slice series, going with a column layout

TODO: cannot use no-args version of anatomy() if asking for a legend

sliceSeries(nrow = 8, begin=100, end=350) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  addtitle("Anatomy") %>%
  sliceSeries() %>%
  anatomy(anatVol, low=700, high=1400) %>%
  legend() %>%
  overlay(stats, low=2, high=6, symmetric = T) %>%
  addtitle("Stats") %>%
  legend("t-statistics") %>%
  draw()

It can also do contours

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  contours(anatVol, levels=c(1000, 1400), col="blue") %>%
  draw()

Of course contours can be mixed with sliceSeries as you please

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  sliceSeries() %>%
  anatomy() %>%
  contours(anatVol, levels=c(1000, 1400), col="blue") %>%
  sliceSeries() %>%
  contours(anatVol, levels=c(1000, 1400), col="blue") %>%
  draw()

Contours can be given different colours, linetypes, and widths

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  contours(anatVol, levels=c(1000, 1400), col=c("blue", "red"), lwd=1:2, lty=c(1,3)) %>%
  draw()

The most likely use is combined with stats - let’s highlight the most significant:

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  overlay(stats, low=2, high=6, symmetric = T) %>%
  legend("t-statistics") %>%
  contours(abs(stats), levels=c(3,5), lwd=2, lty=c(3,1), col="green") %>%
  draw()

Contours can of course have legends, too.

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  overlay(stats, low=2, high=6, symmetric = T) %>%
  legend("t-statistics") %>%
  contours(abs(stats), levels=c(3,5), lwd=2, lty=c(3,1), col="green") %>%
  legend("Most sig.") %>%
  draw()

And contours can take on any colour scale

sliceSeries(nrow = 1, begin=200, end=300) %>% 
  anatomy(anatVol, low=700, high=1400) %>% 
  contours(abs(stats), levels=2:6, col=topo.colors(255), lty=3) %>%
  legend("t statistics") %>%
  draw()

And of course works in slice series with multiple slices too

sliceSeries(nrow=5, ncol=6, begin=70, end=400) %>%
  contours(anatVol, levels=c(1000, 1200, 1500), col=gray.colors(255)) %>%
  draw()

Opacity can be controlled with the alpha parameter to anatomy and overlay:

sliceSeries(nrow=5, begin=150, end=250) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.1) %>%
  addtitle("alpha=0.1") %>%
  sliceSeries() %>% anatomy() %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.5) %>%
  addtitle("alpha=0.5") %>%  
  sliceSeries() %>% anatomy() %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.9) %>%
  addtitle("alpha=0.9") %>%  
  draw()

And you can add indicators of your slice selection

sliceSeries(nrow=5, begin=150, end=250) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.1) %>%
  addtitle("alpha=0.1") %>%
  sliceSeries() %>% anatomy() %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.5) %>%
  addtitle("alpha=0.5") %>%  
  sliceSeries() %>% anatomy() %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.9) %>%
  addtitle("alpha=0.9") %>%  
  legend("t-statistics") %>%
  contourSliceIndicator(anatVol, c(700, 1400)) %>%
  draw()

If you’d rather display a slice underneath the slice indicators, you can do that too

sliceSeries(nrow=5, begin=150, end=250) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.1) %>%
  addtitle("alpha=0.1") %>%
  sliceSeries() %>% anatomy() %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.5) %>%
  addtitle("alpha=0.5") %>%  
  sliceSeries() %>% anatomy() %>%
  overlay(stats, 2, 6, symmetric = T, alpha=0.9) %>%
  addtitle("alpha=0.9") %>%  
  legend("t-statistics") %>%
  anatomySliceIndicator(anatVol, 700, 1400) %>%
  draw()

Let’s see some possible permutations of slice dimensions and sliceIndicator dimensions

sliceSeries(nrow=5, begin=150, end=250) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  legend("t-statistics") %>%
  contourSliceIndicator(anatVol,c(700, 1400)) %>%
  draw()

sliceSeries(nrow=5, begin=150, end=250, dimension = 1) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  legend("t-statistics") %>%
  contourSliceIndicator(anatVol, c(700, 1400)) %>%
  draw()

sliceSeries(nrow=5, begin=50, end=150, dimension = 3) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  legend("t-statistics") %>%
  contourSliceIndicator(anatVol, c(700, 1400)) %>%
  draw()

sliceSeries(nrow=5, begin=50, end=150, dimension = 3) %>%
  anatomy(anatVol, low=700, high=1400) %>%
  legend("t-statistics") %>%
  contourSliceIndicator(anatVol, c(700, 1400), dimension = 2) %>%
  draw()


Here are some addition things I've learned by trial-and-error and/or harassing people:

The brain slices are by default shown in posterior-anterior order, which I find infuriating. In order to have them appear in anterior-posterior order, as they should always be, put the larger slice number first, like so: sliceSeries(begin=150, end=50).

  • No labels