Matlab 指定轴的限制

Matlab 指定轴的限制,matlab,Matlab,我试图在MatLab中将x轴,即频率轴限制为4Hz。这是我使用的代码: subplot(3,1,2); %Fse = 220; time = 0:1/fse:secBuffer-1/fse; %a = eegCounter; c = eegBuffer; wo = 50 / (1000/2); bw = wo / 60; [b,a] = iirnotch(wo,bw);

我试图在MatLab中将x轴,即频率轴限制为4Hz。这是我使用的代码:

        subplot(3,1,2);
        %Fse = 220;
        time = 0:1/fse:secBuffer-1/fse;
        %a = eegCounter;
        c = eegBuffer;
        wo = 50 / (1000/2);
        bw = wo / 60;
        [b,a] = iirnotch(wo,bw);
        y = filter(b,a,c);
        ydft = fft(c);
        xdft = fft(y);
        xlabel('Frequency');
        ylabel('Signal');
        xlim([1,4]);
        ylim([1,4]);
        plot(xdft,ydft);

然而,我的是实时信号绘图,x轴和y轴都会根据传入的数据包不断变化。如何将x轴限制为4 Hz?

您可以使用此处定义的功能轴

您可以使用此处定义的功能轴

绘制时,MATLAB会自动尝试将轴与数据的动态范围相匹配。因此,如果要确保只绘制给定的范围,则需要在调用plot后指定该范围,以强制MATLAB进行绘制,否则将无法进行绘制,并且将被整个数据卡住

下面是一个非常简单的代码,我在调用plot之前或之后调用
xlim
。看到区别了吗

clear
clc
close all

x = 1:50;
y = x.^2;

figure
subplot(1,2,1)
xlim([1 20])
plot(x,y)
title('xlim before call to plot')

subplot(1,2,2)
plot(x,y)
xlim([1 20])
title('xlim after call to plot')
产生以下结果:


绘图时,MATLAB会自动尝试将轴与数据的动态范围相匹配。因此,如果要确保只绘制给定的范围,则需要在调用plot后指定该范围,以强制MATLAB进行绘制,否则将无法进行绘制,并且将被整个数据卡住

下面是一个非常简单的代码,我在调用plot之前或之后调用
xlim
。看到区别了吗

clear
clc
close all

x = 1:50;
y = x.^2;

figure
subplot(1,2,1)
xlim([1 20])
plot(x,y)
title('xlim before call to plot')

subplot(1,2,2)
plot(x,y)
xlim([1 20])
title('xlim after call to plot')
产生以下结果:


您必须将轴的
XLimMode
(和
YLimMode
)属性设置为
manual
。但是,即使这样做,每次调用
plot(…)
都会将其重置为
auto
,并弄乱轴限制

最干净的方法是首先在任何循环之外定义轴和绘图(不要忘记获取它们的句柄),然后在更新数据时,只需使用
set
方法更新线对象的
XData
YData
set
方法只会更新传入参数的属性,因此不会修改
XLimMode
属性

%// This part of the code should run only once
h.ax = subplot(3,1,2) ; %// get the handle of the axes
h.line = plot(0) ;    %// create an empty line plot
set(h.ax , 'XLimMode','manual' , 'XLim',[1 4]) ; %// define the properties of the axes (X)
set(h.ax , 'YLimMode','manual' , 'YLim',[1 4]) ; %// define the properties of the axes (Y)
xlabel('Frequency');
ylabel('Signal');
%//
%// This part of the code is the loop where you calculate and update your plot
%// ...
%// now do your calculations
%// ...
%// when it is time to update, just call:
set( h.line, 'XData',xdft 'YData',ydft ) ;

必须将轴的
XLimMode
(和
YLimMode
)属性设置为
manual
。但是,即使这样做,每次调用
plot(…)
都会将其重置为
auto
,并弄乱轴限制

最干净的方法是首先在任何循环之外定义轴和绘图(不要忘记获取它们的句柄),然后在更新数据时,只需使用
set
方法更新线对象的
XData
YData
set
方法只会更新传入参数的属性,因此不会修改
XLimMode
属性

%// This part of the code should run only once
h.ax = subplot(3,1,2) ; %// get the handle of the axes
h.line = plot(0) ;    %// create an empty line plot
set(h.ax , 'XLimMode','manual' , 'XLim',[1 4]) ; %// define the properties of the axes (X)
set(h.ax , 'YLimMode','manual' , 'YLim',[1 4]) ; %// define the properties of the axes (Y)
xlabel('Frequency');
ylabel('Signal');
%//
%// This part of the code is the loop where you calculate and update your plot
%// ...
%// now do your calculations
%// ...
%// when it is time to update, just call:
set( h.line, 'XData',xdft 'YData',ydft ) ;

在调用plotso@brainReader之后,再调用xlim和ylim。有任何答案可以帮助您解决问题吗?如果是的话,请考虑接受一个。谢谢@贝诺伊11:完成了。试试这个:哈哈,好的,谢谢你接受我的:)今天晚些时候我会看一看。在给plotso@brainReader打电话之后,再给xlim和ylim打电话。有什么答案可以帮你解决问题吗?如果是的话,请考虑接受一个。谢谢@贝诺伊11:完成了。试试这个:哈哈,好的,谢谢你接受我的:)今天晚些时候我会看一看。好的@Hoki我更喜欢你的解决方案而不是我的,这很简单+1:)好极了。。。工作顺利,但只运行一次。所以我会努力解决它。@AjayKulkarni。您应该只运行顶部部分一次,但“刷新”部分可以根据需要多次运行。在您的示例代码中没有循环(或任何实时刷新)的痕迹,因此我无法复制它。我不知道你的数据是如何刷新的,但每次他们都只调用最后一行。好的@Hoki我更喜欢你的解决方案,而不是我的,这很简单+1:)好极了。。。工作顺利,但只运行一次。所以我会努力解决它。@AjayKulkarni。您应该只运行顶部部分一次,但“刷新”部分可以根据需要多次运行。在您的示例代码中没有循环(或任何实时刷新)的痕迹,因此我无法复制它。我不知道你的数据是如何刷新的,但每次他们都会调用最后一行。