A better interactive neuroimage plotter in R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In a previous post, I described how you can interactively explore a 3D nifti
object in R. I used the manipulate
package, but the overall results were sluggish and not really usable.
I was introduced to a a good neuroimaging viewer called Mango, by a friend or two and use it somewhat inconsistently. One major advantage of this software is that it has been converted to a pure JavaScript library called Papaya. As such, you can create simple HTML files that have an embedded interactive image viewer.
Papayar
That's all fine and good, but I like my things in R
. I understand many can easily write bash scripts that perform the same operations and use the HTML builder provided by papaya.
I want the operation in R for the same reasons I make many things for R:
- I use R
- Many statisticians like imaging but need tools they understand and they understand R
- I like writing pipelines and scripts in one language
My answer: the papayar
package.
Install papayar
To install papayar
, you can simply install from GitHub using the devtools
package.
require(devtools) devtools::install_github("muschellij2/papayar")
Papayar functions
The main function is papaya
. Let's look at the arguments:
library(papayar) formalArgs(papaya) [1] "images" "outdir" "..."
The images
argument can be a list of nifti
objects or a vector of character filenames. The outdir
is where the HTML file is written. The default is to a temporary directory that will be trashed after the session is over. The additional arguments are passed to the lower-level function pass_papaya
, which in turn are passed to functions httd
and daemon_stop
in the servr
package. The pass_papaya
function is useful, however, to open a blank papaya session by just invoking pass_papaya()
Papayar Example
As the httd
function starts a server, the images can be rendered (and will be by default) in the RStudio viewer! In the terminal, it opens your default web browser. Here's a basic example:
library(oro.nifti) x = nifti(img = array(rnorm(100^3), dim= rep(100, 3)), dim=rep(100, 3), datatype=16) y = nifti(img = array(rbinom(100^3, prob = 0.5, size = 10), dim= rep(100, 3)), dim=rep(100, 3), datatype=16) index.file = papaya(list(x, y))
The first 3 lines make some random arrays, from a normal and binomial distribution and puts them into a nifti
object. The list of these nifti
objects is passed in. The first image is displayed in grayscale and the second image is overlaid using red-hot colors and the opacity of this image can be changed. The object index.file
will be a character filename where the HTML file is stored. The data and this HTML file is written to outdir
(which, again, is a temporary directory by default).
Output
Below is a series of screen shots I took from the code above. You should be able to see this in RStudio or your browser:
The main reason to use this is that you can click different areas for the crosshairs and move to a different point in axial, coronal, and sagittal space. Thus, this is truly interactive.
Here we can show there are limited (but useful) controls for the overlay. You can change the mapping of the values in the image and the overlay and the opacity of the overlay.
Brain Example
The above data has been used since everyone could test it, but it's just random numbers and doesn't look very compelling. Here I will show you the hyperintense voxels overlaid on the MNI 152 1mm T1 brain image click here for description, which correspond mainly to the white matter:
Hopefully you can see how this can be useful for exploring data and results.
ITK-SNAP and itksnapr
Some of my colleagues are more partial to using ITK-SNAP for viewing images interactively. I have bundled the executables for ITK-SNAP into the R package itksnapr
. The main function is itksnap
, which you can specify images to different options to ITK-SNAP.
Install itksnapr
To install itksnapr
, you can simply install from GitHub using the devtools
package.
require(devtools) devtools::install_github("muschellij2/itsnapr") library(itksnapr) itksnap(grayscale = x, overlay = y)
I haven't used ITK-SNAP much, but hear many good things about it. There are many better resources than this blog on how to use it and how to use it well. If interested in a good image viewer, I implore you to google around for some of these resources. If anyone has intense interest of image viewers and wants added functionality, don't hesitate to file an inssue on GitHub.
FSLView
Although it was included in my fslr
package by default and I never discussed it in detail, FSLView is included with the distribution of FSL and is a viewer I use heavily. The fslr
function is fslview
. One specific advantage of using FSLView is that it can pass through X11 forwarding, so you can remotely view image from a cluster, though it may be slow.
Conclusion
Although I use the orthographic
,image.nifti
and overlay
functions from oro.nifti
for many of my figures, for interactive exploring of results, these can be somewhat slow for getting a large-scale view, and not a specific slice view. Therefore, a fully interactive neuroimaging plotter is necessary. Here are 3 options that can be accessed “within” R
.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.