how to heat map encode a smoothed line of sparse time-series data
9 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
hxen
el 24 de Sept. de 2024
Comentada: William Rose
el 25 de Sept. de 2024
Hello.
I have data capturing the motion of a hand while clicking a mouse. The y-values are sparse points of computed instantaneous frequency of the clicks and the x-values are the time locations of the clicks. I wish to do two things:
(1) plot a smooth line between the sparse data points
(2) color encode as a heat map the related speed on the line
It is not at all clear to me how to do (2) and what would be the best smoothing to do given the sparcity while still capturing as best the theoretical changes if they were continuous.
Attached is some data to load along with related code to better understand what I am aiming to visualize.
Any help as also is greatly appreciate. Cheers!
%%
load 'testData.mat'
time = Data.time;
freq = Data.freq;
speeds = Data.speeds;
figure;
plot(time, freq)
ylabel('freq (Hz)');
xlabel('seconds');
0 comentarios
Respuesta aceptada
William Rose
el 25 de Sept. de 2024
Editada: William Rose
el 25 de Sept. de 2024
[Edit: Add label to colorbar.]
The script below plots the raw data and smoothly interpolated data, colored by speed. You can read the help for interp1 and try a different interpolation method. Method 'spline' is very smooth, but it can have significant undershoot and overshoot. Method 'makima' is less smooth than 'spline', and has less undershoot and overshoot. Method 'pchip' has no undershoot or overshoot, but it can be less smooth looking than 'makima'. I use method 'makima' below.
load 'testData.mat'
time = Data.time;
freq = Data.freq;
speeds = Data.speeds;
% Compute interpolated, evenly sampled signal.
N=1000; % number of data points in interpolated, evenly sampled signal
t2=linspace(time(1),time(end),N);
freq2=interp1(time,freq,t2,'makima');
spd2=interp1(time,speeds,t2,'makima');
% Plot results
figure;
plot(time,freq,'k*','MarkerSize',10); % plot original data
hold on
scatter(t2,freq2,20,spd2,'filled') % add interpolated data
ylabel('freq (Hz)'); xlabel('seconds');
cb=colorbar(); % add colorbar
ylabel(cb,'Speed') % add colorbar label
The plot colors the interpolated points by speed.
4 comentarios
William Rose
el 25 de Sept. de 2024
If you expect to see an inverse relationship between speed and frequency, then plot the two:
load 'testData.mat'
time = Data.time;
freq = Data.freq;
speeds = Data.speeds;
Compute values for the best-fit straight line:
coefficients = polyfit(freq, speeds, 1);
xFit = [min(freq), max(freq)];
yFit = polyval(coefficients , xFit);
Plot results
figure;
plot(freq,speeds,'b*',xFit,yFit,'-b'); % plot data and fitted line
xlabel('Freq (Hz)'); ylabel('Speed')
legend('Data','Best Fit Line'); grid on
This is not the most convincing inverse relationship.
Más respuestas (1)
Epsilon
el 25 de Sept. de 2024
Editada: Epsilon
el 25 de Sept. de 2024
Hi hxen,
For plotting a smooth line between the sparse points, 1-D interpolation can be used with the spline method.
Eample code:
% Interpolate for smoothing
smooth_time = linspace(min(time), max(time), 1000);
smooth_freq = interp1(time, freq, smooth_time, 'spline');
To color encode the related speed on the line use a colormap, different options can be used as per the choice.
Example code:
% Normalize speeds for color mapping
norm_speeds = (speeds - min(speeds)) / (max(speeds) - min(speeds));
figure;
hold on;
cmap = autumn(1000); % Choose different colormap options!
% Plot with color encoding
for i = 1:length(smooth_time)-1
[~, idx] = min(abs(time - smooth_time(i)));
color = cmap(round(norm_speeds(idx) * 999) + 1, :);
plot(smooth_time(i:i+1), smooth_freq(i:i+1), 'Color', color, 'LineWidth', 2);
end
% Add colorbar
colormap(autumn); % Choose different colormap options!
colorbar;
caxis([min(speeds) max(speeds)]);
Please refer to the documentation on 1-D interpolation and colormap for further help:
- interp1: https://www.mathworks.com/help/matlab/ref/double.interp1.html
- colormap: https://www.mathworks.com/help/matlab/ref/colormap.html
Glad to help!
Ver también
Categorías
Más información sobre Data Distribution Plots en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!