
很多人第一次听到“MATLAB 设置legend加标题”会觉得有点绕图例就是图例为什么还要加标题其实这个功能在出图场景里非常实用。比如我画了三条温度曲线分别来自进风口、出风口和环境测点如果图例里只有“进风口、出风口、环境”这种名字看的人还得去正文里找定义但如果在图例上方加一个“夏季某工作日温度监测”的总标题整张图的信息层次一下子清晰了。今天这篇就把MATLAB里给legend加标题的几种方法、样式调整和常见坑一次说清楚。从实际需求来看这个功能适合两类人。一类是刚接触MATLAB绘图的同学每次出图都靠默认图例想做得更专业但不知道入口在哪里对着帮助文档翻半天也找不到“legendl加标题”到底怎么写。另一类是经常用MATLAB出报告、写论文的工程师和科研人员同一张图里要放多组数据图例标题能帮他们减少很多解释成本。不管你是哪一类先记住一个核心点MATLAB的legend对象自带一个Title属性而且这个Title本质上是一个Text对象。把这个关系吃透后面所有操作都顺理成章。需要特别说明这里说的“legend加标题”不是用MATLAB的title函数给坐标轴加标题而是给图例本身加一个总标题。坐标轴标题是title坐标轴标签是xlabel、ylabel两者千万别搞混。图例标题是图例框顶部那行概括性文字用来统领下面的图例条目理解了这个区别后面看代码才不会懵。1. 为什么需要给legend加标题从出图场景说起1.1 图例标题最常见的三个用途先说说我为什么强烈建议在正式报告里使用图例标题。第一个用途是给多组数据做归类。举个例子一张图里有电机在三种不同转速下的扭矩曲线图例只写“1200rpm、2400rpm、3600rpm”时读者要猜这些转速属于哪个工况如果图例顶部加上“负载工况A”信息直接在图例里就能读出来。这种场景在实验数据对比、仿真结果展示里特别常见尤其当一张图里混着好几组同类数据时一个总标题比任何颜色区分都直观。第二个用途是让论文和报告里的图更规范。很多期刊和甲方都要求图能独立表达读者不读正文也能看懂图里在讲什么。图例标题可以承载“实验条件”“采集时间”“样本编号”这类维度比如“2023年第1批样本”“方案2仿真结果”“晴天测试组”加上之后整张图的逻辑链条更完整。我见过不少投稿被审稿人打回来理由就是图例信息不完整其实加个图例标题就能解决大半问题。第三个用途是压缩信息维度。当同一张图要展示多个变量时可以在图例里用小标题区分比如把“输入端曲线”和“输出端曲线”作为两个图例标题分别配给不同子图或者在一张图上用多行图例标题表达分组关系。这样既不用为了分类单独画一张图也能把多维信息压缩在一张图里。对于科研、工程类读者来说这个小功能能省不少排版功夫也让图看起来更紧凑。1.2 先搞懂legend对象的内部结构在MATLAB里legend不是一个简单的字符串数组而是一个图形对象。以R2014b之后的版本为例执行lgd legend(...)后lgd是一个Legend对象它既有位置、边框、列数等属性也包含一组用于显示条目的子对象。其中Title属性就是存放图例标题的入口它本身又是一个Text对象。这意味着你可以像操作普通文本一样操作图例标题比如改内容、改字号、改颜色、改字体粗细甚至改数学公式解释器。这个结构带来的最大好处是灵活。lgd.Title.String存的是文本内容lgd.Title.FontSize控制字号lgd.Title.Color控制颜色lgd.Title.FontWeight控制粗细连特殊字符解释器Interpreter都可以改。很多人一开始不知道Title是Text对象只会用title(lgd,xxx)这种老办法一旦要改字体就不知道从哪下手。理解了对象关系这些问题就迎刃而解。如果对“对象—属性”这套体系不熟可以把Legend理解为一个大盒子Title是盒子顶部贴的一张标签。你要改标签上的字就得先拿到lgd.Title这个句柄再改它的String属性。这个思路和MATLAB里大部分图形对象是一致的比如坐标轴标题、colorbar标签本质上都是一样的操作方式学会了能举一反三。1.3 新旧版本兼容性别在版本上面踩坑在R2014b之前MATLAB的图形系统还没有全面转向新的对象体系当时的legend更多是以坐标轴子对象的形式存在访问方式和现在略有不同。现在最稳妥的写法是lgd.Title.String ...这个方式在R2014b及之后的版本都能正常工作也能兼容大部分新版环境。如果你不确定自己电脑上的版本可以先在命令行执行ver查看再决定用哪种写法。如果你还在用很老的版本lgd.Title可能不存在这时可以退而求其次使用title(lgd, 标题)这种形式。但老办法能设置的内容很有限字体、颜色调整都比较别扭。我个人的建议是除非单位项目对版本有硬性要求否则尽量使用新版MATLAB毕竟图形渲染和导出能力也提升了不止一点。要是实在没法升级后面第5.5节会写一个用annotation模拟图例标题的兼容方案可以临时应急。2. 设置图例标题的三种主流方法2.1 方法一创建后通过dot notation设置最推荐最推荐的方法是先创建图例对象再用点索引方式设置Title属性。看代码x 0:0.1:2*pi; y1 sin(x); y2 cos(x); figure; plot(x, y1, r-, x, y2, b--); lgd legend({sin(x), cos(x)}); lgd.Title.String 三角函数;这段代码最关键的一行是lgd legend(...)。很多新手会直接写成legend(...)不接收返回值后面又去调lgd.Title.String结果直接报错“Unrecognized property”。所以我建议所有需要后续操作的图例都要把返回值存下来。后续设置字号、颜色也同样简单比如lgd.Title.FontSize 12;。这种方式可读性最好也方便一次性批量调整多个图例标题尤其是在函数或脚本里重复使用同一套设置时维护起来非常方便。这里再补充一个细节。如果你用的是R2019b之后的版本还可以用legend(show)来根据绘图时的DisplayName自动生成图例。这种方式配合dot notation非常优雅因为图例条目的名字写在plot的DisplayName里图例标题单独写在后面职责清晰代码也好读。2.2 方法二使用title函数操作legend对象第二种方式是用title函数直接作用于图例对象。示例lgd legend({sin(x), cos(x)}); title(lgd, 三角函数);这个写法在不少老教程里能看到优点是代码简短符合“加标题”的直觉。但它的问题在于title函数默认返回一个Text对象不同MATLAB版本里对legend对象的支持程度不完全一致。而且后续如果再想改标题还是得通过lgd.Title来访问。所以我的建议是如果你只是临时加一个不带样式的标题可以用这个方法如果后面还要调字体、位置老老实实用方法一。我之前帮同事改过一段代码他用title(lgd,实验组)之后又想给标题加粗结果写了set(lgd,FontWeight,bold)发现图例条目也被加粗了并不是标题加粗。原因就是同事对set的作用对象理解错了他以为在设置标题实际上设置的是整个图例对象。这种情况用lgd.Title.FontWeight bold就不会有歧义。2.3 方法三在legend创建时直接指定标题不推荐也不否定官方文档里有一部分版本支持在调用legend时通过名称值对设置标题属性例如lgd legend({sin(x), cos(x)}, Title, 三角函数);这种写法最简洁但我在实际使用中发现不同版本之间兼容性并不理想。有些版本能正常显示有些版本会忽略Title参数或者要求必须先有lgd对象再设置。为了避免在别人电脑上跑出不一样的结果我更倾向于创建后统一用lgd.Title.String赋值。这个方法大家可以自己试但不建议作为团队交付代码的默认写法。还有一个类似的方法是使用legend对象创建后直接对Title属性做整体赋值比如lgd.Title title(三角函数);这种写法我在新版MATLAB里测试过有时候能生效但Title的值会被一个Text对象覆盖如果后续还想继续调整String或FontSize需要再重新引用lgd.Title。总体来看点索引方式才是最不容易出错的。2.4 三种方法怎么选一张表说清楚方法核心代码优点缺点dot notationlgd.Title.String ...兼容性好可继续设置字体、颜色等需要先接收legend对象title函数title(lgd, ...)简洁直观后续样式设置不如方法一方便创建时指定legend(...,Title,...)代码最短版本兼容性一般团队协作不推荐表格里看得很清楚绝大多数场景下用方法一就对了。注意第二种和第三种并不是不能用而是要看具体环境和后续需求。如果代码要发给别人复用方法一最不容易出错如果只是自己画图临时用方法二也足够。核心原则就是别为了省几行代码给后续维护埋坑。我见过不少团队代码里混用三种写法结果别人接手时根本不知道该按哪种风格改最终还是要统一到dot notation上。3. 把标题调整到出图标准字体、位置和样式3.1 字体、粗细和颜色一次讲清图例标题本质上是个Text对象所以字体相关属性都可以直接用。常见设置是这样lgd.Title.String 2023年温度数据; lgd.Title.FontSize 11; lgd.Title.FontWeight bold; lgd.Title.Color [0.15 0.15 0.15];也可以合并成一句set(lgd.Title, FontSize, 11, FontWeight, bold, Color, [0.15 0.15 0.15]);使用set的好处是当属性比较多时一眼能看到所有改动但dot notation在MATLAB的实时脚本里更容易触发自动补全减少拼写错误。两种写法没有绝对好坏我个人习惯在脚本里用dot notation在函数封装里用set因为set可以接受变量动态赋值适合批量配置。设置颜色时要注意MATLAB里的颜色值范围是0到1不是0到255所以[0.15,0.15,0.15]是深灰色而不是很多人以为的接近黑色。如果你从Photoshop里拿到的颜色值是0到255记得先除以255再填进去。这里再提一个容易被忽略的点FontSize的单位是磅point不是像素。同样一个字号在普通屏幕和高分屏上看起来大小会有差异但导出为PDF或EPS时磅值会被准确保留。所以如果你需要不同图的图例标题视觉大小完全一致设置同一个FontSize值就行不用关心屏幕显示差异。3.2 标题对齐方式和位置微调默认情况下标题会显示在图例框的顶部中间与图例条目对齐。如果你想让它左对齐或右对齐可以设置HorizontalAlignmentlgd.Title.HorizontalAlignment left;左对齐在有些排版风格里很好看尤其是当图例条目名称比较长、标题比较短的时候。右对齐相对用得少但如果图例框右边有留白也可以试试。这里要注意HorizontalAlignment影响的是标题相对于图例框的水平位置不会改变标题文字内部的对齐方式也就是说标题永远是一整块文字只是整体靠左、居中或靠右。如果默认位置还是不满意可以通过Position属性微调。标题的Position是相对于图例框的归一化坐标[0.5, 1.05, 0]这种值表示水平居中、在图例框上方一点。不过我不建议轻率地改Position因为你一旦调整了图例本身的位置或大小原标题位置可能会显得不协调。更安全的做法是用HorizontalAlignment和调整图例框大小来达到效果只有特殊排版才手动去改Position而且改完之后记得不要再随意拖动图例框。3.3 多行标题与数学公式有时候一个标题放不下需要分两行。可以用元胞数组lgd.Title.String {第一行标题, 第二行标题};这样会生成两行文字每一行是一个元素。如果需要拼接动态字符串可以用sprintf生成元胞数组或者用string数组比如[string(第1组), string(实验)]但要留意不同版本对string类型的显示差异。我自己更习惯用元胞数组因为它在所有支持Title属性的版本里表现都更稳定。如果要在标题里写数学符号可以设置解释器为TeX或LaTeXlgd.Title.Interpreter latex; lgd.Title.String $\alpha$ vs. $\beta$;需要提醒的是LaTeX解释器虽然渲染漂亮但有时候会因为字体或渲染引擎导致标题显示偏大或偏慢。如果只是写温度单位“°C”这类特殊字符默认的TeX解释器就够了直接写成温度(°C)通常能识别。如果是纯文本内容、不想让下划线被解释成下标就把Interpreter设为none。这个坑在后面问题部分会再详细说。4. 实战用真实数据完整绘制一张带图例标题的图4.1 准备数据和基本绘图下面用一个接近实际工作的例子演示完整流程。假设我们要展示某设备在夏季一天里的温度变化采集了三组数据进风口温度、出风口温度和环境温度。先用MATLAB造一组模拟数据t 0:0.5:24; % 进风口温度白天偏高晚上偏低 T_inlet 22 6*sin(2*pi*(t - 8)/24); % 出风口温度整体比进风口高3度左右 T_outlet T_inlet 3 1.5*sin(2*pi*(t - 8)/24 0.6); % 环境温度波动更平缓 T_amb 20 4*sin(2*pi*(t - 8)/24 - 0.2);三组数据分别代表了不同的测量位置如果没有图例标题光看图例里的“进风口、出风口、环境”读者还需要猜测这是什么时间、什么条件下的数据。所以下一步绘图时我会把“夏季某工作日”作为图例标题放上去让信息更完整。这里的时间范围是0到24小时模拟的是自然日全天变化正态分布一样的正弦波动在工程温度监测里很常见用来做示例非常合适。为了更贴近实际绘图前我还会把坐标轴字体、网格线这些统一配置好。这些细节虽然跟图例标题没有直接关系但会影响最终整张图的呈现效果。图例标题再漂亮如果坐标轴乱糟糟读者注意力还是会被分散。4.2 绘制曲线并添加图例标题绘制代码如下figure(Color, w); plot(t, T_inlet, r-, LineWidth, 1.8, DisplayName, 进风口); hold on; plot(t, T_outlet, b--, LineWidth, 1.8, DisplayName, 出风口); plot(t, T_amb, k-., LineWidth, 1.8, DisplayName, 环境); hold off; xlabel(时间 (h)); ylabel(温度 (°C)); grid on; lgd legend(show); lgd.Location northwest; lgd.Title.String 夏季某工作日; lgd.Title.FontSize 11; lgd.Title.FontWeight bold;这里我用了DisplayName配合legend(show)来生成图例这样写的好处是每条曲线的名字定义在绘图语句旁边后续增删曲线时不容易漏改。图例标题的设置和之前完全一样不需要额外的特殊处理。运行后图例框顶部会出现加粗的“夏季某工作日”下面依次是三条曲线对应的名称。注意location我放在了northwest也就是左上角这样不会挡住下午温度上升的主曲线。在实际项目里我一般还会顺手把图例的Box属性打开或关闭这取决于排版习惯。如果你关闭了图例边框标题依然会显示不用担心。有时候为了简洁我也用lgd.Box off只保留文字和标题整个图面会干净很多。4.3 把图例挪到绘图区外并保住标题很多报告喜欢把图例放在绘图区外部避免遮挡数据曲线。用MATLAB可以直接设置Locationset(lgd, Location, northoutside, Orientation, horizontal);这样图例会跑到坐标轴上方并且水平排列标题仍然显示在图例条目的上方。如果你希望图例在右侧外部可以用eastoutside。但要注意图例挪出绘图区后MATLAB会自动压缩坐标轴区域图例标题如果设置得太长有可能被截断。解决办法有两个要么缩短标题文字要么把图例框整体拉宽一点。手动调整时可以用lgd.Position(3) ...改宽度不过更推荐直接用Location加适度缩短标题来保持一致性。这里有一个容易踩的小坑当图例被放到图外时MATLAB有时会改变图例Title的显示位置尤其是横排图例的标题宽度方向空间被压缩后标题会显示成两行。我的处理方式是先设置Location再设置Title.String这样MATLAB会根据最终图例框的位置重新计算标题布局。如果先设置Title再挪图例标题在某些版本里可能不会跟随新位置重新对齐。4.4 导出图片前的几个检查项最终出图前我建议检查三件事。第一图例标题是否完整可见特别是使用了多行标题或LaTeX时渲染尺寸会有偏差第二图例标题的字体与坐标轴标签、主标题是否统一一般正文里图例标题字号可以保持和坐标轴标签相同或略小第三导出格式是否清晰推荐用exportgraphics导出exportgraphics(gcf, temperature_curve.png, Resolution, 300);exportgraphics是R2020a之后推荐使用的导出函数它会保留绝大多数图形对象的显示结果包括图例标题。如果用老式的saveas或print遇到某些自定义字体时可能渲染不一致导致标题位置偏移或字体变样。如果你还在用旧版本建议导出后放大图片检查一下图例标题别等放到论文里才发现有问题。除了分辨率还要注意导出时的图片范围。exportgraphics默认会严格截取当前坐标轴或图形对象的内容不会像saveas那样给周边留白。如果你的图例标题离图例框太近被切掉一半可以先把坐标轴区域稍微放大一点或者用exportgraphics(gca, ...)只导出坐标轴区域再检查一遍标题位置。5. 常见问题与排查技巧实录5.1 设置了Title.String却不显示这个问题几乎每周都能在MATLAB相关讨论区看到。最常见的原因是创建图例时没有接收返回值。如果你写的是legend({a,b}); lgd.Title.String 标题;MATLAB根本识别不了lgd这个变量自然会报错。正确做法是lgd legend(...)。另一个原因是版本太旧lgd.Title属性不可用这种情况建议参考5.5的兼容方案。还有一种隐蔽原因某些绘图模板会在创建图例后执行lgd.Visible off来隐藏图例但用户不知道Visible被关了。排查时可以先执行get(lgd, Visible)确认图例是否可见。如果图例整体可见只有标题不显示再检查lgd.Title.Visible是否为on以及String是否为空。我自己就遇到过把String设置成空字符串标题当然什么都显示不出来这种低级错误最容易发生在拼接字符串的时候。5.2 图例标题位置跑偏标题默认显示在图例框顶部居中位置。如果你发现标题跑到图例框外面尤其是图例被放在northoutside或eastoutside时多半是标题文字较长、图例框宽度不够所致。解决方法优先级从高到低是缩短标题、调小标题字号、修改HorizontalAlignment、手动微调lgd.Title.Position。建议先试前两种因为它们不会影响图例框和其他对象的位置关系。如果只是轻微偏移可以通过设置HorizontalAlignment来调整。比如希望标题在图例框内偏左就设置left然后微调Position(1)希望居中设置center后一般不需要动Position。手动设置Position遇到的最大问题是后续一旦改变图例大小标题不会自动重新对齐所以能不改就不改。而且Position的具体数值在不同版本里可能略有差异硬编码位置非常脆弱。5.3 标题里的下划线、特殊字符显示异常在MATLAB默认的TeX解释器下下划线会被当成下标起始符。比如你写a_b显示出来是a后面跟着一个下标b而不是a_b。如果标题里需要保留下划线可以这样写lgd.Title.String a\_b; lgd.Title.Interpreter tex;如果整个标题基本都是纯文本不想处理转义可以直接把解释器关掉lgd.Title.Interpreter none;关闭解释器后像°C、±这些特殊字符是否还能正确显示取决于系统字体建议实测一下。这个方法同样适用于普通坐标轴标题title图例标题只是继承了这个机制。处理特殊字符时先想清楚你使用的是TeX还是LaTeX解释器再去写转义不然很容易出现“为什么我的标题里全是奇怪的斜杠”这种困惑。5.4 批量出图时如何统一设置图例标题我经常需要在一个脚本里循环处理几十张图每张图都要设置图例标题。如果每张图都重复写几行不仅累还容易漏。更稳妥的是封装一个简单函数function setLegendTitle(fig, titleStr) lgd findobj(fig, Type, Legend); if ~isempty(lgd) lgd.Title.String titleStr; lgd.Title.FontSize 11; end end调用时直接setLegendTitle(gcf, 第1组实验)循环里就不用重复写标题设置代码了。注意如果一张图里有多个坐标轴每个坐标轴可能都有自己的图例findobj(fig,Type,Legend)会返回所有图例对象。如果你只想改当前axes下的图例可以用findobj(gca, Type, Legend)避免误改其他子图的图例。在封装函数时最好再传入字体大小参数方便不同图统一控制不需要改代码就能调样式。5.5 老版本或者特殊需求用annotation模拟图例标题如果遇到的是R2014b之前的老版本或者需要让标题完全脱离图例框自由摆放可以用annotation画一个不透明的文本框放在图例上方lgd legend({a, b}, Location, northeast); p lgd.Position; annotation(textbox, [p(1), p(2)p(4)-0.02, p(3), 0.04], ... String, 我的标题, ... EdgeColor, none, ... HorizontalAlignment, center, ... FontSize, 10);这个方案的缺点是annotation是相对于整个figure窗口定位的图例一挪动标题不会自动跟上。我在早期项目里用过几次只能把图例固定位置后才敢用。所以如果你不是被版本卡死我建议优先升级到新版本直接用lgd.Title省时省力。说句实在话给legend加标题在MATLAB里真的不是高级功能但用好了能让图的表达效率提高一个档次。我个人最深的体会是不要把注意力放在“调用哪个函数”上而是理解lgd.Title就是一个Text对象后面所有字体、颜色、解释器的操作都可以顺着这条线展开。最后再分享一个小技巧批量出报告的时候把图例标题的字号设置成和坐标轴标签一致整个图的视觉重量会更均匀审稿人和领导看了都觉得舒服。