第4章 MATLAB数据可视化:二维绘图与图形属性设置

数据可视化,说白了就是让数字说话。我做了这么多年仿真,最深的体会就是:一张好图,胜过千言万语。你算出一堆数据,密密麻麻的数字堆在那儿,谁也看不出门道。但只要你把它画成曲线、散点、柱状图,趋势、异常、规律,一眼就明白了。

这一章,我们就来聊聊MATLAB里最常用的二维绘图工具。嗯,别小看这些基础操作,我见过太多人栽在细节上。

本章核心脉络:从原始数据 → 选择图表类型 → 设置图形属性 → 导出高质量图片。每一步都有坑,我们一个一个踩过去。

数据可视化 二维绘图 绘图类型 plot 折线 scatter 散点 bar 柱状 图形属性设置 颜色/线型/标记 坐标轴/标题/图例 字体/网格/背景 图形保存与导出 saveas / print 导出格式选择 分辨率设置

4.1 三大基础绘图函数:plot / scatter / bar

MATLAB的绘图函数,其实就三板斧。你把这三种用熟了,90%的场景都能应付。

4.1.1 plot —— 最常用的折线图

plot函数,我估计是每个MATLAB用户第一个接触的绘图命令。它的基本用法很简单:

x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);

这就画出了一条正弦曲线。但如果你只会这么用,那可就亏了。plot的真正威力在于它的多数据叠加能力。

我的小技巧:我在做控制系统仿真时,经常需要把参考信号和实际输出画在一起对比。用 plot(x, y1, x, y2, 'r--') 一行代码就能搞定,省时省力。

多线绘制示例:

x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x, y1, 'b-', x, y2, 'r--');
legend('sin(x)', 'cos(x)');

4.1.2 scatter —— 散点图,看分布

散点图,说白了就是看数据点的分布规律。我当年做传感器数据校准,全靠散点图发现了一个异常漂移的传感器——那要是用折线图,根本看不出来。

x = randn(100, 1);
y = 2*x + randn(100, 1)*0.5;
scatter(x, y, 'filled');

scatter函数还有个好处:你可以通过第三个参数控制点的大小,第四个参数控制颜色。这在展示多维数据时特别有用。

scatter(x, y, 50, y, 'filled');  % 点的大小固定50,颜色随y值变化
colorbar;  % 显示颜色条

4.1.3 bar —— 柱状图,比大小

柱状图最适合展示分类数据的对比。比如不同方案的性能指标、不同月份的销量等等。

categories = {'方案A', '方案B', '方案C', '方案D'};
values = [85, 92, 78, 88];
bar(values);
set(gca, 'XTickLabel', categories);

注意:我曾经犯过一个低级错误——用bar画连续数据。柱状图强调的是离散对比,如果你数据点太多(比如超过20个),柱子挤在一起根本看不清。这时候就该用plot或者scatter了。

4.2 图形属性设置——让图变得专业

说实话,MATLAB默认的图形样式,嗯……有点丑。字体太小、线条太细、背景色刺眼。你想想看,如果你把这样的图贴到论文或者报告里,评审老师第一印象就不好。

我个人习惯,每次画图都会做三件事:调字体、改线宽、加网格

4.2.1 颜色、线型、标记点

plot函数中,你可以用字符串快速指定样式:

符号 含义 符号 含义 符号 含义
b 蓝色 - 实线 o 圆圈标记
r 红色 -- 虚线 * 星号标记
g 绿色 : 点线 s 方形标记
k 黑色 -. 点划线 ^ 三角标记

组合使用示例:

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

4.2.2 坐标轴、标题、图例

这些是图的灵魂。没有标题和坐标轴标签的图,别人根本看不懂你在画什么。

xlabel('时间 (s)');
ylabel('幅值');
title('正弦信号响应曲线');
legend('输入信号', '输出信号');
grid on;  % 加网格,我强烈推荐

避坑指南:我曾经在项目汇报时,因为图例和曲线颜色对不上,被领导当众质疑。后来我养成了一个习惯:画完图先 legend 看一眼,确认颜色匹配。另外,grid on 一定要加,网格线能帮你快速定位数据点的数值。

4.2.3 精细控制:set函数

如果你对默认样式不满意,可以用set函数做精细调整。这是专业绘图的必经之路。

h = plot(x, y, 'b-', 'LineWidth', 2);
set(gca, 'FontSize', 12, 'FontName', 'Times New Roman');
set(gcf, 'Color', 'white');  % 把背景改成白色,适合打印

常用的gca(当前坐标轴)属性:

  • XLim / YLim:设置坐标轴范围
  • XTick / YTick:设置刻度位置
  • Box:是否显示边框('on' / 'off'

4.3 图形保存——别让你的心血白费

图画好了,怎么保存?很多人直接截图,结果放到论文里一放大就糊了。嗯,这里面的门道不少。

4.3.1 saveas 和 print

saveas最简单,但质量一般:

saveas(gcf, 'myfigure.png');  % 保存为PNG
saveas(gcf, 'myfigure.fig');  % 保存为FIG格式,可再次编辑

print函数更强大,可以控制分辨率和格式:

print(gcf, 'myfigure', '-dpng', '-r300');  % 300 DPI的PNG
print(gcf, 'myfigure', '-depsc', '-r600'); % 600 DPI的EPS(适合LaTeX)

重要提醒:如果你要投稿或者写论文,千万不要用截图。截图默认72 DPI,放大全是锯齿。我一般用 -r600 导出,虽然文件大一点,但清晰度完全不是一个级别。

4.3.2 导出格式怎么选?

格式 适用场景 优点 缺点
.fig 继续编辑 保留所有属性 需要MATLAB才能打开
.png 网页、PPT 通用性强 有损压缩
.eps LaTeX论文 矢量图,无限放大 文件较大
.pdf 报告、打印 矢量,跨平台 部分软件兼容性差

4.4 一个完整的绘图示例

说了这么多,我们来个完整的例子。这是我做PID控制器阶跃响应仿真时常用的绘图模板:

% 生成数据
t = 0:0.01:10;
y1 = 1 - exp(-t);          % 一阶系统
y2 = 1 - exp(-t).*cos(2*t); % 二阶系统

% 绘图
figure('Position', [100, 100, 600, 400]);
plot(t, y1, 'b-', 'LineWidth', 2); hold on;
plot(t, y2, 'r--', 'LineWidth', 2); hold off;

% 属性设置
xlabel('时间 (s)', 'FontSize', 12);
ylabel('响应幅值', 'FontSize', 12);
title('阶跃响应对比', 'FontSize', 14, 'FontWeight', 'bold');
legend('一阶系统', '二阶系统', 'Location', 'southeast');
grid on;
set(gca, 'FontSize', 11, 'Box', 'on');

% 保存
print(gcf, 'step_response', '-dpng', '-r300');
disp('图片已保存为 step_response.png');

这段代码,我几乎每个项目都会用到。你把它存成一个脚本,以后改改数据就能直接用,效率翻倍。

总结一下:二维绘图这件事,说难不难,说简单也不简单。关键是养成好习惯——数据要清晰、样式要专业、保存要高质量。做到这三点,你的图就能从「能看」变成「好看」。


公众号:蓝海资料掘金营,微信deep3321