上帖子介绍了Matlab三维绘图的基础内容(见 http://www.jishulink.com/content/post/280288),
并留下一个思考题,本文就通过对这个思考题的讲解,将三维绘图的命令融汇贯通。
Step 1.数据分析
在做任何Matlab图形,或者说使用任何Matlab函数的时候,数据分析是最重要的步骤。因为:
1. 通过数据分析指导数据结构,才能正确使用函数;
2. 通过数据分析,可以对数据有一个感性的认识,这在很多问题上是至关重要的,也是经验的体现;
好了,我们先看看思考题的数据,如图 1所示。
分析:
1. 数据由一个44行,3列的矩阵组成;
2. 要求绘制的是图像为,x坐标为第一列数据,y坐标为第二列数据,z坐标为第三列数据;
3. 第一列数据总体是递增的,应该说是一个阶梯状的数据;
4. 在每个x轴阶梯上,y轴的数据都是重复[5 10 15 20 25 30]的;
6. 按照y轴数据重复了8个周期;
7. y轴的前6个周期都是6组数据[5 10 15 20 25 30];
8. y轴的后两个周期都是4组数据 [5 10 15 20];
以上就是我通过分析得到数据的8个特点,其实x轴数据和y轴数据,实现的就是格点矩阵,也就是meshgrid函数的功能,我们可以不用x轴与y轴的数据,只用z轴的数据,然后用meshgrid矩阵生成x,y轴的数据,这一点要深刻认识格点矩阵的本质,在本文的最后将讨论格点矩阵的结构。
Step 2.代码讲解
clc
clf
clear all;
load('data.mat'); %载入数据,在文档中会一并给出,就是z轴的数据
x_0=500:500:3000; %生成x轴的格点分段一[500 1000 1500 2000 2500 3000]
y_0=5:5:30; %生成y轴的格点分段一[5 10 15 20 25 30]
[xx_0,yy_0]=meshgrid(x_0,y_0); %根据x,y轴格点分段一生成格点矩阵一
Z_0=reshape(Z(1:36),[6,6]); %使得z轴数据的1到36行,组成6*6的矩阵形式,以便搭配格点矩阵一使用
surf(xx_0,yy_0,Z_0); %做出曲面图一
hold on %保持图形
x_1=3000:250:3500; %生成x轴的格点分段二[3000 3250 3500]
y_1=5:5:20; %生成y轴的格点分段二[5 10 15 20]
[xx_1,yy_1]=meshgrid(x_1,y_1); %根据x,y轴格点分段二生成格点矩阵二
Z_1_1=[Z(31:34);Z(37:end)]; %抽取出与格点矩阵搭配的Z轴数据
Z_1=reshape(Z_1_1,[4,3]); %将抽取的Z轴数据组成4*3的形式,搭配格点矩阵二
surf(xx_1,yy_1,Z_1); %做出曲面图二
说明:
1.为什么要分图形一与二
回答: 见数据分析 7,8两点;
2.为什么第二个曲面的x 要从 3000开始,而不是 3250
回答:如果从3250开始,图形将发生断裂,从3000开始,可以实现曲面的“缝合”;
Step 3.绘制结果
用文中所示的代码出的图如图2所示,如果不使用本文的图像“缝合技术”,将出现图3的断面。
Step 4.meshgrid 函数数据
运行代码
x_0=500:500:3000; %生成x轴的格点分段一[500 1000 1500 2000 2500 3000]
y_0=5:5:30; %生成y轴的格点分段一[5 10 15 20 25 30]
[xx_0,yy_0]=meshgrid(x_0,y_0); %根据x,y轴格点分段一生成格点矩阵一
我们来看看所生成的格点矩阵式什么款式的。
可以看到:
1.xx_0与yy_0都是6*6的矩阵;
2. xx_0的数据每行都是一样的,由[500 1000 1500 2000 2500 3000] 构成;
3. yy_0的数据每列都是一样的,由[5 10 15 20 25 30]构成;
运行
Z_0=reshape(Z(1:36),[6,6]); %使得z轴数据的1到36行,组成6*6的矩阵形式,以便搭配格点矩阵一使用
我们看看与之搭配的Z_0是什么样子的
可以看到,Z_0 也应该是一个6*6的矩阵,每一列,对应每一个y轴周期
本案例相关代码及数据见 http://www.jishulink.com/content/doc/4ff96c69-23fc-4bff-9a0d-9de3a97d763c