代码之家  ›  专栏  ›  技术社区  ›  Mathieu

MATLAB滚动图

  •  2
  • Mathieu  · 技术社区  · 7 年前

    我有一个脑电图数据库,我想绘制。 数据库是一个19*1000*134的矩阵,具有:

    • 19为通道数。在第一种方法中,我只使用一个通道。
    • 134时代的数量(不同2秒体验的数量)

    其思想是在同一个图上,在第n-1个历元之后绘制第n个历元。用于绘制此图的(X,Y)矩阵大小为134000*不是很大,我希望能够在图上水平滚动,以单独查看每个历元。

    我现在的代码,只绘制一个通道:

    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
    

    电流输出: Current output

    我对Matlab完全陌生,我还没有很好地使用它,但我想找到一种方法,在同一个图形上,以正确的可视化比例,单独查看我的134个历元(一种颜色=上面的一个历元)。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Aero Engy    7 年前

    这与我已经拥有的东西非常相似,所以我为你们调整了一下。基本上是将绘图数据传递给 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或更高版本。