#' Add glass brain to ggseg3d plot
#'
#' Adds a translucent brain on top of a ggseg3d plot
#' to create a point of reference, particularly
#' important for sub-cortical plots.
#'
#' @param p plotly object
#' @param hemisphere string. hemisphere to plot ("left" or "right")
#' @param colour string. colour to give the glass brain
#' @param opacity numeric. transparency of the glass brain (0-1 float)
#'
#' @return plotly object with glass brain tri-surface mesh
#' @export
#'
#' @examples
#' library(dplyr)
#' ggseg3d(atlas="aseg_3d") %>%
#'    add_glassbrain("left")
add_glassbrain <- function(p,
                           hemisphere = c("left", "right"),
                           colour = "#cecece",
                           opacity=.3){
  cortex <- dplyr::filter(cortex_3d,
                          hemi %in% hemisphere)
  cortex <- tidyr::unnest(cortex, ggseg_3d)
  colour <- if(grepl("^#", colour)){
    colour
  }else{
    col2hex(colour)
  }
  # add one trace per file inputed
  for(tt in 1:nrow(cortex)){
    col = rep(colour, length(cortex$mesh[[tt]]$it[1,]))
    p = plotly::add_trace(
      p,
      x = cortex$mesh[[tt]]$vb["xpts",],
      y = cortex$mesh[[tt]]$vb["ypts",],
      z = cortex$mesh[[tt]]$vb["zpts",],
      i = cortex$mesh[[tt]]$it[1,]-1,
      j = cortex$mesh[[tt]]$it[2,]-1,
      k = cortex$mesh[[tt]]$it[3,]-1,
      facecolor = col,
      type = "mesh3d",
      showscale = FALSE,
      name = "cerebral cortex",
      opacity = opacity
    )
  }
  p
}
#' Pan camera position of ggseg3d plot
#'
#' The default position for plotly
#' mesh plots are not satisfying for
#' brain plots. This convenience function
#' can pan the camera to lateral or medial
#' view, or to custom made views if you are
#' plotly savvy.
#'
#' @param p plotly object
#' @param camera string or list.
#' @param aspectratio camera aspect ratio
#'
#' @return plotly object
#' @export
#'
#' @examples
#' library(dplyr)
#' ggseg3d() %>%
#'    pan_camera("right lateral")
pan_camera <- function(p, camera, aspectratio = 1){
  stopifnot(is.character(camera)|is.list(camera))
  views = if(class(camera) != "list"){
    camera <- match.arg(camera, c("left lateral", "left medial",
                                  "right lateral", "right medial"))
    switch(camera,
           "left lateral" = list(eye = list(x = -2.5, y = 0, z = 0)),
           "left medial" = list(eye = list(x = 2, y = 0, z = 0)),
           "right lateral" = list(eye = list(x = 2, y = 0, z = 0)),
           "right medial" = list(eye = list(x = -2.5, y = 0, z = 0))
    )
  }else{
    camera
  }
  # create final plotly plot
  plotly::layout(p,
                 scene = list(camera = views,
                              aspectratio = aspectratio)
  )
}
#' Remove axis information from ggseg3d plot
#'
#' When publishing data visualisation in 3d mesh plots
#' in general the axes are not important, at least
#' they are not for ggseg3d, where the axis values
#' are arbitrary.
#'
#' @param p plotly object
#'
#' @return plotly object without axes
#' @export
#'
#' @examples
#' library(magrittr)
#' ggseg3d() %>%
#'    remove_axes()
remove_axes <- function(p){
  ax <- list(
    title = "",
    zeroline = FALSE,
    showline = FALSE,
    showticklabels = FALSE,
    showgrid = FALSE,
    showbackground = FALSE
  )
  plotly::layout(p,
                 scene = list(
                   xaxis=ax,
                   yaxis=ax,
                   zaxis=ax,
                   plot_bgcolor='transparent',
                   paper_bgcolor='transparent'))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.