Plot multiple cases from data structure at once?
1 次查看(过去 30 天)
显示 更早的评论
Hi. I have a data structure with multiple files and multiple participants. I'd like to plot all participants at once and run statistical analyses on the data. Structure setup and sample plot are below. I'm not receiving specific errors, I'm just new to using data structures and just cant figure out how to call all participants at once.
%Structure setup
for i = 1:length(parts)
data.EDA = readtable(join([mypath,'/',parts(i),'/EDA.csv'],''));
data.ECG = readtable(join([mypath,'/',parts(i),'/ECG.csv'],''));
if i ~= 2
data.EEG = readtable(join([mypath,'/',parts(i),'/EEG.csv'],''));
end
data.PPG = readtable(join([mypath,'/',parts(i),'/PPG.csv'],''));
data.ACC = readtable(join([mypath,'/',parts(i),'/ACC.csv'],''));
data.BR = readtable(join([mypath,'/', parts(i),'/DataAverage.csv'],''));
disp('Participant Structure.');
name = ['Subject_Structure',num2str(i), '.mat']; %name the structure
save(fullfile(join([mypath,'/',parts(i)],''),name),'data'); %save in the path with the correct data
end
%%
%%
times = table2array(info(1:17,2:7)); %START TIMES ONLY - END TIMES MISSING
subN=6;
load(join([parts(subN), '/Subject_Structure', num2str(subN),'.mat'],''));
%% %% %% ---- EDA ----------------------------------------------- %%
%Pull the data from the structure for EDA
EDA = table2array(data.EDA);
fs=4;
% approx 20 lines of signal procesing code goes here
figure;
tiledlayout(6, 2);
nexttile([3 1]);
plot(time_EDA, EDA);
xlim([0, EDA_tics0(6) + 330]);
xline(EDA_tics0(1), '--', 'color', '#2980B9', 'LineWidth', 1);
xline(EDA_tics0(2), '--', 'color', '#5DADE2', 'LineWidth', 1);
xline(EDA_tics0(3), '--', 'color', '#1ABC9C', 'LineWidth', 1);
xline(EDA_tics0(4), '--', 'color', '#82E0AA', 'LineWidth', 1);
xline(EDA_tics0(5), '--', 'color', '#F8C471', 'LineWidth', 1);
xline(EDA_tics0(6), '--', 'color', '#E74C3C', 'LineWidth', 1);
xline(EDA_tics0(6) + 300, '-k', 'LineWidth', 2);
xlabel('time (s)');
ylabel('EDA (\muS)');
title('EDA with Onsets, Participant 11 (IFIS = "Poor")');
legend('EDA', 'Sit', 'Stand', 'Bike Low', 'Bike High', 'Run Low', 'Run High', 'Expected End', 'Location','northwest','NumColumns',2);
3 个评论
Voss
2023-12-4
%Structure setup
for i = 1:length(parts)
data.EDA = readtable(join([mypath,'/',parts(i),'/EDA.csv'],''));
data.ECG = readtable(join([mypath,'/',parts(i),'/ECG.csv'],''));
if i ~= 2
data.EEG = readtable(join([mypath,'/',parts(i),'/EEG.csv'],''));
end
data.PPG = readtable(join([mypath,'/',parts(i),'/PPG.csv'],''));
data.ACC = readtable(join([mypath,'/',parts(i),'/ACC.csv'],''));
data.BR = readtable(join([mypath,'/', parts(i),'/DataAverage.csv'],''));
disp('Participant Structure.');
name = ['Subject_Structure',num2str(i), '.mat']; %name the structure
save(fullfile(join([mypath,'/',parts(i)],''),name),'data'); %save in the path with the correct data
end
Note that when i is 2, data still has the EEG field left over from when i was 1 (because data is not cleared or re-initialized on each iteration of the loop). So the mat-file corresponding to i==2 will contain the EEG data for participant 1. I suspect this is not what's intended.
回答(1 个)
Voss
2023-12-4
For each participant, load the participant's mat file and plot the EDA data into the next tile of a tiledlayout.
% number of participants:
N = numel(parts);
% create a tiledlayout for plotting:
figure;
tiledlayout(ceil(N/2), 2);
% loop over participants:
for ii = 1:N
% new tile to plot to:
nexttile();
% load and plot EDA data for participant ii:
S = load(fullfile(mypath,parts(ii),sprintf('Subject_Structure%d.mat',ii)));
plot(time_EDA, table2array(S.data.EDA));
% xlim:
xlim([0, EDA_tics0(6) + 330]);
% xlines:
xline(EDA_tics0(1), '--', 'color', '#2980B9', 'LineWidth', 1);
xline(EDA_tics0(2), '--', 'color', '#5DADE2', 'LineWidth', 1);
xline(EDA_tics0(3), '--', 'color', '#1ABC9C', 'LineWidth', 1);
xline(EDA_tics0(4), '--', 'color', '#82E0AA', 'LineWidth', 1);
xline(EDA_tics0(5), '--', 'color', '#F8C471', 'LineWidth', 1);
xline(EDA_tics0(6), '--', 'color', '#E74C3C', 'LineWidth', 1);
xline(EDA_tics0(6) + 300, '-k', 'LineWidth', 2);
% etc.:
xlabel('time (s)');
ylabel('EDA (\muS)');
title(sprintf('EDA with Onsets, Participant %d (IFIS = "Poor")',ii)); % titles change by participant
legend('EDA', 'Sit', 'Stand', 'Bike Low', 'Bike High', 'Run Low', 'Run High', 'Expected End', 'Location','northwest','NumColumns',2);
end
1 个评论
Voss
2023-12-4
By the way, here is a way to store the data from all files for all participants in a struct array S, rather than multiple mat files:
% field names and corresponding file/data types:
fields = {'EDA', 'ECG', 'EEG', 'PPG', 'ACC', 'BR'};
files = {'EDA.csv','ECG.csv','EEG.csv','PPG.csv','ACC.csv','DataAverage.csv'};
% construct full-path file names for all participants and file-types (EDA/ECG/etc.):
F = string(mypath) + filesep() + string(parts(:).') + filesep() + string(files(:));
% M is number of file-types; N is number of participants:
[M,N] = size(F);
% initialize a 1-by-N struct array with fields from 'fields'
% and empty data in each field:
S = [];
for jj = 1:M
S(N).(fields{jj}) = [];
end
% fill in the struct array with data from the files:
for ii = 1:N % loop over participants
for jj = 1:M % loop over file-types
if ii == 2 && jj == 3 % no EEG data for participant #2, apparently
continue
end
% readtable() file F(jj,ii), and store the resulting table in the
% jj-th field of the ii-th element of S:
S(ii).(fields{jj}) = readtable(F(jj,ii));
end
end
Then you can loop over each element of that struct array and plot the EDA data (and/or whatever else):
% create a tiledlayout for plotting:
figure;
tiledlayout(ceil(N/2), 2);
% loop over participants:
for ii = 1:N
% new tile to plot to:
nexttile();
% plot EDA data for participant ii:
plot(time_EDA, table2array(S(ii).EDA));
% xlim:
xlim([0, EDA_tics0(6) + 330]);
% xlines:
xline(EDA_tics0(1), '--', 'color', '#2980B9', 'LineWidth', 1);
xline(EDA_tics0(2), '--', 'color', '#5DADE2', 'LineWidth', 1);
xline(EDA_tics0(3), '--', 'color', '#1ABC9C', 'LineWidth', 1);
xline(EDA_tics0(4), '--', 'color', '#82E0AA', 'LineWidth', 1);
xline(EDA_tics0(5), '--', 'color', '#F8C471', 'LineWidth', 1);
xline(EDA_tics0(6), '--', 'color', '#E74C3C', 'LineWidth', 1);
xline(EDA_tics0(6) + 300, '-k', 'LineWidth', 2);
% etc.:
xlabel('time (s)');
ylabel('EDA (\muS)');
title(sprintf('EDA with Onsets, Participant %d (IFIS = "Poor")',ii)); % titles change by participant
legend('EDA', 'Sit', 'Stand', 'Bike Low', 'Bike High', 'Run Low', 'Run High', 'Expected End', 'Location','northwest','NumColumns',2);
end
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Frequently-used Algorithms 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!