MATLAB 绘图工作台:标准流程与本机坑位
MATLAB 绘图工作台:标准流程与本机坑位
生成日期 2026-11-07 本机 MATLAB 23.2.0.2365128 (R2023b)
本文件记录本机环境下的出图标准做法。函数清单见
01_MATLAB绘图函数总览261107.md。
一、目录结构
MATLAB绘图全集_261107/
├── code/
│ ├── list_plot_funcs.m 清点绘图函数,生成 01 号文档
│ └── plot_template.m 出图模板(已跑通,可作为任何新图的起点)
├── docs/
│ ├── 01_MATLAB绘图函数总览261107.md
│ └── 02_绘图工作流与本机坑位261107.md
└── figures/
└── 01_示例_三相电流波形261107.png
二、标准出图流程(顺序不可变)
% 1 载入参数文件(先 clear,PP 是保留名)
clear PP
SK = fullfile(getenv('USERPROFILE'),'.workbuddy','skills','matlab-mcp','scripts');
addpath(SK);
run(fullfile(SK,'ml_plot_params.m'));
% 2 画布:100 mm 宽,高按内容取 80/95/105/140/160
f = ml_fig(PP, 100, 80);
% 3 坐标区:手工定位,右边界不超过 0.945
ax = axes('Parent', f, 'Position', [0.175 0.190 0.770 0.755]);
% 4 画图
plot(ax, x, y, 'LineWidth', 1.0);
% 5 文字一律走 ml_tx(中文宋体 / 西文 Times,变量斜体)
xlabel(ml_tx('时间 <i>t</i> / ms'));
ylabel(ml_tx('相电流 <i>i</i> / A'));
% 6 导出:必须用 print,不能用 exportgraphics
print(f, png, '-dpng', '-r300');
% 7 四边留白自检(阈值 8 px)
ml_chkpng(png, 8);
第 6 步为什么必须用 print:exportgraphics 按内容紧裁剪,100 mm 会变成约 92.6 mm,尺寸不可控。
第 7 步之后还要肉眼看图:像素自检只能发现贴边与裁切,发现不了图例压曲线、标签重叠、曲线被 ylim 截断。
三、本机实测的四个坑
坑 1:中文文件名的 .m 脚本无法执行
错误: 文本字符无效。请检查不受支持的符号、不可见的字符或非 ASCII 字符的粘贴。
MCP 调用时会在脚本名前拼一行代码,中文文件名在这一步被当成代码解析。
处理:脚本名一律英文(plot_template.m、list_plot_funcs.m);
图片名与文档名仍用中文(走 print 与 fprintf,不受此限制)。
坑 2:exist(name,'file') 对内置函数返回 0
exist('plot','file') % → 0 ✗ 不能用它判断
exist('plot') % → 5 ✓
which('plot') % → built-in (...) ✓
清点函数时若用 exist(...,'file')>0,会把 plot、axes、figure、line、patch、fill、
rectangle、semilogx、drawnow 这些最基础的内置函数全部误判为「不存在」。
正确判据:~isempty(which(name)) 或 ismember(exist(name), [2 3 4 5 6])。
坑 3:控制系统函数是类方法,exist 同样返回 0
bodeplot、nyquistplot、rlocusplot、stepplot、sigmaplot、pzplot、lsimplot
的实际路径形如:
toolbox\shared\controllib\engine\@DynamicSystem\bodeplot.m
它们是 DynamicSystem 的类方法,exist 返回 0,但 bodeplot(sys) 完全可用。
用 which 判断才不会漏。
坑 4:ml_style_legend 必须传 PP
ml_style_legend(lg); % ✗ 报「输入参数的数目不足」
ml_style_legend(lg, PP); % ✓
函数内部要读 PP.LegendAlpha,而 PP 是脚本共享工作区的变量,函数自己的工作区看不到。
四、图例:放在坐标区内,靠留白腾位
规范:图例保持在坐标区内部,通过在数据上方预留空白带放置,不要挂到坐标区外。
做法:抬高 ylim 上限,让数据峰值与图框顶部之间空出一段,图例落在空白带里。
ylim(ax, [-160 270]); % 数据峰值 120,上限抬到 270 → 顶部留 150 单位空白带
lg = legend(ax, ml_tx({...}), 'Location','northeast');
ml_style_legend(lg, PP);
留多少才够——按图例高度反推。10 磅字号、3 个条目的竖向图例,
框高约占坐标区高度的 20~25%,对应到数据量纲就是:
顶部留白 ≥ 数据峰值 × 0.25 (或 ≥ 图例高度对应的数据量 + 10% 余量)
三相电流实例:数据 ±120(总幅 240),留 150 单位空白(占 430 范围的三分之一),
图例框底落在约 150,与峰值 120 之间还有 30 单位间隙,视觉上干净。
三个要注意的点:
- 下限不要跟着一起放大。数据最低 −120 时
ylim下限取 −160 即可,
上下都放大只会让曲线被压扁在中间。 - 图例框的
BoxFace不透明度取PP.LegendAlpha(默认半透明),
这样即使边缘擦到曲线也能看穿,比纯白框容忍度高。 - 图例放右上会压住右侧峰值时,换左上再试。左右两侧哪边数据稀疏就放哪边;
只有当两侧都满时,才考虑抬高上限。
不要做的:给 legend 设显式的 Position——那会禁用自动布局,图例会反过来压住 xlabel。
五、14 类函数的选用速查
| 要画什么 | 用哪个 |
|---|---|
| 时序波形 | plot(线型 + 标记双重编码) |
| 频谱 / 幅频 | semilogy 或 loglog + periodogram |
| 分时电价、档位 | stairs |
| 限值线 | yline / xline |
| 多方案柱状对比 | bar('grouped') |
| 分布对比 | histogram / boxchart(本机无 violinplot) |
| 二维场(温度、电位) | contourf + clabel,或 pcolor |
| 三维曲面 | surf / mesh,配 shading interp、camlight |
| 三维体数据 | slice + isosurface(无 volumeViewer,缺 IPT) |
| 矢量场 | quiver / streamslice |
| 相量、风向 | polarplot / polarhistogram / compass |
| 稳定性分析 | bode / nyquist / rlocus / margin |
| 时域响应 | step / impulse / lsim |
| 地理分布 | geoplot / geoscatter / geobubble |
六、下一步
目录与模板已就绪。需要出图时,把图型与场景告诉即可,按上述模板批量生成,
每张跑 ml_chkpng 自检并逐张肉眼看图。

浙公网安备 33010602011771号