【Matlab】三维绘图总结
参考资料:
《Matlab编程及其应用第三讲》——陆伟
《Matlab 帮助文档》
1. 三维曲线
绘制三维曲线:首先要有三个
1
×
n
1\times n
1×n的矩阵,然后使用plot3函数,举例如下:
clear; clc;
t = 0 : pi/20 : 8*pi;
x = sin(t);
y = cos(t);
z = 1.5*t;
hp = plot3(x, y, z);
set(hp, 'linewidth', 2, 'color', 'r');
grid on;
axis square;
shg;
绘图结果:

2. 空间曲面
绘制空间曲面,首先要有两个行数列数对应相同的二维矩阵 X X X和 Y Y Y(行数和列数可以不一样),然后再有一个函数 Z = f ( X , Y ) Z=f(X, Y) Z=f(X,Y),具备这三个数组之后就可以使用下面的绘图函数。
不过在此之前,先给出meshgrid函数的用法:
%格式:[X, Y] = meshgrid(a, b); a 和 b 都是行向量
%注:[X, Y] = meshgrid(a) 等价于[X, Y] = meshgrid(a, a);
%X是一个矩阵,其中每一行是a的副本,Y是一个矩阵,其中每列是y'(y转置)的副本。
%由坐标X和Y表示的网格有length(y)行和length(x)列。
clear; clc;
x = [1 2 3];
y = [1 2 3 4 5];
[X, Y] = meshgrid(x, y);
disp(X);
disp(Y);
%输出结果如下:
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
下面是一些绘图函数。
2.1 mesh 函数
2.1.1 使用格式
使用格式:
mesh(X, Y, Z)
%{创建一个网格线有颜色、面没有颜色的三维表面网格图。网格线的颜色根据 Z 指定的高度
渐变。%}
mesh(Z)
%与上面的大同小异,只是使用Z中元素的列和行的索引作为X和Y坐标。
mesh(__, C) %这里 C 称为 color array,在下面 2.1.3 中会用到
%{通过包含第四个矩阵输入 C 来指定网格图的颜色。网格图使用 Z 表示高度,C表示颜色。
使用【颜色映射】指定颜色,【颜色映射】使用单个数字表示光谱上的颜色。当您使用【颜
色映射】时,C与Z的维度相同。在图形中添加一个<颜色条>(使用 colorbar 命令),以显示
C中的数据值如何与【颜色映射】中的颜色相对应。%}
2.1.2 几个简单的例子
下面开始举使用mesh的例子:
%例1
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3, -5 : 0.1 : 5);
Z = peaks(X, Y);
%注:peaks是matlab内置的一个比较复杂的函数,表达式为:
%{
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2)
%}
mesh(X, Y, Z); %三个矩阵都是101乘61的矩阵
例1的绘图结果:

%例2
clear; clc;
[X, Y] = meshgrid(-8 : 0.1 : 8);
%这里生成的X和Y都是一个61乘61的方阵
r = sqrt(X.^2+Y.^2);
%有时在上式的末尾 + eps,eps是一个很小的双精度数,为了使分母不为0,但不加其实也可以
Z = sin(r)./r;
%注意这里的'./'是对数组中每个元素操作,使用'/'会报错
mesh(X, Y, Z); %三个矩阵都是一个161乘161的方阵
例2的绘图结果(这个图俗称墨西哥帽子):

%例3,在例2的基础上添加一个颜色映射,并用colorbar显示颜色和C中的值的对应关系
clear; clc;
[X, Y] = meshgrid(-8 : 0.1 : 8);
r = sqrt(X.^2+Y.^2);
C = X.*Y;
% '.*'代表X和Y中的元素对应相乘,而'*'才代表矩阵相乘
Z = sin(r)./r;
%注意这里的'./'是对数组中每个元素操作,使用'/'会报错
mesh(X, Y, Z, C);%四个矩阵都是一个161乘161的方阵
colorbar;
%注:如果不用C,也是可以用 colorbar 命令的
例3的绘图结果:

2.1.3 添加额外的属性
1)EdgeColor 属性
使用示例:
%所有的边只用一种颜色
mesh(X, Y, Z, 'EdgeColor', 'r');
%根据矩阵 C 的值,为每个边使用不同的颜色。
mesh(X, Y, Z, 'EdgeColor', 'flat');
%根据矩阵 C 的值为每条边使用插值着色。
mesh(X, Y, Z, 'EdgeColor', 'interp');
2)FaceColor 属性
使用示例:
%所有的网格面只用一种颜色
mesh(X, Y, Z, 'FaceColor', 'b');
%根据矩阵 C 的值,为每个网格面使用不同的颜色。
mesh(X, Y, Z, 'FaceColor', 'flat');
%根据矩阵 C 的值,为每个网格面使用插值着色。
mesh(X, Y, Z, 'FaceColor', 'interp');
3)LineStyle 属性
使用示例:
%去除图中的网格线
mesh(X, Y, Z, 'LineStyle', 'none');%这种情况下建议加上'FaceColor'属性,否则图会为纯白色(因为网格面默认是不着色的)
%使用其他线型。这里和前面的二维绘图就是一样的了,举一个点线型的例子吧
mesh(X, Y, Z, 'LineStyle', '-.');%这里注意'.-'会报错
4)FaceAlpha 属性
这个可以用来调整图像的透明度,给出的数值越小,图就越透明。默认值为1,代表不透明。这里仅列出最常见的用法:
%属性后面给出一个0到1之间的值,默认是1
mesh(X, Y, Z, 'FaceAlpha', '0.2');
2.2 meshc 函数
创建一个网格图,下面有一个轮廓图(可以看作 x-y 平面上有一个等高线图)。
使用格式以及属性都和mesh函数差不多,不再赘述,直接给例子。
%例子
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
meshc(X, Y, Z);
绘图结果:

2.3 meshz 函数
绘制带帷幕(相当于在边界加上了一圈帘子)的网格曲线图。
使用格式以及属性都和mesh函数差不多,不再赘述,直接给例子。
%例子
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
meshz(X, Y, Z);
绘图结果:

2.4 waterfall 函数
绘制一个瀑布图,这是一个沿着Y维度带有部分帷幕的网格图。这就产生了“瀑布”效果!
使用格式以及属性都和mesh函数差不多,不再赘述,直接给例子。
%例子
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
waterfall(X, Y, Z);
绘图结果:

2.5 surf 函数
创建了一个三维表面,与前面的都不同的是,它创建的图的边和面都有颜色。即
mesh绘制网格图,surf绘制着色的三维表面图。
使用格式以及属性都和mesh函数差不多,不再赘述,直接给例子。
%例子
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
surf(X, Y, Z);
绘图结果:

2.6 colormap 函数
2.6.1 使用格式
这里给出常用的两种用法:
第一种:
colormap mapname;
%{上面这个语句等价于
colormap('mapname');
%}
这里,mapname是 matlab 预设的颜色映射图,如下表所示:
| mapname | 说明 |
|---|---|
| hsv | HSV 的颜色对照表 |
| hot | 代表”热“的颜色对照表 |
| cool | 代表”冷“的颜色对照表 |
| spring | 代表”春天“的颜色对照表 |
| summer | 代表”夏天“的颜色对照表 |
| autumn | 代表”秋天“的颜色对照表 |
| winter | 代表”冬天“的颜色对照表 |
| gray | 代表”灰色“的颜色对照表 |
| copper | 代表”铜色“的颜色对照表 |
| bone | 代表” X 光片“的颜色对照表 |
| pink | 代表”粉红“的颜色对照表 |
| flag | 代表”旗帜“的颜色对照表 |
第二种:
colormap(map);
这里,map是一个
n
×
3
n\times 3
n×3的矩阵,每一行都代表一个RGB的成分,即一种颜色。matlab 在画图时,把第一行的颜色对应曲面的最高点,最后一行颜色对应曲面最低点,其余高度颜色依照线性内插法给出。
2.6.2 几个简单的例子
%例1,使用第一种方法
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
mesh(X, Y, Z);
colormap hot;
绘图结果:

%例2,仍然使用第一种方法,换一个形式
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
mesh(X, Y, Z);
colormap('copper');
绘图结果:

%例3,使用第二种方法
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
mesh(X, Y, Z);
colormap(rand(100, 3));
%注:rand(m, n)函数生成一个 m 乘 n 的矩阵
绘图结果:

3. 等高线图
绘制等高线图,首先要有两个行数列数对应相同的二维矩阵 X X X和 Y Y Y(行数和列数可以不一样),然后再有一个函数 Z = f ( X , Y ) Z=f(X, Y) Z=f(X,Y),具备这三个数组之后就可以使用下面的绘图函数。
3.1 contour 函数
在平面上绘制等高线。
3.1.1 使用格式
contour(X, Y, Z);
%在平面上绘制等高线
contour(Z);
%这里相当于contour(X, Y, Z),其中[X, Y] = meshgrid(x, y)
%x默认为Z的行索引组成的矩阵,y默认为Z的列索引组成的矩阵
contour(__, levels);
%指定高度层,levels越大,高度分的越细,等高线数量就越多
3.1.2 几个简单的例子
%例1
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
contour(X, Y, Z, 20);
绘图结果:

%例2
clear; clc;
[X, Y] = meshgrid(-5 : 0.1 : 5);
Z = peaks(X, Y);
contour(Z, 50);
绘图结果:

3.1.3 添加额外的属性
1)LineSpec 属性
这个不用加关键字,直接指定类型即可。使用示例:
%和二维绘图中的plot函数一样
%颜色指定为蓝色,线型指定为虚线
contour(X, Y, Z, '--b');
2)ShowText 属性
使用示例:
%默认值为'off',设置为'on'后,图中会显示等高线标签
contour(X, Y, Z, 'ShowText', 'on');
显示等高线标签还可以使用另一种方法,使用clabel函数。使用示例:
M = contour(X, Y, Z);
clabel(M);
%注:M 是等高线矩阵,它包含每一层顶点的(x, y)坐标。
3)LineWidth 属性
使用示例:
%默认值为0.5
contour(X, Y, Z, 'LineWidth', 1.2);
3.2 contour3 函数
创建一个三维等高线图。
使用格式以及属性都和contour函数差不多,不再赘述,直接给例子。
%例子
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
contour3(X, Y, Z, 20);
绘图结果:

3.3 contourf 函数
绘制填充颜色的平面等高线图。
使用格式以及属性都和contour函数差不多,不再赘述,直接给例子。
%例子
clear; clc;
[X, Y] = meshgrid(-3 : 0.1 : 3);
Z = peaks(X, Y);
contourf(X, Y, Z, 20);
绘图结果:

4. v = f(x, y, z) 的可视化
常用的方法是对三维体切片,在截面处用不同颜色表征在该点的函数值的大小。使用的是slice函数。
4.1 使用格式
使用格式:
slice(X, Y, Z, V, sx, sy, sz)
X, Y, Z 是三个各个维度长度都相同的三维矩阵,V 是关于 X, Y, Z 的一个函数。sx 为一个行向量,每个元素代表一个x切片(平行于 yoz 平面),sy 与 sz 的含义同 sx 大同小异。
4.2 例子
使用示例:
%例子
clear; clc;
[X, Y, Z] = meshgrid(-2 : 0.1 : 2);
V = X.*exp(-X.^2 - Y.^2 - Z.^2);
xslice = [-1, 1];
yslice = 2;
zslice = [-2, 0];
slice(X, Y, Z, V, xslice, yslice, zslice);
绘图结果:

5. 写在最后
如果哪里有错误欢迎指出,共同学习,共同进步!
如果有什么问题,欢迎提问!
谢谢!
下一篇文章预告:【Matlab】音频信号处理
欢迎继续关注
链接指路:
上一篇:【Matlab】二维绘图总结
本文详细介绍了Matlab中的三维绘图函数,包括mesh、meshc、meshz、waterfall、surf等,以及如何使用colormap进行颜色映射。通过实例展示了各种函数的用法,如设置边线颜色、面颜色、线型和透明度等属性,同时讲解了等高线图的绘制。文章适合Matlab初学者和进阶者,旨在帮助读者掌握三维图形的绘制技巧。
1930

被折叠的 条评论
为什么被折叠?



