This is where the launch starts:
First we will add some packages. Am I using akima to perform linear interpolation, although it seems like EEGLAB is using some kind of spherical interpolation here? (data was a bit rare to try).
library(ggplot2) library(akima) library(reshape2)
Further, reading in the data:
dat <- read.table(text = " label xy signal 1 R3 0.64924459 0.91228430 2.0261520 2 R4 0.78789621 0.78234410 1.7880972 3 R5 0.93169511 0.72980685 0.9170998 4 R6 0.48406513 0.82383895 3.1933129")
We will interpolate the data and stick to it in the data frame.
datmat <- interp(dat$x, dat$y, dat$signal, xo = seq(0, 1, length = 1000), yo = seq(0, 1, length = 1000)) datmat2 <- melt(datmat$z) names(datmat2) <- c('x', 'y', 'value') datmat2[,1:2] <- datmat2[,1:2]/1000
I am going to borrow some of the previous answers. circleFun below Draw a circle with ggplot2 .
circleFun <- function(center = c(0,0),diameter = 1, npoints = 100){ r = diameter / 2 tt <- seq(0,2*pi,length.out = npoints) xx <- center[1] + r * cos(tt) yy <- center[2] + r * sin(tt) return(data.frame(x = xx, y = yy)) } circledat <- circleFun(c(.5, .5), 1, npoints = 100)
And I really liked the look of the contour of the contour in R plot fill.contour () in ggpplot2 , so we'll take it.
ggplot(datmat2, aes(x, y, z = value)) + geom_tile(aes(fill = value)) + stat_contour(aes(fill = ..level..), geom = 'polygon', binwidth = 0.01) + geom_contour(colour = 'white', alpha = 0.5) + scale_fill_distiller(palette = "Spectral", na.value = NA) + geom_path(data = circledat, aes(x, y, z = NULL)) + # draw the nose (haven't drawn ears yet) geom_line(data = data.frame(x = c(0.45, 0.5, .55), y = c(1, 1.05, 1)), aes(x, y, z = NULL)) + # add points for the electrodes geom_point(data = dat, aes(x, y, z = NULL, fill = NULL), shape = 21, colour = 'black', fill = 'white', size = 2) + theme_bw()

With the improvements mentioned in the comments (setting extrap = TRUE and linear = FALSE in the interp call to fill in the gaps and smooth the splines, respectively, and remove the NA before building), we get:

mgcv can execute spherical splines. This replaces akima (a piece containing interp () is not required).
library(mgcv) spl1 <- gam(signal ~ s(x, y, bs = 'sos'), data = dat)
