【Matlab】三维绘图总结

本文详细介绍了Matlab中的三维绘图函数,包括mesh、meshc、meshz、waterfall、surf等,以及如何使用colormap进行颜色映射。通过实例展示了各种函数的用法,如设置边线颜色、面颜色、线型和透明度等属性,同时讲解了等高线图的绘制。文章适合Matlab初学者和进阶者,旨在帮助读者掌握三维图形的绘制技巧。

【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说明
hsvHSV 的颜色对照表
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】二维绘图总结

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值