【问题标题】:MATLAB scrolling plotMATLAB 滚动图
【发布时间】:2017-11-12 15:48:59
【问题描述】:

我有一个想要绘制的 EEG 数据库。 数据库是一个19*1000*134的矩阵,有:

  • 19 是通道数。在第一种方法中,我只使用一个渠道。
  • 1000 个样本大小(1000 个点,采样率为 500 Hz,即 2 秒的数据)
  • 134个epochs(不同2秒体验的次数)

这个想法是在同一图表上的 epoch n-1 之后绘制 epoch 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 个时期(一种颜色=上面的一个时代)。

谢谢!

【问题讨论】:

  • 我无法真正理解您的要求,您能说得更具体点吗?我的意思是……目前的结果有什么问题?它们应该都是相同的颜色吗?实际上,如果我明白你的意思,在同一个情节上使用 134 种不同的颜色会很困难。
  • 好吧,我不清楚。不,我想在我的屏幕上看到 BIG 中的第一个纪元(2 秒的数据),然后滚动到第二个纪元,然后滚动到第三个纪元。我想在单个数字上查看每 2 秒 2 秒的数据,因为我不想打开 134 个不同的数字。
  • 也许这可能会有所帮助:mathworks.com/matlabcentral/fileexchange/…
  • 是的,我早一点发现了这个,看起来很有希望,但我仍然无法让它工作......

标签: matlab plot scroll matlab-figure


【解决方案1】:

这与我已经拥有的东西非常相似,所以我为你做了一些调整。基本上将 plotData 传递给您的data 矩阵。它将按照您现在已经拥有的顺序绘制每个项目。

按下滑块将更改您的 x 限制,以便您一次通过 1 个元素(时期)。单击该区域将一次推进 2 个时期。它目前仅显示您当前查看的“纪元”# 在命令行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 或更高版本。

【讨论】:

  • 非常感谢!听起来很棒,完全符合我的需要!我会尽快看看。
  • 完美运行!谢谢!
  • 我的问题的第二部分(我以前没想过......),如果你有更多的时间来帮助我:) stackoverflow.com/questions/47272588/…
  • @Mathieu 回答了其他问题......主要是。我可以稍后完成,但我现在必须预约。
  • 非常感谢,我去看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多