作为一个经常和数据打交道的人,我对MATLAB的三维绘图功能简直爱到不行!记得第一次用它画出三维螺旋线的时候,我盯着屏幕看了好久——原来数据还能这么直观地展示出来!今天就把我这些年用MATLAB画三维图的经验分享给大家,从基础曲线到动态可视化,包你学会!
如果你已经会用MATLAB画二维曲线(plot函数),那过渡到三维曲线简直不要太简单!三维曲线用的是plot3函数,只需要输入x、y、z三个向量就行。比如我们画一条三维螺旋线:
matlab
t = 0:pi/50:10*pi; % 生成参数t,从0到10π,步长pi/50
x = sin(t); % x坐标是sin(t)
y = cos(t); % y坐标是cos(t)
z = t; % z坐标随t线性增长
plot3(x,y,z); % 画三维曲线
grid on; % 显示网格(超级重要,不然图会很空)
xlabel('X轴'); % 添加X轴标签
ylabel('Y轴'); % 添加Y轴标签
zlabel('Z轴'); % 添加Z轴标签
title('三维螺旋线示例'); % 添加标题
运行这段代码,你会看到一条漂亮的螺旋线从底部盘旋上升——是不是很神奇?这里的grid on一定要加,不然只有一条线飘在那里,根本看不出三维效果。xlabel、ylabel、zlabel也是必不可少的,不然别人都不知道你的轴代表什么。
如果说三维曲线是点的连线,那曲面图就是点的面——更适合展示连续的三维数据。MATLAB里最常用的曲面函数是mesh和surf,我们一个个来试。
mesh函数画的是线框曲面,看起来像钢丝网一样,适合展示曲面的结构。比如我们用MATLAB自带的peaks函数(一个经典的测试曲面)来演示:
matlab
[X,Y] = meshgrid(-2:0.1:2); % 生成X和Y的网格矩阵(敲黑板!这步不能少)
Z = peaks(X,Y); % 计算每个网格点的Z值,peaks函数生成凹凸曲面
mesh(X,Y,Z); % 画线框曲面
grid on;
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('mesh函数线框曲面示例');
这里要重点说一下meshgrid函数——它把一维的x和y向量转换成二维的网格矩阵,这样每个(X(i,j), Y(i,j))对应一个网格点,Z(i,j)就是这个点的高度。如果没有meshgrid,你直接用x和y的向量去算Z,MATLAB会报错说维度不匹配,我刚开始学的时候就踩过这个坑!
如果你觉得线框曲面不够直观,想看到曲面的高低起伏,那surf函数就是你的不二之选。surf画的是带颜色填充的曲面,不同高度的区域颜色不同,一眼就能看出哪里高哪里低。把上面的mesh改成surf就行:
matlab
[X,Y] = meshgrid(-2:0.1:2);
Z = peaks(X,Y);
surf(X,Y,Z); % 画带颜色填充的曲面
colorbar; % 显示颜色条,对应Z值的范围(超级实用!)
grid on;
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('surf函数带颜色填充曲面示例');
运行后你会看到一个彩色的曲面,旁边还有一个颜色条,告诉你红色代表高值,蓝色代表低值(默认用jet颜色映射)。如果你想换颜色,可以用colormap函数,比如colormap(gray)会变成灰度图,colormap(hot)会变成热图——试试不同的颜色映射,会有惊喜哦!
有时候我们手里的数据是离散的,比如实验测得的一组三维点,这时候用散点图更合适。MATLAB里的scatter3函数就是干这个的:
matlab
% 生成100个随机三维点
x = randn(100,1); % 正态分布的x坐标
y = randn(100,1); % 正态分布的y坐标
z = randn(100,1); % 正态分布的z坐标
scatter3(x,y,z,'filled'); % 画填充的三维散点
grid on;
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('三维散点图示例');
这里的'filled'参数让点变成实心的,看起来更明显。如果你想根据Z值给点上色,可以加一个颜色参数:
matlab
scatter3(x,y,z,20,z,'filled'); % 20是点的大小,z是颜色依据
colorbar;
这样不同Z值的点颜色不同,你可以一眼看出点的分布趋势——比如Z值大的点是不是集中在某个区域?
如果你想让你的三维图更炫酷,比如让曲面旋转或者动态更新数据,MATLAB也能轻松搞定。比如我们做一个旋转的peaks曲面:
matlab
[X,Y] = meshgrid(-2:0.1:2);
Z = peaks(X,Y);
surf(X,Y,Z);
axis tight; % 固定坐标轴范围,避免图乱跑
colorbar;
title('旋转的peaks曲面');
for angle = 1:360 % 循环360次,让视角转一圈
view(angle,30); % 改变视角:angle是方位角,30是仰角
pause(0.01); % 暂停0.01秒,让动画慢一点
end
运行这段代码,你会看到曲面慢慢旋转,从不同角度展示它的形状——是不是超酷?你还可以调整pause的时间,比如改成0.05秒,动画会更慢;或者改变仰角,比如view(angle,45),会有不同的效果。
掌握了基础函数,再学几个小技巧,你的三维图就能达到 publication 级别了:
最后,分享几个我踩过的坑,希望你能避免:
MATLAB的三维绘图功能其实不难,关键是多动手实践。从plot3到mesh、surf,再到动态可视化,一步步来,很快就能掌握。建议你把上面的例子都敲一遍,然后试着用自己的数据来画图——比如你的实验数据、模拟结果,用三维图展示出来,会比二维图更直观。相信我,当你画出第一个漂亮的三维曲面时,那种成就感是无法言喻的!
好了,今天的分享就到这里。如果你有什么问题或者更好的技巧,欢迎在心里默默记录(虽然我看不到,但思考本身就是进步的开始)。祝大家画图愉快!