MATLAB 滚动图
MATLAB scrolling plot
我有一个 EEG 数据库,我想绘制它。
数据库是一个19*1000*134的矩阵,有:
- 19为通道数。在第一种方法中,我只使用一个频道。
- 1000 个样本大小(1000 个点,采样率为 500 Hz,即 2 秒的数据)
- 134个epochs的数量(不同2秒经验的数量)
我们的想法是在同一张图上紧接第 n-1 个时期之后绘制第 n 个时期。用于绘制此图的 (X,Y) 矩阵大小为 134 000 * not_much,我希望能够在图中水平滚动,以单独查看每个时期。
我现在的代码,只绘制一个通道:
fs = s_EEG.sampling_rate;
[channel, length, nb_epoch] = size(s_EEG.data)
display(s_EEG.data, fs, length, channel, nb_epoch)
function display(data, fs, length, channel, nb_epoch)
figure("Name", "Epoch display")
for j = 1:nb_epoch
time = 0.002+(2*j-2):1/fs:2*j;
epoch = data(1,:,j);
plot(time, epoch)
hold on
end
hold off
end
当前输出:
我是 Matlab 的新手,我还没有很好地使用它,但我想找到一种方法来在同一张图上以正确的可视化比例单独查看我的所有内容134 个纪元(一种颜色 = 上面的一个纪元)。
谢谢!
这与我已有的非常相似,因此我为您稍微调整了一下。基本上将 plotData 传递给您的 data
矩阵。它将按照您现在的顺序绘制您的每个项目。
按下滑块将更改您的 x 限制,这样您将一次通过 1 个元素(历元)。单击该区域将一次前进 2 个纪元。它目前只显示您当前查看的内容 "epoch" # 在命令行中 disp(['Current Epoch: ' num2str(viewI)])
但是,您应该很容易将其重定向到图中的文本框,以便更容易地知道您正在查看的内容...除了在心理上将 x 限制除以 2。
使用列表框切换到新频道,这将重置绘图和 x 限制。
在命令行中这样调用。
>> plotData( data )
代码:将下面的所有内容保存为 plotData.m
function plotData( data )
% data = rand(19,1000,134);
f = figure('Units','Normalized','Position',[0.25 0.25 0.5 0.5]);
a = axes('Units','Normalized','Position',[0.05 0.15, 0.75 0.75]);
s = uicontrol(f, 'Style','Slider', 'Units','Normalized','Position',[0.05 0.025, 0.75 0.05],...
'Min',1,'Max',size(data,3),'Value',1, 'Callback',{@sliderChange,a} );
l = uicontrol(f, 'Style','listbox','Units','Normalized','Position',[0.85 0.15, 0.1, 0.75],...
'String',cellstr(num2str([1:size(data,1)]')),'Callback',{@changeChannel,a,s,data} );
stepSize = 1/(s.Max - s.Min);
s.SliderStep = [stepSize 2*stepSize];
changeChannel(l,[],a,s,data)
function changeChannel(l,evtData,a,s,data)
cla(a);
chanNum = str2double(l.String{l.Value});
sR = 500; %500Hz
tempData = reshape(data(chanNum,:,:),[],size(data,3)); %Reshape each epoch into a column
tempTime = [0:1/sR:(size(data,2)-1)/sR]' + (0:1:size(data,3)-1)*2; %Build time array
plot(a,tempTime,tempData) %plot all the lines
s.Value = 1; %Rest Slider Position
function sliderChange(s,evtData,a)
viewI = round(s.Value);
disp(['Current Epoch: ' num2str(viewI)])
xlim(a,[(viewI-1)*2 viewI*2] + [-.1 .1])
注意:这使用隐式扩展,因此您需要 Matlab 2016b 或更高版本。
我有一个 EEG 数据库,我想绘制它。 数据库是一个19*1000*134的矩阵,有:
- 19为通道数。在第一种方法中,我只使用一个频道。
- 1000 个样本大小(1000 个点,采样率为 500 Hz,即 2 秒的数据)
- 134个epochs的数量(不同2秒经验的数量)
我们的想法是在同一张图上紧接第 n-1 个时期之后绘制第 n 个时期。用于绘制此图的 (X,Y) 矩阵大小为 134 000 * not_much,我希望能够在图中水平滚动,以单独查看每个时期。
我现在的代码,只绘制一个通道:
fs = s_EEG.sampling_rate;
[channel, length, nb_epoch] = size(s_EEG.data)
display(s_EEG.data, fs, length, channel, nb_epoch)
function display(data, fs, length, channel, nb_epoch)
figure("Name", "Epoch display")
for j = 1:nb_epoch
time = 0.002+(2*j-2):1/fs:2*j;
epoch = data(1,:,j);
plot(time, epoch)
hold on
end
hold off
end
当前输出:
我是 Matlab 的新手,我还没有很好地使用它,但我想找到一种方法来在同一张图上以正确的可视化比例单独查看我的所有内容134 个纪元(一种颜色 = 上面的一个纪元)。
谢谢!
这与我已有的非常相似,因此我为您稍微调整了一下。基本上将 plotData 传递给您的 data
矩阵。它将按照您现在的顺序绘制您的每个项目。
按下滑块将更改您的 x 限制,这样您将一次通过 1 个元素(历元)。单击该区域将一次前进 2 个纪元。它目前只显示您当前查看的内容 "epoch" # 在命令行中 disp(['Current Epoch: ' num2str(viewI)])
但是,您应该很容易将其重定向到图中的文本框,以便更容易地知道您正在查看的内容...除了在心理上将 x 限制除以 2。
使用列表框切换到新频道,这将重置绘图和 x 限制。
在命令行中这样调用。
>> plotData( data )
代码:将下面的所有内容保存为 plotData.m
function plotData( data )
% data = rand(19,1000,134);
f = figure('Units','Normalized','Position',[0.25 0.25 0.5 0.5]);
a = axes('Units','Normalized','Position',[0.05 0.15, 0.75 0.75]);
s = uicontrol(f, 'Style','Slider', 'Units','Normalized','Position',[0.05 0.025, 0.75 0.05],...
'Min',1,'Max',size(data,3),'Value',1, 'Callback',{@sliderChange,a} );
l = uicontrol(f, 'Style','listbox','Units','Normalized','Position',[0.85 0.15, 0.1, 0.75],...
'String',cellstr(num2str([1:size(data,1)]')),'Callback',{@changeChannel,a,s,data} );
stepSize = 1/(s.Max - s.Min);
s.SliderStep = [stepSize 2*stepSize];
changeChannel(l,[],a,s,data)
function changeChannel(l,evtData,a,s,data)
cla(a);
chanNum = str2double(l.String{l.Value});
sR = 500; %500Hz
tempData = reshape(data(chanNum,:,:),[],size(data,3)); %Reshape each epoch into a column
tempTime = [0:1/sR:(size(data,2)-1)/sR]' + (0:1:size(data,3)-1)*2; %Build time array
plot(a,tempTime,tempData) %plot all the lines
s.Value = 1; %Rest Slider Position
function sliderChange(s,evtData,a)
viewI = round(s.Value);
disp(['Current Epoch: ' num2str(viewI)])
xlim(a,[(viewI-1)*2 viewI*2] + [-.1 .1])
注意:这使用隐式扩展,因此您需要 Matlab 2016b 或更高版本。