Simulink多曲线对比图高效绘制从数据提取到样式自动化的完整方案在工程仿真与数据分析领域Simulink生成的波形对比是验证模型性能、分析参数影响的关键环节。许多工程师习惯在Simulink示波器中直接观察结果但当需要将多组仿真数据放在同一坐标系中进行专业对比时手动调整往往效率低下。本文将分享一套完整的MATLAB脚本解决方案不仅能自动提取Simulink工作区中的复杂结构体数据还能实现多曲线对比图的字体、线型、图例等样式的批量标准化设置。1. Simulink数据的高效提取与预处理Simulink示波器默认将仿真数据保存为结构体形式典型结构如d1.signals.values。面对包含数十个信号的复杂模型手动提取每个信号既繁琐又容易出错。数据结构的典型组成d1.time % 时间序列向量 d1.signals % 信号组结构体数组 ├── (1).values % 第一组信号值 ├── (2).values % 第二组信号值 └── ... % 更多信号组推荐的数据提取方法% 自动识别信号数量 numSignals length(d1.signals); % 预分配存储空间 timeData d1.time; signalData cell(1, numSignals); for i 1:numSignals signalData{i} d1.signals(i).values; end注意Simulink默认可能将多维信号存储为N×M矩阵其中M代表信号通道数。使用前应通过size()函数确认数据维度。对于包含多种参数组合的批量仿真建议使用结构体数组或表格形式组织数据参数组合仿真时间信号1数据信号2数据...Case1t1s1_1s1_2...Case2t2s2_1s2_2...2. 多曲线对比绘制的核心技巧基础绘图命令plot配合hold on虽能实现多曲线绘制但在处理大量数据时会出现性能问题和样式混乱。更专业的做法是优化绘图方案对比方法优点缺点适用场景循环hold on简单直观样式管理困难少量曲线(≤5条)plot矩阵输入单命令绘制共用x轴限制同时间基准的多信号line函数精细控制每个对象代码量较大需要动态更新的情况gobjects预分配内存效率高实现复杂超大规模数据(100条)推荐的多曲线绘制代码框架figure(Color,white,Position,[100 100 800 600]); ax axes(NextPlot,add); % 等效于hold on但更高效 % 使用ColorOrder和LineStyleOrder实现自动样式循环 ax.ColorOrder parula(numSignals); % 使用感知均匀的色图 ax.LineStyleOrder {-,--,:,-.}; % 批量绘制 hLines gobjects(1,numSignals); for k 1:numSignals hLines(k) plot(ax, timeData, signalData{k}); end3. 专业级样式自动化配置方案学术出版和工程报告对图表样式有严格要求特别是中英混排时的字体一致性。传统方法需要手动设置每个文本对象而自动化脚本可大幅提升效率。字体统一配置函数function setAxesStyle(ax, fontName, fontSize) % 设置坐标轴统一样式 % ax: 坐标轴句柄 % fontName: 首选字体如Times New Roman % fontSize: 基准字号 % 坐标轴标签和刻度 set(ax, FontName, fontName, FontSize, fontSize); % 标题设置支持中英文自动检测 titleObj get(ax, Title); set(titleObj, FontName, fontName, FontSize, fontSize*1.2); % 坐标轴标签 xlabelObj get(ax, XLabel); ylabelObj get(ax, YLabel); set([xlabelObj, ylabelObj], FontName, fontName, FontSize, fontSize); % 图例如果存在 if ~isempty(ax.Legend) set(ax.Legend, FontName, fontName, FontSize, fontSize*0.9); end end样式配置参数表元素属性推荐值图形窗口Color[1 1 1] (纯白背景)Position[100 100 800 600] (适中尺寸)坐标轴Boxon (封闭边框)GridLineStyle: (虚线网格)线条LineWidth1.5-2.5 (印刷级粗细)文本Interpretertex (支持特殊符号)4. 完整自动化脚本实现与实战案例将上述技术整合为可直接调用的函数以下是一个经过工程验证的完整解决方案simulinkPlotter.m主函数function [fig, ax] simulinkPlotter(dataStruct, varargin) % SIMULINKPLOTTER 自动化绘制Simulink多曲线对比图 % [fig, ax] simulinkPlotter(d1) 绘制d1结构体中的所有信号 % 可选参数 % FontName - 指定字体默认Times New Roman % FontSize - 基准字号默认10 % LineWidth - 线宽默认1.8 % ColorMap - 色图名称默认parula % 参数解析 p inputParser; addParameter(p, FontName, Times New Roman, ischar); addParameter(p, FontSize, 10, isnumeric); addParameter(p, LineWidth, 1.8, isnumeric); addParameter(p, ColorMap, parula, ischar); parse(p, varargin{:}); % 数据提取 timeData dataStruct.time; numSignals length(dataStruct.signals); signalData cellfun((x) x.values, num2cell(dataStruct.signals), UniformOutput, false); % 创建图形 fig figure(Color,white, Position,[100 100 800 600]); ax axes(NextPlot,add, Box,on, GridLineStyle,:); % 设置样式循环 ax.ColorOrder feval(p.Results.ColorMap, numSignals); ax.LineStyleOrder {-,--,:,-.}; % 绘制曲线 hLines gobjects(1,numSignals); legendText cell(1,numSignals); for k 1:numSignals hLines(k) plot(ax, timeData, signalData{k}, LineWidth,p.Results.LineWidth); legendText{k} sprintf(Signal %d,k); end % 自动图例根据信号名称优化 try legend(ax, legendText, Location,best); catch warning(Legend creation failed); end % 应用字体样式 setAxesStyle(ax, p.Results.FontName, p.Results.FontSize); % 自动调整坐标范围 xlim(ax, tight); yRange get(ax, YLim); ylim(ax, [yRange(1)-0.05*diff(yRange), yRange(2)0.05*diff(yRange)]); end实战应用示例% 加载Simulink仿真数据 load(motor_simulation.mat); % 基础调用 [fig1, ax1] simulinkPlotter(d1); % 高级配置中文混排场景 [fig2, ax2] simulinkPlotter(d1, ... FontName, Microsoft YaHei, ... FontSize, 11, ... ColorMap, jet); xlabel(ax2, 时间 (s)); ylabel(ax2, 电流 (A)); title(ax2, 三相电机电流波形);对于需要导出出版级图片的情况推荐增加以下设置exportgraphics(fig1, comparison.pdf, ... ContentType,vector, ... Resolution,600);
Simulink示波器数据怎么用MATLAB画多曲线对比图?一个脚本搞定字体和样式
Simulink多曲线对比图高效绘制从数据提取到样式自动化的完整方案在工程仿真与数据分析领域Simulink生成的波形对比是验证模型性能、分析参数影响的关键环节。许多工程师习惯在Simulink示波器中直接观察结果但当需要将多组仿真数据放在同一坐标系中进行专业对比时手动调整往往效率低下。本文将分享一套完整的MATLAB脚本解决方案不仅能自动提取Simulink工作区中的复杂结构体数据还能实现多曲线对比图的字体、线型、图例等样式的批量标准化设置。1. Simulink数据的高效提取与预处理Simulink示波器默认将仿真数据保存为结构体形式典型结构如d1.signals.values。面对包含数十个信号的复杂模型手动提取每个信号既繁琐又容易出错。数据结构的典型组成d1.time % 时间序列向量 d1.signals % 信号组结构体数组 ├── (1).values % 第一组信号值 ├── (2).values % 第二组信号值 └── ... % 更多信号组推荐的数据提取方法% 自动识别信号数量 numSignals length(d1.signals); % 预分配存储空间 timeData d1.time; signalData cell(1, numSignals); for i 1:numSignals signalData{i} d1.signals(i).values; end注意Simulink默认可能将多维信号存储为N×M矩阵其中M代表信号通道数。使用前应通过size()函数确认数据维度。对于包含多种参数组合的批量仿真建议使用结构体数组或表格形式组织数据参数组合仿真时间信号1数据信号2数据...Case1t1s1_1s1_2...Case2t2s2_1s2_2...2. 多曲线对比绘制的核心技巧基础绘图命令plot配合hold on虽能实现多曲线绘制但在处理大量数据时会出现性能问题和样式混乱。更专业的做法是优化绘图方案对比方法优点缺点适用场景循环hold on简单直观样式管理困难少量曲线(≤5条)plot矩阵输入单命令绘制共用x轴限制同时间基准的多信号line函数精细控制每个对象代码量较大需要动态更新的情况gobjects预分配内存效率高实现复杂超大规模数据(100条)推荐的多曲线绘制代码框架figure(Color,white,Position,[100 100 800 600]); ax axes(NextPlot,add); % 等效于hold on但更高效 % 使用ColorOrder和LineStyleOrder实现自动样式循环 ax.ColorOrder parula(numSignals); % 使用感知均匀的色图 ax.LineStyleOrder {-,--,:,-.}; % 批量绘制 hLines gobjects(1,numSignals); for k 1:numSignals hLines(k) plot(ax, timeData, signalData{k}); end3. 专业级样式自动化配置方案学术出版和工程报告对图表样式有严格要求特别是中英混排时的字体一致性。传统方法需要手动设置每个文本对象而自动化脚本可大幅提升效率。字体统一配置函数function setAxesStyle(ax, fontName, fontSize) % 设置坐标轴统一样式 % ax: 坐标轴句柄 % fontName: 首选字体如Times New Roman % fontSize: 基准字号 % 坐标轴标签和刻度 set(ax, FontName, fontName, FontSize, fontSize); % 标题设置支持中英文自动检测 titleObj get(ax, Title); set(titleObj, FontName, fontName, FontSize, fontSize*1.2); % 坐标轴标签 xlabelObj get(ax, XLabel); ylabelObj get(ax, YLabel); set([xlabelObj, ylabelObj], FontName, fontName, FontSize, fontSize); % 图例如果存在 if ~isempty(ax.Legend) set(ax.Legend, FontName, fontName, FontSize, fontSize*0.9); end end样式配置参数表元素属性推荐值图形窗口Color[1 1 1] (纯白背景)Position[100 100 800 600] (适中尺寸)坐标轴Boxon (封闭边框)GridLineStyle: (虚线网格)线条LineWidth1.5-2.5 (印刷级粗细)文本Interpretertex (支持特殊符号)4. 完整自动化脚本实现与实战案例将上述技术整合为可直接调用的函数以下是一个经过工程验证的完整解决方案simulinkPlotter.m主函数function [fig, ax] simulinkPlotter(dataStruct, varargin) % SIMULINKPLOTTER 自动化绘制Simulink多曲线对比图 % [fig, ax] simulinkPlotter(d1) 绘制d1结构体中的所有信号 % 可选参数 % FontName - 指定字体默认Times New Roman % FontSize - 基准字号默认10 % LineWidth - 线宽默认1.8 % ColorMap - 色图名称默认parula % 参数解析 p inputParser; addParameter(p, FontName, Times New Roman, ischar); addParameter(p, FontSize, 10, isnumeric); addParameter(p, LineWidth, 1.8, isnumeric); addParameter(p, ColorMap, parula, ischar); parse(p, varargin{:}); % 数据提取 timeData dataStruct.time; numSignals length(dataStruct.signals); signalData cellfun((x) x.values, num2cell(dataStruct.signals), UniformOutput, false); % 创建图形 fig figure(Color,white, Position,[100 100 800 600]); ax axes(NextPlot,add, Box,on, GridLineStyle,:); % 设置样式循环 ax.ColorOrder feval(p.Results.ColorMap, numSignals); ax.LineStyleOrder {-,--,:,-.}; % 绘制曲线 hLines gobjects(1,numSignals); legendText cell(1,numSignals); for k 1:numSignals hLines(k) plot(ax, timeData, signalData{k}, LineWidth,p.Results.LineWidth); legendText{k} sprintf(Signal %d,k); end % 自动图例根据信号名称优化 try legend(ax, legendText, Location,best); catch warning(Legend creation failed); end % 应用字体样式 setAxesStyle(ax, p.Results.FontName, p.Results.FontSize); % 自动调整坐标范围 xlim(ax, tight); yRange get(ax, YLim); ylim(ax, [yRange(1)-0.05*diff(yRange), yRange(2)0.05*diff(yRange)]); end实战应用示例% 加载Simulink仿真数据 load(motor_simulation.mat); % 基础调用 [fig1, ax1] simulinkPlotter(d1); % 高级配置中文混排场景 [fig2, ax2] simulinkPlotter(d1, ... FontName, Microsoft YaHei, ... FontSize, 11, ... ColorMap, jet); xlabel(ax2, 时间 (s)); ylabel(ax2, 电流 (A)); title(ax2, 三相电机电流波形);对于需要导出出版级图片的情况推荐增加以下设置exportgraphics(fig1, comparison.pdf, ... ContentType,vector, ... Resolution,600);