在matlab中把超过阈值的区域用线标出来

问题提出

本问题来源于“问答”上看到的一个问题,感觉挺有趣的,就来试一下。

想法

对于已知的数据,我们可以遍历一遍,然后获得大于阈值的数据所在的位置,然后通过判断位置是否相邻可以获得以闭区间表示的区域,然后将各区域画在图上就可以了。

代码实现

 
x = 0.5:0.5:50;
y = 2*rand(1,100);
v = 1;
plotAreaOverV(x, y, v);
 
function plotAreaOverV(x, y, v)
lineY=0;%黄色线所在位置
 
plot(x,y);
hold on
plot(x, v*ones(size(x,2)));%画出阈值线
 
areaOverX = find(y>v);%获得大于阈值的数据所在位置
startp = areaOverX(1);
startx = x(startp);
endp = areaOverX(1);
endx = x(endp);
 
for i=2:size(areaOverX,2)
    if areaOverX(i)-endp <= 1 %前后数据相邻
        endp = areaOverX(i);
        endx = x(endp);
    else
        hold on;
        dstartx = (x(max(startp-1,1)) - startx)/2; %起始点向前移动半个单位
        dendx = (x(min(endp+1,size(x,2))) - endx)/2;%结束点向后移动半个单位
        plot([startx+dstartx endx+dendx],[lineY lineY],Color='y',LineWidth=5);%画出前一段连续数据
        startp = areaOverX(i);
        startx = x(startp);
        endp = areaOverX(i);
        endx = x(endp);
    end
end
 
%画出最后一段线
dstartx = x(max(startp-1,1)) - startx;
dendx = x(min(startp+1,size(x,2))) - endx;
plot([startx+dstartx/2 endx+dendx/2],[lineY lineY],Color='y',LineWidth=5);
 
end

代码结果

总结

结果看起来还是可以的,不过边界点我这里是向左右延伸了半个单位,处理地比较粗糙,可以改进为根据阈值在前后两点连线上的x值。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuelanghanbao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值