当前位置:   article > 正文

MATLAB绘制三维图像(实现多组二维曲线的叠加显示)_matlab 多次plot叠加显示

matlab 多次plot叠加显示

目录

一、功能说明  

二、plot3函数说明

三、代码实现

四、代码优化


一、功能说明  

    近期在实验中采集了多组二维样本数据,每组数据都是随时间变化的曲线(如下图1.1),现在需要将所有样本都放在1张三维图中显示出来,从而直观的对比各组数据的差异。最终使用MATLAB的plot3函数实现了此功能,现将此方法记录下来。

图1.1 单组二维样本曲线
图1.2 最终效果:
多组二维曲线堆叠成三维图

 二、plot3函数说明

    MATLAB官方使用说明:

plot3(X,Y,Z) 绘制三维空间中的坐标。

  • 要绘制由线段连接的一组坐标,请将 XYZ 指定为相同长度的向量。

  • 要在同一组坐标轴上绘制多组坐标,请将 XY 或 Z 中的至少一个指定为矩阵,其他指定为向量。

    在绘制图象时我是这样理解:(x,y,z)对应着空间中的每个点,在绘图时,先将Y轴全部视为某一常数值,然后再将X轴视为自变量,Z轴视为因变量,这样的话,plot3(x,常数值,z)实际上与plot(x,y)函数的使用方式是一样的了。下面这张图是将Y向量全部赋值常数3(即第3组),X向量取值1:100,Z向量取X对应的样本值。

图2 三维图像(以取第3组为例)

Q:为什么Y轴的值是个向量而非一个常数值呢?

    这是因为第3组数据平面上的点不止一个,确切的说是由length(x)这么多个,也就是有length(x)个这样的点(x,常数值,z),所以在上面的情况中,Y轴的值是个长度为length(x),数值全为3的向量。

图3 标注出Y轴坐标值:全为3

    如果实在不能理解上述说明,可以先尝试将下面的代码运行起来,一边调整参数,一边理解使用方法。


三、代码实现

    有了前面的基础,现在可以这样编写代码:

    首先,生成一个样本集Data用于后续绘图展示(移植代码时,要根据自身数据大小来定义Data尺寸,并为其赋值),这个样本集共有10组样本,每组样本有100个数据,分别存储在Data的每一行中,所以Data初始值暂时定义为zeros(20,100)。[!行与列不要弄混!]

  1. clc;clf;close;clear;
  2. %% 产生数据源 Data
  3. % 待显示数据的大小:20组数据样本,每组样本100个数据
  4. Data = zeros(20,100);
  5. % 为待显示数据(Data)赋值,自定义曲线
  6. t = 1:100;
  7. for i = 1 :10
  8. Noise = randn(1,length(t))*0.1; %生成随机噪声
  9. Data(i,:) = [ones(1,20)*2 ones(1,60)*4 ones(1,20)*2] + Noise;
  10. end

    然后对Data中的数据进行绘图(核心代码):

    x为1:100的向量;y为常数值向量Group_num*ones(size(x)),Group_num的值对应组别的序号;z是x对应的因变量,每次取Data矩阵的第Group_num行即可。

  1. %% 绘制三维图像
  2. figure(1);
  3. for Group_Num = 1:10
  4. x = 1:100; % 数据长度为100,将全部显示出来
  5. y = Group_Num * ones(size(x)); % 共10组数据(组别号:1:10)
  6. z = Data(Group_Num, 1:100); % 每组数据的曲线值
  7. plot3(x,y,z); % 绘图
  8. hold on; % 保持
  9. end
  10. grid on;
  11. title(['多组样本值变化曲线']);
  12. xlabel("时间");ylabel("组别");zlabel("曲线值");

运行结果如下所示:

图4 三维图像(多组二维图像叠加)

四、代码优化

    实验中有时只需要观察部分数据,比如只看第4组到第8组的数据,或是只看曲线中间部分的数据,所以根据需求可以优化一下代码。

  1. 限制X轴范围(设置起止数据点)
  2. 限制Y轴范围(选取样本集组别)
  3. 限制Z轴范围(设置数据值范围)

    优化后的代码全部附在下面(可以直接编译运行):

  1. clc;clf;close;clear;
  2. %% 产生数据源 Data
  3. % 待显示数据的大小:20组数据样本,每组样本100个数据
  4. Data = zeros(20,100);
  5. % 为待显示数据(Data)赋值,自定义曲线
  6. t = 1:100;
  7. for i = 1 :10
  8. Noise = randn(1,length(t))*0.1; %生成随机噪声
  9. Data(i,:) = [ones(1,20)*2 ones(1,60)*4 ones(1,20)*2] + Noise;
  10. end
  11. %% 绘图代码优化
  12. %---3D图中显示数据的起始点---
  13. Range = [20,90];
  14. %---导入数据量的组别范围---
  15. Number = [3,9] ;
  16. %---三维样本值变化曲线---%
  17. figure(2);
  18. for Group_Num = Number(1) : Number(2)
  19. x = Range(1) : Range(2);
  20. y = Group_Num*ones(size(x));
  21. z = Data(Group_Num, Range(1):Range(2) );
  22. plot3(x,y,z);
  23. hold on;
  24. end
  25. grid on;
  26. %---3D图中数据值显示范围---
  27. zlim([1,5]);
  28. title(['多组样本值变化曲线']);
  29. xlabel("时间");ylabel("组别");zlabel("样本值");

     下图为选取第3组至第9组样本,每组只显示第30到90数据点的结果。

图5 X,Y,Z限制后图像

     如果想固定观察角度,可以在代码结尾处添加view(a,b)函数进行调整:

view(az,el) 为当前坐标区设置照相机视线的方位角和仰角。

    将两个参数都设置为0,则是相当于从正前方观察,运行结果如下图所示。

图6 view(0,0)视角观察

~------------~

~---Over---~

~------------~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/97168
推荐阅读
相关标签
  

闽ICP备14008679号