I have a dataset with EEG data that I read into Julia from Matlab file. The data is for a single time point from simultaneous 64 channels. Each channel has
y coordinates, and value at those coordinates. My aim is to interpolate those scattered points to a regular grid and plot the resulting grid on a contour plot.
TL;DR: My questions are:
1- Which is better for this application,
ScatteredInterpolation? Or something else? I couldnt make the following work with
2- If I use
Dierckx, I would use the
Spline2D function, but it requires an argument
s, which throws an error, and the workaround being setting it to be in the thousands. I feel uneasy with arbitrarily setting a high value. Is there an optimal way to calculate/set it?
3- If I use
ScatteredInterpolation, I have to specify a basis function, such as
ThinPlate(). I do not know which is the optimal method for my data. I am looking for something similar to what cubic or ‘v4’ interpolation using
griddata in MATLAB. The documentation of
ScatteredInterpolation is pretty sparse.
4- The scatter points marker color doesnt match the underlying contour.
using Plots using MAT using ScatteredInterpolation using Dierckx EEG = matread("MATLAB_data_files/sampleEEGdata.mat")["EEG"]; timeidx = 315 trialidx = 10 data = EEG["data"][:, timeidx, trialidx] #64 data points at time index 315, from trial index 10 labels = EEG["chanlocs"]["labels"][:] Th = EEG["chanlocs"]["theta"][:] Rd = EEG["chanlocs"]["radius"][:] x = Rd .* cos.(deg2rad.(Th)) y = Rd .* sin.(deg2rad.(Th))
data are vectors with 64 elements each.
I used both
Dierckx.jl to see which one results in better plots.
n = 300 # to end up with n x n grid xrange = LinRange(minimum(x), maximum(x), n) yrange = LinRange(minimum(y), maximum(y), n) spl = Spline2D(y, x, data, s=2000); # From Dierckx.jl. s is set to 2000 to avoid errors grid2 = evalgrid(spl, yrange, xrange) #create a mask to end up with circular plot Xi = ones(n) .* xrange' Yi = ones(n)' .* yrange mask = sqrt.((Xi .- median(xrange)) .^ 2 + (Yi .- median(yrange)) .^ 2) .<= 0.45 grid2[mask.==0] .= NaN limits = (-1.05, 1.05).*maximum(abs, data) xlimits = (-1.05, 1.05).*maximum(abs, x) contourf(yrange, xrange, grid2, clims=limits, c=:jet, xlim=xlimits, aspect_ratio=1) scatter!(y, x, series_annotations = text.(labels, :bottom, 11), marker_z=data, ms=3, legend=false, title = "title", showaxis=false, ticks=)
I have two issues with this plot.
1- This doesnt work unless i set the
s parameter of the
Spline2D function to arbitrarily high number. I do not understand what is the optimal way to specify this parameter. If it is too small, i get an error
The required storage space exceeds the available storage space: nxest or nyest too small, or s too small. Try increasing s
2- If you see the scatter points marker color, they do not match the underlying field topology.
Then I tried doing the same thing with
points = [y x]' itp = ScatteredInterpolation.interpolate(ThinPlate(), points, data); interpolatedgrid = [ScatteredInterpolation.evaluate(itp, [j i]') for j in yrange, i in xrange] interpolatedgrid[mask.==0] .= NaN contourf(yrange, xrange, interpolatedgrid, clim=limits, c=:jet, xlim=xlimits, aspect_ratio=1) scatter!(y, x, series_annotations = text.(labels, :bottom, 11), marker_z=data, ms=3, legend=false, title = "title", showaxis=false, ticks=)
With this output
1- Doesn’t look as nice as Method 1. Probably has to do with the large smoothing value I am applying there
2- I do not know which optimal basis function to use. My goal is something like the cubic or ‘v4’ interpolation of
griddata in MATLAB.
3- Again, the scatter points marker color doesnt match the underlying contour