Hi everyone. I’m trying to make an EEG topographical plot, something like this:
The steps, in general are (without the aesthetics and circular appearance):
- Turn polar coordinates to Cartesian coordinates
- Interpolate data onto coordinates
So far I’ve tried to keep it pretty simple, but still can’t manage. I was trying to adapt some MATLAB code but just couldn’t manage to implement the steps. Can you see something that I’m missing?
using MAT, Plots, Random, Measures using FFTW, DSP using ScatteredInterpolation using Statistics using StatsBase plotly() # I/O for the EEG mat file, using MAT package EEG = matread("sampleEEGdata.mat") EEG = EEG["EEG"] function pol2cart(th,r,z=1) x = r.*cos.(th) y = r.*sin.(th) return (x, y, z) end # Introduction to Topographical Plots timepoint2plot = 100 # in ms trial2plot = Int(sample(1:EEG["trials"])) color_limit = 20 # Convert time point from ms to index and get relevant EEG data _, timepointidx = findmin(dropdims(abs.(EEG["times"].-timepoint2plot), dims=1)) timepoint_trial_data = EEG["data"][:,timepointidx, trial2plot][:,1] # First step is to get X and Y coordinates of electrodes # These must be converted to polar coordinates th = (π/180) .*EEG["chanlocs"]["theta"][1,:] radi = EEG["chanlocs"]["radius"][1,:] electrode_locs_X, electrode_locs_Y = pol2cart(th, radi) # Interpolate to get nice surface interpolation_level = 100 # you can try changing this number, but 100 is probably good interpX = range( minimum(electrode_locs_X), maximum(electrode_locs_X), length=interpolation_level ) interpY = range( minimum(electrode_locs_Y), maximum(electrode_locs_Y), length=interpolation_level ) # testing ScatteredInterpolation.jl points = [electrode_locs_X' ; electrode_locs_Y'] samples = timepoint_trial_data n = 100 x = interpX y = interpY X = repeat(x, n)[:] Y = repeat(y', n)[:] gridPoints = [X Y]' itp = interpolate(Multiquadratic(), points, samples) interpolated = evaluate(itp, gridPoints) gridded = reshape(interpolated, n, n) p2 = contour(x, y, gridded)
The matlab code was:
% First step is to get X and Y coordinates of electrodes % These must be converted to polar coordinates th=pi/180*[EEG.chanlocs.theta]; [electrode_locs_X,electrode_locs_Y] = pol2cart(th,[EEG.chanlocs.radius]); % interpolate to get nice surface interpolation_level = 100; % you can try changing this number, but 100 is probably good interpX = linspace(min(electrode_locs_X),max(electrode_locs_X),interpolation_level); interpY = linspace(min(electrode_locs_Y),max(electrode_locs_Y),interpolation_level); % meshgrid is a function that creates 2D grid locations based on 1D inputs [gridX,gridY] = meshgrid(interpX,interpY); % now interpolate the data on a 2D grid interpolated_EEG_data = griddata(electrode_locs_Y,electrode_locs_X,double(squeeze(EEG.data(:,timepointidx,trial2plot))),gridX,gridY); contourf(interpY,interpX,interpolated_EEG_data,100,'linecolor','none');
I get the following: (Julia plot on the left, MATLAB on the right)
Does anyone have any better approaches on getting the final product?