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);
stairs 和 plot 叠在一起看,记得先画 stairs,再画 plot。因为 stairs 的线宽默认比较粗,后画会盖住前面的。
3.2 图形属性设置——让图更专业
光画出来还不够,得让它能看、好看、专业。我评审过不少学生的报告,图是画了,但坐标轴没标、单位没有、线型乱糟糟。这要是拿去给客户看,第一印象就砸了。
3.2.1 线型、颜色、标记
MATLAB 里用 plot(x, y, 'LineSpec') 来指定。比如:
plot(t, y, 'r--o'); % 红色虚线,带圆圈标记
常用的线型:- 实线,-- 虚线,: 点线,-. 点划线。
颜色:r 红,g 绿,b 蓝,k 黑。
标记:o 圆圈,+ 加号,* 星号,s 方块。
3.2.2 坐标轴与标签
这是最容易被忽略的。我要求我的团队,每张图必须有xlabel、ylabel、title,缺一不可。
xlabel('时间 (s)');
ylabel('幅度 (V)');
title('正弦波信号');
grid on; % 加网格,方便读数
还有 xlim 和 ylim,用来控制显示范围。有时候数据两端有毛刺,截掉反而更清晰。
3.2.3 图例与文本标注
多条曲线时,图例是必须的。用 legend 函数:
legend('理想信号', '实际信号', 'Location', 'northeast');
我习惯把图例放在曲线最少的角落,避免遮挡数据。另外,text 和 annotation 可以在图上加注释,比如标出峰值点。
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 个位置画图。顺序是从左到右、从上到下。
subplot(2,2,1)、subplot(2,2,2)、subplot(2,2,[3,4])。最后那个合并了下面两个格子,放一个大的频谱图,视觉效果更好。
另外,subplot 之后别忘了 hold on 和 hold 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生成网格,再用mesh或surf
好了,这一章的内容就这些。数据可视化这东西,光看没用,得动手画。你打开MATLAB,把上面的代码敲一遍,改改参数,看看效果。画多了,自然就有感觉了。