【问题标题】:How to force MATLAB function area to hold on in figure如何强制MATLAB函数区域保持在图中
【发布时间】:2015-07-25 16:33:24
【问题描述】:

我正在研究这个函数,它获取轴处理程序和数据,并且应该在轴上正确地绘制它。该函数在 for 循环中调用。它应该在一个图中绘制多个数据。我的结果图如下所示。

只有两个正确绘制的图形(具有四种颜色的图形)。其他人错过了在最终区域之前绘制的区域(红色区域是每个图表中最后绘制的区域)。但是每个轴的脚本都是相同的。那么错误可能在哪里呢?整个函数写在下面。

function [] = powerSpectrumSmooth(axis,signal,fs)

N= length(signal);
samplesPer1Hz = N/fs;
delta = int16(3.5*samplesPer1Hz); %last sample of delta frequncies
theta = int16(7.5*samplesPer1Hz); %last sample of theta frequncies
alpha = int16(13*samplesPer1Hz); %last sample of alpha frequncies
beta = int16(30*samplesPer1Hz); %last sample of beta frequncies

x=fft(double(signal));
powerSpectrum = 20*log10(abs(real(x)));
smoothPS=smooth(powerSpectrum,51);

PSmin=min(powerSpectrum(1:beta));

y1=[(smoothPS(1:delta)); zeros(beta-delta,1)+PSmin];
y2=[zeros(delta-1,1)+PSmin; (smoothPS(delta:theta)); zeros(beta-theta,1)+PSmin];
y3=[zeros(theta-1,1)+PSmin; (smoothPS(theta:alpha)); zeros(beta-alpha,1)+PSmin];
y4=[zeros(alpha-1,1)+PSmin; (smoothPS(alpha:beta))];


 a1=area(axis,1:beta,y1);
 set(a1,'FaceColor','yellow')
 hold on

 a2=area(axis,1:beta,y2);
 set(a2,'FaceColor','blue')

 a3=area(axis,1:beta,y3);
 set(a3,'FaceColor','green')

 a4=area(axis,1:beta,y4);
 set(a4,'FaceColor','red')

添加

这是调用上述函数的函数。

function [] = drawPowerSpectrum(axesContainer,dataContainer,fs)

size = length(axesContainer);

for l=1:size

    powerSpectrumSmooth(axesContainer{l},dataContainer{l},fs)

    set(axesContainer{l},'XTickLabel','')
    set(axesContainer{l},'YTickLabel','')

    uistack(axesContainer{l}, 'top');

end

7 月 29 日添加

这是一个重现错误的脚本,因此您可以在您的计算机上运行它。在再次运行之前,您可能需要清除变量。

len = 9;

axesContainer = cell(len,1);
x = [0.1,0.4,0.7,0.1,0.4,0.7,0.1,0.4,0.7];
y = [0.1,0.1,0.1,0.4,0.4,0.4,0.7,0.7,0.7];

figure(1)

for i=1:len
    axesContainer{i} = axes('Position',[x(i),y(i),0.2,0.2]);
end

dataContainer = cell(len,1);
N = 1500;

for i=1:len
        dataContainer{i} = rand(1,N)*100;
end

for l=1:len

    y1=[(dataContainer{l}(1:N/4)) zeros(1,3*N/4)];
    y2=[zeros(1,N/4) (dataContainer{l}(N/4+1:(2*N/4))) zeros(1,2*N/4)];
    y3=[zeros(1,2*N/4) (dataContainer{l}(2*N/4+1:3*N/4)) zeros(1,N/4)];
    y4=[zeros(1,3*N/4) (dataContainer{l}(3*N/4+1:N))];

    axes=axesContainer{l};

    a1=area(axes,1:N,y1);
    set(a1,'FaceColor','yellow')
    hold on
    a2=area(axes,1:N,y2);
    set(a2,'FaceColor','blue')
    hold on
    a3=area(axes,1:N,y3);
    set(a3,'FaceColor','green')
    hold on
    a4=area(axes,1:N,y4);
    set(a4,'FaceColor','red')

    set(axes,'XTickLabel','')
    set(axes,'YTickLabel','')

end

这个脚本的结果如下图:

同样只有一张图片包含所有区域。

【问题讨论】:

  • 请展示您的整个代码以及如果您将hold off 添加到函数的最后一行并将hold on 移动到a1=... 上方会发生什么?
  • 哇,“整个代码”是什么意思?这就像涉及6个功能。这是唯一重要的。我可以添加一个带循环的。当我在最后添加延迟时,没有任何变化。与上面a1的保持相同。
  • 尝试发布一个用假数据重现这种效果的MVCE,这样我们就可以复制代码,试一试并调试它。否则将很难提供帮助!
  • @AnderBiguri 我不知道 MVCE 是什么意思,但我想我没有理解你的意思。脚本已添加。感谢您的回复。
  • 你需要这样创建坐标区吗?

标签: matlab matlab-figure


【解决方案1】:

看起来每次调用 plot(axes,data) 都会删除写在 axes 中的任何内容。

重要提示:不要使用与函数相同的变量名。不要打电话给sinplotaxes!!我把它改成了axs

为了解决这个问题,我只是使用了经典的subplot,而不是像你那样创建轴:

len = 9;

axesContainer = cell(len,1);
x = [0.1,0.4,0.7,0.1,0.4,0.7,0.1,0.4,0.7];
y = [0.1,0.1,0.1,0.4,0.4,0.4,0.7,0.7,0.7];

figure(1)


dataContainer = cell(len,1);
N = 1500;

for i=1:len
        dataContainer{i} = rand(1,N)*100;
end

for l=1:len

    y1=[(dataContainer{l}(1:N/4)) zeros(1,3*N/4)];
    y2=[zeros(1,N/4) (dataContainer{l}(N/4+1:(2*N/4))) zeros(1,2*N/4)];
    y3=[zeros(1,2*N/4) (dataContainer{l}(2*N/4+1:3*N/4)) zeros(1,N/4)];
    y4=[zeros(1,3*N/4) (dataContainer{l}(3*N/4+1:N))];

    axs=subplot(3,3,l);

    a1=area(axs,1:N,y1);
    set(a1,'FaceColor','yellow')
    hold on
    a2=area(axs,1:N,y2);
    set(a2,'FaceColor','blue')
    hold on
    a3=area(axs,1:N,y3);
    set(a3,'FaceColor','green')
    hold on
    a4=area(axs,1:N,y4);
    set(a4,'FaceColor','red')
 
    set(axs,'XTickLabel','')
    set(axs,'YTickLabel','')
    axis tight % this is to beautify it.
end

据我所知,您仍然可以将 axs 变量保存在 axescontainer 中,然后修改您想要的属性(例如位置)。

【讨论】:

  • 它确实有效,但我不确定“如何强制函数 XYZ 做某事”之类的问题的正确答案是否是“不使用该函数”。
  • @user50222 完全同意你的看法。只是,您似乎无法强制 XYZ 执行您想要的操作:(
【解决方案2】:

我发现了如何做我需要的。

len = 8;

axesContainer = cell(len,1);
x = [0.1,0.4,0.7,0.1,0.4,0.7,0.1,0.4];
y = [0.1,0.1,0.1,0.4,0.4,0.4,0.7,0.7];

figure(1)

for i=1:len
    axesContainer{i} = axes('Position',[x(i),y(i),0.2,0.2]);
end

dataContainer = cell(len,1);
N = 1500;

for i=1:len
        dataContainer{i} = rand(1,N)*100;
end

for l=1:len

    y1=[(dataContainer{l}(1:N/4)) zeros(1,3*N/4)];
    y2=[zeros(1,N/4) (dataContainer{l}(N/4+1:(2*N/4))) zeros(1,2*N/4)];
    y3=[zeros(1,2*N/4) (dataContainer{l}(2*N/4+1:3*N/4)) zeros(1,N/4)];
    y4=[zeros(1,3*N/4) (dataContainer{l}(3*N/4+1:N))];

    axes=axesContainer{l};

    Y=[y1',y2',y3',y4'];

    a=area(axes,Y);

    set(axes,'XTickLabel','')
    set(axes,'YTickLabel','')

end

该区域应该与这样的矩阵一起使用。棘手的部分是,每一列中的信号不是绝对绘制的,而是相对于前一列中的数据绘制的。这意味着,如果在时间 1 第一列中的数据值为 1,第二列中的数据值为 4,则第二列数据的绘制值为 5。来源:http://www.mathworks.com/help/matlab/ref/area.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2013-04-01
    • 2014-08-15
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多