1. 从二维到三维:为什么我们需要plot3和meshgrid?
很多朋友刚开始用Matlab画图,都是从plot这个老朋友开始的。一条简单的plot(x, y),就能把数据变成清晰的曲线,无论是分析实验结果还是展示模型输出,都离不开它。但不知道你有没有遇到过这样的场景:你的数据不再仅仅是x和y两个维度,它可能还包含了时间、深度或者另一个变量z。比如,你想看一个物体在三维空间中的运动轨迹,或者想观察一个曲面(比如地形高度、温度分布)随两个坐标变化的起伏情况。这时候,二维的plot就有点力不从心了,它的舞台是平面,而你的数据已经进入了立体的世界。
这就是plot3和meshgrid大显身手的时候了。简单来说,plot3是plot在三维空间的自然延伸,专门用来画三维空间中的点和线。而meshgrid则是一个“网格生成器”,是绘制三维曲面(比如用mesh或surf画出的那些带网格或着色的漂亮曲面)之前几乎必不可少的准备工作。它们俩搭档,能帮你把复杂的高维数据变得直观可见。
我刚开始接触三维绘图时,也犯过迷糊,以为直接把三个等长的向量扔给plot3就能画出曲面,结果出来的只是一条扭来扭去的空间曲线。后来才明白,画线和画面对数据格式的要求完全不同。线是一维的,沿着一个参数(比如时间)变化;而面是二维的,需要在两个方向(比如X和Y)上铺开成网格。这个“铺网格”的活儿,就是meshgrid的核心任务。理解了这个区别,三维绘图就成功了一大半。
所以,这篇文章就是来帮你跨过这个坎的。我们不谈太多枯燥的理论,就通过几个我实际用过的、从简单到复杂的例子,手把手带你掌握plot3和meshgrid的进阶技巧,让你能自由地把数据从二维平面“拎”到三维空间,做出更专业、更有表现力的图表。
2. plot3:让线条在空间舞动
2.1 基础用法:从plot到plot3的无缝切换
如果你已经会用plot,那么学会plot3只需要一分钟。它的基本语法和plot几乎一模一样,只是多了一个维度:
plot3(X, Y, Z)
这里的X, Y, Z是三个长度相同的向量,分别代表空间中每个点的x坐标、y坐标和z坐标。plot3会按照向量元素的顺序,依次连接这些点,形成一条空间曲线。
我们来个最简单的例子,画一条螺旋线。这条线在XY平面做圆周运动,同时高度Z随时间线性增加,是展示plot3的经典案例:
t = 0:pi/50:10*pi; % 参数t,从0到10π,步长很小让曲线光滑
x = sin(t);
y = cos(t);
z = t; % Z坐标随t线性增长
figure('Position', [100, 100, 800, 600]) % 设置下图形窗口大小
plot3(x, y, z, 'b-', 'LineWidth', 2) % ‘b-’蓝色实线,线宽加粗
grid on; % 打开网格,在三维图里特别重要,有助于判断空间位置
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
title('三维螺旋线示例');
view(30, 30); % 设置视角,第一个是方位角,第二个是仰角,这个角度比较经典
运行这段代码,你会看到一个蓝色的螺旋线从底部盘旋而上。grid on和xlabel这些命令和二维绘图完全一样,只是多了个zlabel。view命令可以让你旋转这个三维图形,找到最好的观察角度,后面我们会详细讲。
这里有个新手常踩的坑:plot3画的是线,所以X, Y, Z必须是向量。如果你手头的数据是矩阵,比如X是一个10x10的矩阵,直接plot3(X,Y,Z)会画出10条线(默认按列画)。如果你想画单条线,必须确保输入是向量。这个和plot处理矩阵数据的行为是一致的。
2.2 进阶技巧:美化与多线条绘制
只会画一条线当然不够。在实际报告中,我们经常需要同时对比多条轨迹,或者用不同的样式区分不同的数据系列。plot3完全继承了plot在线条样式、颜色、标记点上的所有设定。
比如,我想同时画出上面那条螺旋线,以及一条在它附近抖动的随机轨迹,来模拟带噪声的观测数据:
t = 0:pi/20:4*pi; % 这次参数点少一些,看得清楚
x1 = sin(t);
y1 = cos(t);
z1 = t;
% 生成一条带随机扰动的类似轨迹
noise = 0.1 * randn(size(t)); % 小幅高斯噪声
x2 = sin(t) + noise;
y2 = cos(t) + noise;
z2 = t + 0.5*noise;
figure;
hold on; % 关键!保持当前图形,允许多次plot3叠加
plot3(x1, y1, z1, 'r-o', 'LineWidth', 1.5, 'MarkerSize', 6, 'MarkerFaceColor', 'r');
plot3(x2, y2, z2, 'b--s', 'LineWidth', 1, 'MarkerSize', 5, 'MarkerFaceColor', 'c');
hold off;
grid on; box on; % box on 给坐标轴加个框,看起来更规整
xlabel('X'); ylabel('Y'); zlabel('Z');
legend('理想螺旋线', '带噪声观测', 'Location', 'best');
title('多条

5万+

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



