3、MATLAB数据可视化:二维绘图、图形属性、多子图与三维绘图基础

数据可视化,说白了就是让数字开口说话。我做了这么多年通信仿真,最深的体会就是:一张好图,胜过千行代码。你算出来的误码率再漂亮,不如画一条曲线直观。今天咱们就聊聊MATLAB里那些最常用的绘图工具。

3.1 二维绘图三剑客:plot、stem、stairs

这三个函数,我几乎每天都在用。它们各有各的脾气,选对了事半功倍。

3.1.1 plot——连续信号的标配

plot 是最基础的,画连续曲线。比如你仿真了一个正弦波,想看看长什么样:

t = 0:0.01:2*pi;
y = sin(t);
plot(t, y);

嗯,就这么简单。但我要提醒你——点要够密。我见过有人用 t = 0:0.5:2*pi,画出来跟锯齿似的,还问我为什么波形不对。你想想看,采样定理告诉我们,采样率不够,信号就失真了。

3.1.2 stem——离散信号的专属

stem 画的是离散点,每个点带一根竖线。做数字信号处理时,这玩意儿特别好用。比如你画一个单位脉冲序列:

n = -5:5;
x = [zeros(1,5), 1, zeros(1,5)];
stem(n, x);

我个人习惯,在展示数字调制符号或者滤波器系数时,一定用 stem。用 plot 连起来反而会误导人,以为中间有值。

3.1.3 stairs——阶梯信号的利器

stairs 画的是阶梯图,适合展示零阶保持的信号。比如DAC输出的模拟信号,其实就是阶梯状的。我在做基带波形生成时,经常用它来对比理想波形和实际波形。

t = 0:0.1:10;
y = round(sin(t));  % 量化后的信号
stairs(t, y);
我的小技巧: 如果你想把 stairsplot 叠在一起看,记得先画 stairs,再画 plot。因为 stairs 的线宽默认比较粗,后画会盖住前面的。

3.2 图形属性设置——让图更专业

光画出来还不够,得让它能看、好看、专业。我评审过不少学生的报告,图是画了,但坐标轴没标、单位没有、线型乱糟糟。这要是拿去给客户看,第一印象就砸了。

3.2.1 线型、颜色、标记

MATLAB 里用 plot(x, y, 'LineSpec') 来指定。比如:

plot(t, y, 'r--o');  % 红色虚线,带圆圈标记

常用的线型:- 实线,-- 虚线,: 点线,-. 点划线。
颜色:r 红,g 绿,b 蓝,k 黑。
标记:o 圆圈,+ 加号,* 星号,s 方块。

我曾经踩过的坑: 在一张图上画了6条曲线,用了6种不同的颜色和线型。结果打印出来是黑白的,全混在一起了。后来我学乖了——用不同的标记形状,即使黑白打印也能区分。

3.2.2 坐标轴与标签

这是最容易被忽略的。我要求我的团队,每张图必须有xlabel、ylabel、title,缺一不可。

xlabel('时间 (s)');
ylabel('幅度 (V)');
title('正弦波信号');
grid on;  % 加网格,方便读数

还有 xlimylim,用来控制显示范围。有时候数据两端有毛刺,截掉反而更清晰。

3.2.3 图例与文本标注

多条曲线时,图例是必须的。用 legend 函数:

legend('理想信号', '实际信号', 'Location', 'northeast');

我习惯把图例放在曲线最少的角落,避免遮挡数据。另外,textannotation 可以在图上加注释,比如标出峰值点。

3.3 多子图绘制——一张图讲清楚多个故事

做通信仿真时,经常需要同时看时域波形频谱。用 subplot 把它们放在一张图里,对比起来特别方便。

subplot(2,1,1);
plot(t, y);
title('时域波形');

subplot(2,1,2);
f = linspace(-fs/2, fs/2, length(Y));
plot(f, abs(fftshift(fft(y))));
title('频谱');
xlabel('频率 (Hz)');

这里 subplot(m, n, p) 的意思是:把画布分成 m 行 n 列,在第 p 个位置画图。顺序是从左到右、从上到下。

我的布局建议: 如果子图数量是奇数,比如3个,可以用 subplot(2,2,1)subplot(2,2,2)subplot(2,2,[3,4])。最后那个合并了下面两个格子,放一个大的频谱图,视觉效果更好。

另外,subplot 之后别忘了 hold onhold off。我刚开始用的时候,经常忘记 hold off,结果后面的图叠到了前面的图上,乱成一团。

3.4 三维绘图基础——从平面到立体

二维图看够了,有时候需要看看三维曲面。比如信道模型的时变特性、天线方向图,用三维图展示更直观。

3.4.1 mesh 和 surf——画曲面

mesh 画的是网格曲面,surf 画的是填充曲面。先要生成网格数据:

[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

figure;
subplot(1,2,1);
mesh(X, Y, Z);
title('mesh 网格曲面');

subplot(1,2,2);
surf(X, Y, Z);
title('surf 填充曲面');

你看,meshgrid 生成了一个二维网格,然后计算每个点上的 Z 值。这就是三维绘图的基本套路。

3.4.2 contour——等高线

有时候三维图看多了反而晕,等高线图更实用。比如看信噪比与误码率的关系,用等高线可以快速找到最优工作点。

contour(X, Y, Z, 20);  % 画20条等高线
colorbar;  % 显示颜色条

3.4.3 视角控制

三维图默认的视角不一定最好。用 view 函数调整:

view(45, 30);  % 方位角45度,仰角30度

我习惯先转一圈看看,找到最能展示数据特征的视角。有时候一个合适的角度,能让隐藏的峰值一目了然。

核心要点:
  • 连续信号用 plot,离散信号用 stem,阶梯信号用 stairs
  • 每张图必须标注坐标轴、单位、标题
  • 多子图用 subplot,注意布局和 hold 控制
  • 三维绘图先 meshgrid 生成网格,再用 meshsurf

好了,这一章的内容就这些。数据可视化这东西,光看没用,得动手画。你打开MATLAB,把上面的代码敲一遍,改改参数,看看效果。画多了,自然就有感觉了。


专注资料整理