☰
MATLAB二维折线图规范绘制:标题、坐标轴标签与高清导出
2026/10/14 14:20:29 网站建设 项目流程

很多人在MATLAB里第一次画二维折线图都觉得很简单,无非是输入一组数据,调一下plot命令,然后图就出来了。可一旦要把这张图放进论文、答辩PPT或者项目报告里,问题就全暴露了:标题没有单位、坐标轴标签字体太小、中文显示成乱码、存出来的图片清晰度不够,甚至连x轴刻度都叠在一起看不清。这些问题都不复杂,却会让一张原本不错的图直接“降级”。

所以我想借这篇内容,认认真真把二维折线图的基础流程讲透,尤其是标题和坐标轴标签这些容易被忽视的细节。文章会从数据准备、plot常用写法、标签配置、完整实例到问题排查一步步走,适合刚开始用MATLAB的初学者,也适合那些画图总是“差不多就行”、想养成规范习惯的工程师。看完之后,你至少能自己写出一个带完整标注、排版清楚、可直接用于文档的折线图脚本。

1. 为什么二维折线图的基础操作值得单独讲

1.1 plot看着简单,门道却不少

plot命令可以说是MATLAB里最常用的可视化函数,几乎每个教程都会提。但你只要真正动手画过几张图就会发现,同样是调用plot,不同人画出来的结果差别非常大。有人画的图信息完整、排版干净,审稿人和导师一眼就能看懂数据趋势;有人画的图线条乱飞、坐标轴没有任何标注,别人看了半天也不知道纵轴代表什么。

我帮不少同学调整过绘图脚本,最常见的问题不是不会写代码,而是对图表的基本规范没有概念。一条曲线放在坐标轴上,横轴代表什么变量、单位是什么,纵轴代表什么变量、单位是什么,这些信息不是可选项,而是必须要用标题和坐标轴标签表达清楚。否则这张图的数据再漂亮也很难被人理解和引用。

换句话说,基础操作不等于“随便调用一个函数就行”,而是要把绘图时的标注工作当成和数据处理同样重要的一部分。这也是为什么这篇文章专门把标题和坐标轴标签拿出来单独讲的原因。

1.2 一个规范的折线图应该包含哪些元素

在动手绘图之前,先要有“完整图表”的概念。一张适合交付的二维折线图,通常包含以下元素:

  • 能够说明图表主题的标题;
  • 带有变量名和单位的x轴标签;
  • 带有变量名和单位的y轴标签;
  • 能区分多条曲线的图例;
  • 合适的坐标轴范围和刻度;
  • 网格线,方便读者对比具体数值。

很多人把标题和坐标轴标签当成“绘图后的附加操作”,实际上它们应该和绘图命令一起规划。比如标题不只是写一句“结果图”,而是应该说明是什么条件下的什么结果;坐标轴标签不仅要写“时间”,还要写“时间 (s)”;纵轴也不仅是“幅值”,最好是“幅值 (V)”这样的形式。我见过太多实验报告里的图,曲线数据很完整,但坐标轴上光秃秃的只有一个数字刻度,读者只能靠猜。这样的图无论处理得多精细,信息表现力都会大打折扣。

2. 绘图前的数据准备:向量、缺失值和数据类型

2.1 横纵坐标的数据形式要匹配

大多数情况下,二维折线图的数据是两组长度相同的向量:x向量代表横坐标,y向量代表纵坐标。直接写plot(x,y)就能完成绘图。但很多人没意识到的是,x和y必须保持维度一致,而且方向最好也是一致的。

我第一次给某同学调脚本时就遇到一个很典型的错误:

x = [1 2 3 4]; y = [2; 4; 6; 8]; plot(x, y);

这里x是行向量,y是列向量,MATLAB会直接报错。即使不报错,在更复杂的绘图场景里也可能因为维度问题产生意外结果。所以绘制前先用size(x)和size(y)确认一下形状,是一条很有效的习惯。

如果只提供y向量而不提供x,MATLAB会默认用1:n作为横坐标,也就是y的下标。这在数据点之间的间隔是固定且从1开始时是方便的,但如果你的横坐标是时间点或者频率值,最好还是显式给出x,避免后续修改数据时忘掉对应关系。

2.2 缺失值不能用0代替,要用NaN

折线图常常会遇到数据缺失或异常的情况。新手容易踩的坑是把缺失值填成0,结果图上出现一条突然掉到0又突然升上来的尖峰,把真实趋势完全掩盖了。在MATLAB里,想要让某一处曲线断开,正确做法是把对应位置设为NaN。

x = 0:0.5:10; y = sin(x); y(7) = NaN; % 这个位置的曲线会断开 plot(x, y, '-o');

plot命令遇到NaN会自动断开,而不是把点连起来。这对处理传感器丢点、实验中断等情况非常有用。反过来,如果因为数据处理没做好而出现了NaN,你也会从图上直观看到断线位置,这有助于反向定位原始数据的问题。

2.3 数据类型会影响绘图表现

MATLAB中数值类型比较多,double是最通用的,但有时从文件里读进来的是int8、uint16之类的整数类型,plot也可以正常绘制。需要注意的是,如果你把日期时间对象写成datetime类型,plot也能识别,但此时坐标轴刻度会被自动设置成时间格式,之后手动进行xticks时需要特别注意格式转换。

还有一个容易被忽略的点:如果数据是存储在cell数组里的字符串,比如从CSV里读出来的一列文本数字,直接plot会报错。建议先用str2double转换成数值数组。每次遇到绘图问题,先检查数据类型总没错。

3. plot的核心用法与线型颜色控制

3.1 最基本的三五种调用写法

plot函数的调用方式很灵活,掌握最常用的几种就足够日常使用了。

% 方式1:只给纵坐标 plot(y); % 方式2:横纵坐标完整给出 plot(x, y); % 方式3:一次绘制多条曲线 plot(x, y1, x, y2, x, y3); % 方式4:带线型和颜色 plot(x, y, 'r--o');

方式1适合快速预览,方式2是正式脚本里的标准写法,方式3可以避免反复使用hold on,方式4则是控制线型颜色的基本形式。我一般建议正式画图时使用方式2或方式3,因为横轴信息明确,后续添加标签和刻度也更直观。

3.2 线型、颜色与标记的组合用起来才有辨识度

一篇报告里经常要画好几条曲线放在同一张图里。如果都用同一种颜色同一种线型,读者很难区分。MATLAB提供了非常丰富的线型、颜色和标记选项,下表是最常用的一组速查:

颜色字符颜色线型格式说明标记格式说明
b蓝色-实线o圆圈
g绿色--虚线+加号
r红色:点线*星号
c青色-.点划线s正方形
m品红无无线条d菱形
y黄色^上三角
k黑色v下三角

实际使用中,可以组合成'r--o'表示红色虚线加圆圈标记。也可以不依赖这些字符,直接用属性名精确控制颜色和线宽:

plot(x, y, '-o', 'LineWidth', 1.5, 'MarkerSize', 6, ... 'MarkerFaceColor', [0.2 0.4 0.8], 'Color', [0.2 0.4 0.8]);

这样的写法更适合需要精确定制图表风格的场景。比如论文要求黑白印刷时,就应避免不同线之间只用颜色区分,而是改用不同线型和标记的组合。

3.3 多条曲线叠加时注意hold on与图例顺序

多条曲线既可以一次性写在plot里,也可以通过hold on分多次添加。二者效果类似,但有细微差别:一次性plot多条曲线时,legend会按照曲线出现顺序生成;而用hold on时,也按加入顺序排列。只要保持头脑清晰,一般不会乱。

如果某些辅助线不需要出现在图例里,设置它的HandleVisibility属性为'off'即可:

plot(x, y_aux, 'k--', 'HandleVisibility', 'off');

这样在用legend时,就可以只显示真正需要呈现的数据曲线,图例更干净。

4. 标题与坐标轴标签的完整配置指南

4.1 title函数:文本、字号、字体与位置

添加标题最直接的方式是title('文本内容')。但这个函数远不止写一行文字那么简单。如果你的图表需要说明多个信息,比如实验条件和数据来源,可以用元胞数组生成多行标题:

title({'不同温度下的响应曲线', '采样频率 100 Hz'}, 'FontSize', 14, 'FontWeight', 'bold');

这样做出来的标题是两行居中的,比把两个句子挤在一行里清晰很多。FontSize控制字号,FontWeight设为'bold'可以加粗标题,在报告里不容易被忽略。

如果标题涉及数学表达式,比如“温度变化曲线 T(t)”,更专业的做法是启用LaTeX解释器:

title('温度变化曲线 $T(t)$', 'Interpreter', 'latex');

但要注意,启用latex后,中文文本可能受影响,因为LaTeX默认字体不一定支持中文。所以有中文又有公式时,通常会把中文部分放到标题的普通文本里,公式部分用latex,或者干脆全程英文标签。我通常更推荐后者,因为国内期刊、国际期刊里英文图注都是非常普遍的。

标题的位置默认是坐标轴顶部居中,也可以通过'Position'属性微调,或者用TitleVerticalAlignment、HorizontalAlignment等属性设置对齐方式。不过绝大多数场景默认位置就足够,不必过度调整。

4.2 xlabel和ylabel:核心参数与显示效果

坐标轴标签是最容易让人忽略的地方。很多人画图后只加了标题,x轴和y轴没有任何说明。这相当于给了一张没有单位的测量记录,别人要跟着猜半天。

xlabel和ylabel的基本用法和title几乎一样:

xlabel('采样时间 (s)', 'FontSize', 12); ylabel('输出电压 (mV)', 'FontSize', 12);

这里有两个细节值得注意。第一,标签中一定要写单位。斜杠、括号、中文单位名称都可以,关键是让读者明确数值对应的物理含义。第二,ylabel默认是横向或沿y轴方向旋转的,不同版本可能展示效果不同。当你发现纵向的文字比较长、显示不下时,可以考虑旋转角度:

ylabel('输出电压 (mV)', 'Rotation', 0);

将Rotation设置为0可以让文字水平显示,适合长的y轴标签,避免文字被边缘截断。

如果要写频率、角速度、范围等带有希腊字母或上下标的单位,同样可以用LaTeX解释器:

ylabel('$\omega$ (rad/s)', 'Interpreter', 'latex', 'FontSize', 12);

这样输出的标签中会出现清晰的斜体希腊字母,专业感立刻提升。

4.3 坐标轴范围与刻度调整,让标签不拥挤

标题和标签有了,但如果刻度范围不合理,整个图依旧很乱。最典型的场景是横轴数据弧度、角度或时间戳时,默认刻度可能显示为0, 2, 4, 6这样不带单位的数字,读者无法直接对应到实际含义。这时需要手动设置坐标轴范围和刻度。

xlim([0 6.5]); ylim([-1.5 1.5]); xticks(0:pi/2:2*pi); xticklabels({'0', '$\pi/2$', '$\pi$', '$3\pi/2$', '$2\pi$'}); xtickangle(45);

先用xlim和ylim确定显示范围,再用xticks设置刻度位置,xticklabels设置每个刻度位上显示的文字,xtickangle(45)把刻度文字旋转45度,避免太长的标签互相遮挡。坐标轴刻度处理得好,数据看起来会专业很多。

我个人的习惯是:先画出默认图,再根据数据特点决定是收紧xlim还是扩展xlim。不要为了显示所有数据就让整个图充满大片空白,那样会稀释有效信息。

5. 实操:从零到一张可直接投稿的折线图

5.1 一个完整的示例脚本

说了这么多理论,实际跑一遍才有效果。下面是一个完整的绘图脚本示例,数据用正弦和余弦模拟,包含了从生成数据到导出的完整过程。

% 绘图示例:正弦与余弦曲线 clear; clc; % 生成模拟数据 x = 0:0.1:2*pi; y1 = sin(x); y2 = cos(x); % 创建图窗 figure('Position', [100 100 800 500]); % 绘制第一条曲线 plot(x, y1, '-o', 'LineWidth', 1.5, 'MarkerSize', 5, ... 'Color', [0.2 0.4 0.8]); hold on; % 绘制第二条曲线 plot(x, y2, '--s', 'LineWidth', 1.5, 'MarkerSize', 5, ... 'Color', [0.8 0.2 0.2]); hold off; % 标题与坐标轴标签 title({'正弦与余弦曲线', '模拟数据'}, 'FontSize', 14, 'FontWeight', 'bold'); xlabel('时间 (s)', 'FontSize', 12); ylabel('幅值 (V)', 'FontSize', 12); % 坐标轴范围与刻度 xlim([0 6.5]); ylim([-1.5 1.5]); xticks(0:pi/2:2*pi); xticklabels({'0', '$\pi/2$', '$\pi$', '$3\pi/2$', '$2\pi$'}); xtickangle(45); grid on; % 图例 legend({'sin(x)', 'cos(x)'}, 'Location', 'northeast'); % 导出图片 exportgraphics(gcf, 'sin_cos_plot.png', 'Resolution', 300);

如果你的MATLAB版本较老,不支持exportgraphics,也可以改用print:

set(gcf, 'PaperPositionMode', 'auto'); print(gcf, 'sin_cos_plot', '-dpng', '-r300');

注意老版本中,如果不设置PaperPositionMode,导出的图片很可能边缘空白过大或标题被截断。

5.2 执行步骤和效果说明

这段脚本的执行逻辑是:先清空工作区,生成一组从0到2π、步长0.1的横坐标x,再分别计算sin和cos,作为两条纵坐标数据。然后新建一个宽800、高500的图窗,这个比例更适合横向折线图。

第一次plot画sin曲线,用实线加圆圈标记,颜色选了一种不太刺眼的蓝。hold on允许第二条曲线叠加在同一坐标系里。第二条cos曲线用红色虚线加方块标记,与第一条区分明显。

标题部分用了两行:第一行说明图表内容,第二行说明数据来源,适合答辩或报告中使用。xlabel和ylabel都加了单位,读图的人不需要再追问“时间是什么单位”“幅值是什么单位”。

坐标轴范围方面,xlim限制到0到6.5,留了一点余量避免曲线贴边;ylim设成-1.5到1.5,让正弦峰谷不被截断。xticks把横轴刻度设置为0到2π每隔π/2一个,再用xticklabels把数字替换成π的表达形式,xtickangle(45)避免多个字符挤在一起。最后加网格线,方便判断数值位置。

图例按曲线绘制顺序写在后面,坐标轴范围之内适合放在右上角。最后用exportgraphics导出300dpi的PNG图片,这个分辨率足以满足一般投稿要求。

5.3 导出图片的关键细节

如果你用的还是print导出,有几个细节要格外注意。print是按照图形句柄导出,如果不设置PaperPositionMode为auto,它默认使用纸面布局,经常导致导出的图和屏幕上看到的不一样,标题被裁掉或两侧留白过多。所以要么用新版推荐的exportgraphics,要么在print前加一句:

set(gcf, 'PaperPositionMode', 'auto');

另外,导出矢量图时,比如投稿期刊需要eps或pdf格式,可以使用print的-depsc或-dpdf选项。矢量图的好处是无论怎么放大都不会模糊。但注意如果用latex编译论文,eps格式里的中文字体可能会出问题,所以更稳妥的做法是图表内文字统一用英文。

6. 常见问题与排查技巧实录

6.1 中文标题和坐标轴标签显示为乱码

这是最常被问起的问题。在MATLAB中,中文乱码通常不是编码问题,而是字体问题。MATLAB的默认绘图字体不一定包含中文字符集,导致在编辑器里看到中文,但图上或导出后的文件里乱码一片。

最简单的解决方法是给中文文本设置一个明确支持中文的字体:

title('实验一结果', 'FontName', 'SimHei');

如果你希望整张图都默认使用中文字体,可以在绘图前设置默认值:

set(0, 'DefaultAxesFontName', 'SimHei'); set(0, 'DefaultTextFontName', 'SimHei');

但要注意,不同操作系统自带的中文字体名不同,比如Windows常有的是SimHei、Microsoft YaHei,macOS可能是PingFang SC或者Hiragino Sans GB。如果换了一台电脑跑脚本,字体名不匹配反而又会出现问题。所以我更推荐一个折中方案:图内标签全部用英文和数字,只在文档正文中解释中文含义。很多高水平期刊的图也都是这么做的,可以一劳永逸地避开中文字体问题。

6.2 图窗弹出来但曲线不显示

这种情况比较让人抓狂。脚本运行了,图窗也弹出来了,但坐标轴里什么都没有。常见原因有三个:

  • 数据变量被清空或不存在,比如绘图命令在clear之后,变量还没生成;
  • 数据全是NaN,导致整条曲线被断开到完全看不见;
  • 绘制时使用了hold on,但后来又用clf清了图窗。

排查方法也很直接:在plot前先用disp或size确认x和y都正常;如果不是第一次运行,可以在脚本开头加上clear all,确保不会使用旧变量;如果是数据本身包含大量NaN,可以用sum(isnan(y))检查数量。

还有一种隐蔽情况是,坐标轴范围被设置得离数据太远,比如数据最大值是1,但ylim写成了[-100 100],曲线被压缩成一条几乎水平的线。如果确认数据和脚本都没问题,检查一下坐标范围设置总是没错的。

6.3 保存图片时标题和标签被截断

这个问题在我早期绘图时出现过很多次,那时候我直接在脚本里写print('-dpng', 'xx.png'),导出的图片在编辑器里看起来标题被切了一半。原因就是前面提到的PaperPositionMode没有设置好。

旧版print是遵循纸张大小和位置的,屏幕上图窗大小和纸张大小不一致,导出时便可能出现画面“位移”或“裁剪”。处理办法有两种:

  • 使用exportgraphics,它按当前图窗的实际内容导出,更符合直觉;
  • 或者在print之前设置PaperPositionMode为auto,再设置图窗的PaperPosition属性。

如果你需要让图片带透明背景或有更加精确的尺寸,还可以在导出前手动设置图窗高度和宽度,让标题和坐标轴标签在边界内拥有足够空间:

set(gcf, 'Units', 'centimeters', 'Position', [2 2 16 10]);

这样导出的图片整体比例更接近论文插图的标准。

6.4 多条曲线的图例对应错乱

图例顺序和绘图顺序有关,但也有些细节容易出错。比如你先画了曲线A,又画了辅助线B,但辅助线不希望出现在图例中;如果不设置HandleVisibility,图例就会自动包含辅助线,导致数量对不上。解决办法是给辅助线设置不进入图例:

plot(x, y_aux, 'k--', 'HandleVisibility', 'off');

还有另一种情况,你在循环里画多条曲线,每一条都用同样的plot语句,但legend写了一个固定的元胞数组,结果每次循环覆盖后图例只显示最后一条。这就要求在循环中动态更新legend条目,或者等循环结束后,使用legend指定曲线句柄和标签。例如:

h1 = plot(x, y1); h2 = plot(x, y2); legend([h1, h2], {'第一组', '第二组'});

这样能精确指定图例对应的曲线,避免顺序错乱。

7. 进阶:若干让图表更规范的小习惯

7.1 把坐标轴标签写成变量,方便批量改图

当你需要生成多张图的报告,或者同一张图要针对不同语言版本输出时,把标题和坐标轴标签定义为脚本顶部的变量会非常方便:

x_label = '时间 (s)'; y_label = '幅值 (V)'; title_text = '正弦与余弦曲线'; plot(x, y1); xlabel(x_label); ylabel(y_label); title(title_text);

之后想改成英文,只需修改顶部变量,不用在代码里逐个查找。这个习惯成本很低,但能给后续维护节省很多时间。

7.2 多子图时统一标题和坐标轴标签

如果一张图里有多个子图,可以用sgtitle添加总标题,或者在新版MATLAB中用tiledlayout统一管理坐标轴和标签。

tiledlayout(2, 1); nexttile; plot(x, y1); title('第一组'); grid on; nexttile; plot(x, y2); title('第二组'); grid on; sgtitle('共享总标题');

使用tiledlayout比旧的subplot更灵活,比如可以指定subtitle,也可以让所有子图共享同一个x轴标签,减少重复信息。建议新学MATLAB的人直接使用tiledlayout而不是subplot。

7.3 个人体会和避坑总结

我画图这几年最大的体会是,绘图脚本也要当成工具不断积累。不要每次临时去翻文档,而是把自己常用的标题格式、字体设置、导出参数整理成一个模板函数,需要时直接调用。如果你常做数据分析,这个模板能帮你省下大量时间。

另外一个很实用的建议是:每次画完图,保存源文件之前,先把图放大到100%看一眼,确认标题有没有被截断、坐标轴标签有没有遮挡、刻度文字有没有重叠。很多问题屏幕上缩小状态下都不明显,但打印或投稿时就会暴露出来。养成这个习惯之后,你发出去的报告里图的质量会有明显提升。

画图这件事,本质上不是为了画得“好看”,而是为了让数据传达得准确。标题和坐标轴标签就是数据最基础的语言,只要你愿意在细节上多花几分钟,出来的图自然会让你和读者都舒服。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询