ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MATLAB图例加标题完全指南:从入门到批量绘图自动化

MATLAB图例加标题完全指南:从入门到批量绘图自动化 很多刚接触 MATLAB 绘图的朋友在画完一张包含多条曲线的图之后总会遇到一个尴尬的处境图例legend里好几个条目光靠线条颜色和线型去猜很容易搞混。更别提那种多组实验数据叠加的图如果不给图例加个总标题读者第一眼根本分不清哪个是“实验组”、哪个是“对照组”。今天这篇就专门把“legend 加标题”这件事讲透从最简单的写法到各种细节参数一次全给你捋清楚。这个功能解决的就是“多组数据视觉区分度不足”的问题。它特别适合做学术论文配图、实验对比分析、汇报演示这类场景凡是需要“看图说话”的地方一个带标题的图例都能让你的图自解释性提升一大截。我自己写论文和做汇报时几乎每个多数据集图都会用上实话说这个不起眼的小功能真的能让图的专业度上一个台阶。1. 为什么你需要给 legend 加标题先说一个最常见的场景。你有一组实验数据横轴是时间纵轴是温度曲线包括“材料 A 加热曲线”“材料 B 加热曲线”“环境温度基线”。如果只是三个条目放在图例里看图的人需要自己去读代码、对线型才能搞清楚哪条线是哪个。但如果图例上方挂一个标题写清楚“实验条件恒温 25℃湿度 60%”整张图的信息一下就完整了。再比如说你做了两组平行实验每组有三条曲线如果不分层图例里就是六个条目平铺很容易看错。可如果你把图例标题设成“对照组”或者“实验组”再从视觉上把曲线分成两种线型读者一眼就能看出层级关系。我自己在实际项目中还碰到过更麻烦的情况十几条频谱曲线叠在一张图里图例又长又乱。当时加了一个简单的 legend 标题“不同浓度下的吸收光谱”配合颜色渐变整张图的辨识度立刻提升了非常多哪怕不仔细看坐标轴也能快速抓住主信息。这类问题的本质就是当图中信息密度升高时图例不再只是“识别工具”它开始承担“分组说明”的职责。而 MATLAB 默认的图例恰恰不支持直接写分组说明这就逼着你学会手动加标题的技巧。2. 最简单的做法利用 legend 自带的 title 属性从 R2017a 版本开始MATLAB 的 legend 对象其实就默认带了一个 title 属性。你没听错就是直接内置只是很多人没用过。用法非常简单。假设你已经画好了一张图图里有两条曲线然后这么写x 0:0.1:2*pi; y1 sin(x); y2 cos(x); plot(x, y1, r-, LineWidth, 1.5); hold on; plot(x, y2, b--, LineWidth, 1.5); hold off; lgd legend(sin(x), cos(x)); lgd.Title.String 三角函数曲线;这里核心就两行先用legend(...)的返回值拿到图例对象lgd然后设置lgd.Title.String。Title是 legend 内部的一个文本对象String属性就是它显示的内容。运行之后图例上方会出现一行居中的小标题“三角函数曲线”默认字号和字体跟图例条目保持一致。如果你还想顺手调整标题的字体大小、颜色、字体类型也都很直观lgd.Title.FontSize 12; lgd.Title.FontWeight bold; lgd.Title.Color [0.2 0.2 0.2];这三个属性分别对应字号、粗细和颜色。FontWeight可以设置成bold或normal颜色用一个 1x3 的 RGB 向量表示。注意lgd.Title本身是一个文本对象所以几乎所有文本对象的属性都能用。比如FontAngle、Interpreter这类也都能直接设置。这里有几个容易踩的小坑如果lgd是直接写成legend(sin(x), cos(x))而不接收返回值那后面就没办法继续设置标题了。所以记住要加标题就一定要先把图例对象存下来。有时候你会看到别人写lgd.Title.String {标题一; 标题二}这是设置多行标题的写法用 cell 数组每行一个字符串。但需要知道多行标题在后续调格式时需要注意行的对齐方式这个我后面会展开讲。如果你用的是比较老的 MATLAB比如 R2016b 或者更早版本legend对象还没有Title这个属性。这时候就需要用另一种方式来实现这个我后面也会专门讲。3. 不只是加个标题字体、位置和样式一次搞定标题加上之后很多人会发现一个问题默认的标题排版其实有点“朴素”。好在所有相关属性都暴露出来了想要什么样的排版都能调。3.1 控制标题与图例本体之间的距离标题默认紧贴图例条目上方有时会感觉太挤。Title文本对象里有个Position属性不过直接改位置有点麻烦而且它是相对于图例的归一化坐标新手容易调乱。我个人的习惯是用一个小技巧直接在标题字符串里加换行符人为制造一点空隙lgd.Title.String {, 三角函数曲线};这样标题上方会多出一个空行视觉上就不那么局促了。这个办法虽然有点“土”但在实际调试中非常好用而且不会影响任何其他布局。3.2 调整标题在水平方向的对齐默认情况下图例标题是居中对齐的对齐方式是相对于图例框的宽度。如果你希望标题靠左或靠右可以设置lgd.Title.HorizontalAlignment left; % 可选 left、center、right这里需要说明的是这个对齐是相对于图例框的不是相对于坐标轴的。所以如果图例条目长短差异很大标题的视觉中心可能跟图例条目的中心对不齐。我试过几次这时候最简单的方法是手动改成left再配合Position微调效果反而比硬调 center 更自然。3.3 标题字体与论文排版匹配写论文的时候图的字体一般要跟正文统一。MATLAB 默认的字体有时候会跟 Word 或 LaTeX 里的字体对不上这时就需要统一设置。注意FontName要同时设置图例条目和标题要不然标题还是默认字体set(lgd, FontName, Times New Roman, FontSize, 9); lgd.Title.FontName Times New Roman; lgd.Title.FontSize 9;我写 sci 论文时习惯全图字体用Times New Roman、字号 7 到 9 pt这样导出的 PDF 放到 Word 里非常协调。3.4 调整整个图例的边框和底色有时候标题加完之后图例框显得不够突出被背景颜色“吃掉”了。可以通过修改图例对象的边框和背景来增强对比lgd.Box on; lgd.EdgeColor [0.4 0.4 0.4]; lgd.BackgroundColor w; lgd.LineWidth 0.6;这些不算标题的直接功能但标题和图例是一个整体边框设得清楚标题的可读性也会更高。尤其是做报告投到投影仪上时浅色背景加白底图例再加边框效果会好很多。3.5 图例标题涉及 LaTeX 公式MATLAB 的文本对象默认支持 TeX 语法还支持一部分 LaTeX所以即使标题要写成数学公式也没问题。用默认的Interpreter就能完成大部分需求。lgd.Title.String 频率响应曲线 $f_c$ 1 kHz; lgd.Title.Interpreter latex;注意设置Interpreter为latex后字符串中的美元符号$会被解释为公式定界符。如果写的是纯文本就必须再加一层$$包裹否则可能会显示异常。我实际测试中latex解释器对于中文支持不是很好如果标题既有中文又有公式建议用默认的tex解释器而不是latex。4. 进阶思路不用 Title 属性的老版本备选方案如果你的 MATLAB 版本比较老或者是你在别人的旧工程上修改代码可能Title属性不存在。别慌还有备选方案。4.1 用 text 和 annotation 手动造一个“图例标题”思路很简单图例不是占了一块矩形区域嘛我就在它上方对应位置放一个文本对象样式调得跟图例一致视觉上看起来就是图例标题。比如这样lgd legend(sin(x), cos(x)); % 获取图例位置 lgdPos lgd.Position; % [x y w h]相对于坐标轴的归一化位置 % 在坐标轴上方添加文本 text(lgdPos(1) lgdPos(3)/2, lgdPos(2) lgdPos(4), 三角函数曲线, ... Units, normalized, ... HorizontalAlignment, center, ... VerticalAlignment, bottom);这里的核心逻辑是lgd.Position返回一个四元素向量[x y w h]分别表示图例左下角的横坐标、纵坐标、宽度和高度单位是相对于坐标轴容器的归一化长度。用x w/2就算出了图例中心点的横坐标而y h就是图例顶部的纵坐标。再配合text函数放一个文本就能模拟出标题的效果。这个方法的好处是兼容所有版本而且文本位置可以随便挪灵活性极高。缺点是需要手动调整位置一旦图例移动了标题不会自动跟着走。4.2 用 uicontrol 和静态文本框不推荐但可行还有种更老派的搞法是用uicontrol创建一个静态文本框放在 figure 上看起来像图例标题。办法确实能实现但缺点也很明显uicontrol创建的文本不是坐标轴子对象放大缩小比例时经常错位。我试过几次除非是做非常简单的 GUI 展示否则不建议在出版级图里用这种方式。原因在于uicontrol的字体渲染跟坐标轴里的文本不一样导出的图片里字会发虚而且字号匹配很麻烦。所以这个方案我只作为备选提一下实际工作中用到的概率非常低。4.3 新版本中的简便调试方法如果是 R2017a 以后的版本还有一种“可视化操作”的办法。直接用鼠标点击图例对象图例被选中后在属性检查器Property Inspector里找到 “Title” 一栏直接填文字就行。这个方式适合懒得敲代码的人或者临时快速演示时用。不过话说回来做严谨的图表我还是推荐在代码里显式设置因为你下次重新运行脚本时也能自动复现。5. 实战案例一个带分组图例标题的完整绘图代码光说不练假把式下面这个场景是一位做材料实验的朋友遇到的他要对比两种材料在升温过程中的热重曲线每种材料测了三次平行样。用图例标题做分组效果出奇地好。我把核心代码完整写出来你可以直接套用。% 生成实验模拟数据实际使用中替换为真实数据 temp 25:5:200; % 温度从 25℃ 升到 200℃ % 材料 A 三次实验 weightA1 100 - 0.1*temp 2*randn(size(temp)); weightA2 100 - 0.12*temp 2*randn(size(temp)); weightA3 100 - 0.11*temp 2*randn(size(temp)); % 材料 B 三次实验 weightB1 100 - 0.22*temp 2*randn(size(temp)); weightB2 100 - 0.24*temp 2*randn(size(temp)); weightB3 100 - 0.23*temp 2*randn(size(temp)); % 绘制所有曲线 figure(Color, w, Units, centimeters, Position, [2 2 16 10]); hold on; hA1 plot(temp, weightA1, ro-, MarkerSize, 4, LineWidth, 1.2); hA2 plot(temp, weightA2, rs--, MarkerSize, 4, LineWidth, 1.2); hA3 plot(temp, weightA3, rd:, MarkerSize, 4, LineWidth, 1.2); hB1 plot(temp, weightB1, bo-, MarkerSize, 4, LineWidth, 1.2); hB2 plot(temp, weightB2, bs--, MarkerSize, 4, LineWidth, 1.2); hB3 plot(temp, weightB3, bd:, MarkerSize, 4, LineWidth, 1.2); hold off; % 构造分组图例 lgd legend([hA1 hA2 hA3 hB1 hB2 hB3], ... 样品1-1, 样品1-2, 样品1-3, ... 样品2-1, 样品2-2, 样品2-3, ... Location, northeast, NumColumns, 2); lgd.Title.String sprintf(升温速率 10℃/minN_2 气氛); lgd.Title.FontWeight bold; lgd.FontSize 9; lgd.Box on; lgd.EdgeColor [0.3 0.3 0.3]; % 坐标轴细节 xlabel(温度 (℃)); ylabel(剩余质量 (%)); title(); grid on; set(gca, FontName, Times New Roman, FontSize, 10);代码运行后图例上方会出现一个加粗的标题写着“升温速率 10℃/minN2 气氛”下面两列共六个条目清晰排列。通过NumColumns参数把图例分成两列大大减少了图例整体占用的高度给标题和曲线留出了更多空间。这里要特别说一个小细节sprintf配合\n换行还有_下标符号在tex解释器下都有特殊含义。如果你标题里的内容有数字下标或者斜杠要想清楚需不需要转义。最好先跑一次看看显示结果。还有一点值得提醒title()这里不是必须的。有时候前一个脚本跑过坐标轴已经有个标题新图里没清掉就会在坐标轴上方出现一长串莫名其妙的字符串。新建 figure 一般不会有这个问题但如果是在同一张图的循环里反复画就需要手动title()把它清掉。6. 别踩这些坑几个奇奇怪怪的细节问题这个功能看着简单真正用起来总有些人会踩到一些奇奇怪怪的问题。我把这些年积累的比较典型的坑集中整理一下希望能帮你省掉一些排除时间。6.1 标题被截断如果图例标题比较长比如“不同升温速率下材料的失重曲线汇总10/20/30℃/min”标题可能会超出图例框导致文字显示不全。我用过的解决办法有两个方法一动态扩大图例框。手动调整lgd.Position比如把Position(3)调大一些。但这样也会同时放大图例条目的宽度视觉效果不一定理想。方法二在标题里换行把长标题拆成两行。lgd.Title.String {不同升温速率下材料失重曲线汇总; (10/20/30 ℃/min)};一般先把标题缩短或者分行再调整位置这样效果更可控。6.2 设置的标题在下一次绘图时消失了如果你是用脚本循环批量出图很可能画出第二张图时标题还在但内容是上一张图的。追究起来很多情况下是因为在legend赋值给lgd之前上一次的图形对象没有正确删除。用cla清坐标轴而不是只 plot 新内容能避免这个问题。正确的循环写法大致这样for i 1:5 figure; plot(...); lgd legend(...); lgd.Title.String sprintf(第 %d 组实验, i); end这里每张图都是新建的 figure所以不存在残留问题。如果非要在一张图里反复刷新那记得用cla或hold off后才重新画。6.3 中文标题乱码或者方框常见于 Windows 系统上 MATLAB 默认字体不支持中文或者Interpreter选错。最简单的处理方法是设置字体为SimHei或Microsoft YaHei同时保证Interpreter不要为latexlgd.Title.FontName SimHei;我自己的经验是Linux 系统上如果没装中文字体怎么设都白搭最干脆的办法是给标题里的中文配一个Songti SC之类的 mac 字体名。如果真的要在多平台跑一样的脚本比较保险的方案是标题避免中文直接用英文比如Thermal Gravity Curves at 10C/min。6.4 Legend 标题对图例列数变化不敏感当你设置了NumColumns为 2 或更多时Title相对于整个图例框居中而图例条目是分两列分布的。如果标题长度跟条目列宽不匹配会显得有点奇怪。比如四个条目分两列标题很长有时标题的视觉重心跟条目组的重心并不重合。要调整的话有两种做法把标题的对齐方式改成left再手动设Position偏移。在标题字符串前面加几个空格强行微调居中效果。这两种方法我实际都试过效果都还可以但方法二更简单也不影响其他属性。6.5 导出图片时图例标题渲染异常有些人在导出成eps或者emf格式时发现图例标题的文字变了、丢了或者变成方框。我遇到比较多的原因是字体嵌入问题。比如 MATLAB 里显示用的是系统字体Arial导出eps时如果字体没嵌入PostScript 解释器就会用奇怪的替代字体。建议出图之前把图例和标题的字体统一设置为一个非常常见的字体最好是Helvetica或Times-Roman这样兼容性最好。同时如果导出是emf到 Word 里建议把标题的Interpreter设成默认的tex因为latex解释器在 Word 的 EMF 渲染器里经常出现字号偏差和间距问题。提示R2017a 之后的版本legend标题还可以通过lgd.Title.Visible来控制显示和隐藏。默认情况是on。如果你临时不想显示标题又不想删除原有的设置把这个属性设成off就好不用重新赋值。7. 实战扩展批量生成多图时的图例标题自动命名做大批量数据处理的时候写脚本批量出图是基本功。这里分享一种实用的自动命名方式特别适合“不同参数下的对比图”这类场景。比如你需要遍历不同的升温速率把每组数据都画成一张图并且图例标题里自动写清楚升温速率可以这样写rates [5 10 20 30]; % 不同升温速率单位 ℃/min colors lines(3); % 给三个平行样选颜色 figure(Color, w); hold on; % 模拟每种速率下测三个平行样 for k 1:length(rates) % 新一轮循环重新画图或者用 subplot figure; hold on; for s 1:3 % 生成模拟数据实际替换为 load 数据 temp 25:5:200; weight 100 - rates(k) * 0.01 * temp randn(size(temp)) * 0.5; h(s) plot(temp, weight, LineWidth, 1.2, Color, colors(s, :)); end hold off; % 设置图例标题 lgd legend(h, {平行样1, 平行样2, 平行样3}, Location, northeast); lgd.Title.String sprintf(升温速率: %d ℃/min, rates(k)); lgd.Title.FontWeight bold; xlabel(温度 (℃)); ylabel(质量百分比 (%)); box on; grid on; % 保存图片 saveas(gcf, sprintf(result_%dC_min.png, rates(k))); end这个脚本跑完之后每个速率对应一个独立的图片文件而且图例标题自动写明了速率参数后续整理报告时几乎不用再手动添加图注。唯一需要注意的是给每条曲线分配颜色时用了lines(3)这种调色板在高对比度场景下很常用比默认的r、g、b更好看一些。8. 设置图例标题的几种常见误区和纠正8.1 误区一用 title 函数添加图例标题有些新手会试图这样写legend(...); title(这是一个图例标题); % 错误这是坐标轴标题这里的title函数本质上是给坐标轴加标题而不是给图例加标题。它会把标题放在整个坐标轴的顶部而不是图例上方。很多人一开始都犯过这个错包括我自己。要分清楚几个容易混淆的概念title函数给坐标轴加标题显示在所有图形内容的上方。lgd.Title属性给图例对象加标题显示在 legend 内部。text函数在任意指定位置放文本可以模拟各种标题效果。我见过最哭笑不得的一幕是有人为了把标题显示在图例上方反复调整title的Position虽然最后看起来位置对了但坐标轴标题和图例标题本质上不是一回事一旦移动坐标轴或调整图例位置就全错位了。8.2 误区二以为必须用 latex 解释器才能显示公式用latex解释器确实能显示复杂的数学公式但对于大部分简单场景默认的tex解释器已经足够。别什么标题都上 latex因为 latex 解释器下中文兼容性很差而且在某些导出格式下容易出现渲染问题。如果想打上标、下标、希腊字母用默认的tex就能完成lgd.Title.String 温度_{max} 曲线; % 下标 lgd.Title.String 升温速率 10^2 ℃/min; % 上标 lgd.Title.String \alpha - \beta 曲线; % 希腊字母8.3 误区三在循环里不重置标题属性在循环里生成多张图第一张图设置了很粗的标题第二张图没有重新设置结果第二张图继承了第一张图的标题格式。这种“状态残留”问题在 MATLAB 里挺常见的。解决办法是要么每张图重新显式设置所有属性要么用set(lgd.Title, FontSize, 9, FontWeight, normal)先重置再设新值。养成习惯后就没这个烦恼了。9. 更进一步把 legend 标题和其他绘图技巧结合9.1 结合 subplot 实现多子图统一图例标题多子图布局的时候通常希望所有子图共用一个图例这时可以把图例放在整个 figure 的底部或右侧然后给这个图例加标题。实现方式需要借助sgtitlesuper title或者直接在 figure 上用annotation。我的习惯是给每个子图单独绘图然后在一个子图里建立图例再把图例拖到 figure 的公共位置。比如for k 1:4 subplot(2, 2, k); plot(...); end % 在所有子图之后建立公共图例 lgd legend(ax(1), ...); % 指定第一个子图为图例容器 lgd.Title.String 公共图例标题;不过说实话公共图例的定位在 subplot 里很多时候比想象中要麻烦。如果 subplot 布局比较复杂我更推荐用tiledlayout配合legend的Layout属性这个新接口对统一图例的支持做得更好。tiledlayout(2, 2); for k 1:4 nexttile; plot(1:10, rand(1, 10)); end lgd legend; lgd.Title.String 统一图例标题;R2019b 之后tiledlayout已成为推荐方案做多图排版时可以多用它。9.2 结合“半透明”图例如果图里曲线特别密图例底部的白底可能会遮挡住曲线。这时候可以把图例背景设成半透明lgd.Color [1 1 1 0.6]; % 第4个值是透明度0~1这个技巧在曲线交叉密集的工程图里非常好用能保留图例可读性的同时尽量减少遮挡。注意老版本 MATLAB 可能不支持第4个颜色分量这时可以手动设置lgd.BackgroundColor none让图例完全透明。9.3 结合 box 和网格线加了图例标题后图例框的边框自然会比无标题时稍微高一些。如果不想让边框太高可以微调Margin属性lgd.Margin 4; % 控制图例内容与边框的间距这个属性在 R2018a 之后才有默认值是 5 像素左右设为 2 或 3 可以略微压缩边框高度让整体更紧凑。10. 一个冷门但好用的技巧利用字符串数组和 cell 的混用上面提到过lgd.Title.String可以是一个字符串也可以是一个 char 数组还可以是一个 cell 数组。我想补充的是在新版本 MATLAB 中string类型已经大量使用所以下面几种写法都能生效lgd.Title.String 这是一个标题; % string 标量 lgd.Title.String {这是一个标题; 第二行}; % cell 数组 lgd.Title.String [这是一个标题; 第二行]; % string 数组用string数组时每行就是一个独立的显示行。但需要注意如果某个元素里包含\n不同版本处理会有差异建议还是用 cell 数组保证兼容。还有一个小场景如果你想在标题中混合变量和固定文本比较优雅的写法是tempRate 10; lgd.Title.String sprintf(升温速率 %d ℃/min (实验编号: %d), tempRate, expId);sprintf的格式化能力很强能拼出任意形式的标题。在批量出图、自动命名场景中这个技巧比手写拼接字符串更清晰、更不容易出错。我几乎所有自动化报告脚本里都用这种写法。11. 总结一些个人的使用习惯和建议在项目里混合使用 MATLAB 和 Python 写图已经好几年了这里也顺便聊一下跟 matplotlib 的对比。matplotlib里做图例标题非常简单比如plt.legend(titlexxx)一行搞定。而 MATLAB 的写法相对繁琐需要获取图例对象再设置Title属性。但 MATLAB 的好处是图例标题是嵌入图形对象的后续导出、缩放都很稳定不像 matplotlib 在某些渲染器下会出现图例标题跟图例框脱节的情况。实际工作中我用 MATLAB 出图时图例标题的常用场景是多条曲线代表不同分组实验组、对照组。同一组数据的不同处理方式标题写清楚处理条件。展示多次重复实验的统计曲线标题写清楚样本量和统计方法。批量生成多张图时标题自动记录参数。我通常会把“图例标题”跟“坐标轴标题”“全局标题”一起写成一个绘图小函数既能统一格式也方便后续调用修改比如整个绘图函数中把字体、图例标题位置、框线粗细都固定下来做到所有图风格一致。写论文时导出前再统一微调一次字号和线宽效率高很多。12. 完整版代码模板一个简洁的“通用带标题图例”函数最后分享一个我常用的绘图辅助函数它能自动生成一个带标题的图例。你复制过去稍微改改就能用。function lgd legendWithTitle(varargin) % legendWithTitle(条目1, 条目2, ..., Title, 图例标题, Location, best) % 返回带标题的图例对象 % 例子 % lgd legendWithTitle(sin(x), cos(x), Title, 三角函数曲线); % p inputParser; addParameter(p, Title, , ischar); addParameter(p, Location, best, ischar); addParameter(p, NumColumns, 1, isnumeric); parse(p, varargin{:}); opts p.Results; % 过滤掉传给 legend 的参数 legendArgs {}; keys {Title, Location, NumColumns}; for i 1:2:length(varargin) if ~ismember(varargin{i}, keys) legendArgs [legendArgs, varargin(i), varargin(i1)]; end end lgd legend(legendArgs{:}); lgd.Location opts.Location; if opts.NumColumns 1 lgd.NumColumns opts.NumColumns; end if ~isempty(opts.Title) lgd.Title.String opts.Title; lgd.Title.FontWeight bold; end end这个函数的作用是把常用的设置封装起来实际调用时会方便很多plot(rand(10, 2)); lgd legendWithTitle(数据1, 数据2, Title, 随机数据, Location, northeast);你可以在这个基础上继续加参数比如FontSize、Box、Color等等根据自己的绘图习惯封装成自己的一套风格模板。这比每次画图都写六七行设置代码高效得多也利于以后统一调整全论文的图例样式。13. 其他容易忽略的细节图例标题里的空格和特殊字符最后再说一个不太容易被注意到的细节图例标题里的空格。默认情况下MATLAB 的文本渲染会保留所有空格不会像 HTML 那样合并连续空格。但如果你用latex解释器连续空格会被忽略需要用~或\来转义。所以包含多个连续空格的标题在latex解释器下要格外小心。还要注意百分号%在sprintf中有特殊含义。比如你想显示“进度 100%”lgd.Title.String sprintf(进度 100%%);如果只写了%而没有第二个%sprintf会把它当成格式说明符的开头导致输出异常或者报错。这类问题在拼接文件名、标题时极易出现排查时往往让人一头雾水。遇到标题内容含符号可以先考虑用普通字符串拼接变量rateStr [进度 , num2str(100), %]; lgd.Title.String rateStr;这种方式虽然不够花哨但几乎不会踩坑适合快速验证时使用。14. 实际项目中的三个经验建议做了这么多年数据处理和图表绘制关于 legend 加标题这件事我总结了三条比较实用的经验第一条画图之前先规划好图例怎么分组。不要等图全部画完再想图例标题怎么加而要在画数据前就想清楚哪些线该归为一组标题应该写什么。这样既能保证图例标题的信息准确又能让代码结构更清晰。第二条标题文字要精炼。图例标题不是图注不是把所有实验条件都堆上去。它只是辅助读者快速识别分组一般不超过二十个字。如果条件太长建议放在副标题或正文甚至图下方的注释里不要硬塞进图例。第三条自动化和批量化场景里一定要把图例标题纳入统一的样式管理。比如整个项目所有图都用同一个字号、同一种字体加粗规则这样一个图表里就不会出现字体大小不一致的情况。我把这些参数统一放在项目开始处的全局变量里改起来非常方便FIG_FONT_NAME Times New Roman; FIG_FONT_SIZE 9; LGEND_TITLE_FONT_SIZE 10;只要改这里所有图例标题的字号都会跟着变不会再出现“这张图的标题特别大、那张图的标题特别小”的尴尬局面。如果你现在还在为多组数据图的可读性发愁强烈建议试试给图例加标题。哪怕只是加个简单的“Experiment 1”“Control”这种短词整张图的气质都会不一样。不用等需要写论文时才想起来日常画图时就养成这个习惯后面能给自己的工作省下不少麻烦。
返回列表