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 单位间隙,视觉上干净。

三个要注意的点:

  1. 下限不要跟着一起放大。数据最低 −120 时 ylim 下限取 −160 即可,
    上下都放大只会让曲线被压扁在中间。
  2. 图例框的 BoxFace 不透明度取 PP.LegendAlpha(默认半透明),
    这样即使边缘擦到曲线也能看穿,比纯白框容忍度高。
  3. 图例放右上会压住右侧峰值时,换左上再试。左右两侧哪边数据稀疏就放哪边;
    只有当两侧都满时,才考虑抬高上限。

不要做的:给 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 自检并逐张肉眼看图。

posted @ 2026-11-09 00:02  小青蛙电气  阅读(12)  评论(0)    收藏  举报