简介:本资源是一套开箱即用的Matlab电机MAP绘制程序,面向电机控制工程师、电驱动系统研发人员及高校相关方向研究生,解决实际项目中电机效率、转矩、电流等多维性能数据难以高效可视化的问题。压缩包共3个文件(116KB),包含核心Matlab脚本(.m)用于自动读取与插值绘图、Excel格式的原始MAP数据表(.xlsx)便于替换自定义测试数据、以及生成的高分辨率效率热力图示例(.png)供效果参考。已有196人学习下载,脚本已适配多种常见电机数据结构,支持surf三维曲面、contour等高线、fill填充等多种绘图模式,无需修改即可绘制转速-转矩平面下的效率/损耗/电流分布图,并内置坐标轴标注、色条标定、插值平滑等工程实用功能,显著降低MAP图从数据到图表的实现门槛。 搞电机或者电驱系统的人,日常打交道最多的图,除了那些时间轴上的波形曲线,恐怕就是这张“转速-转矩-效率”的MAP图了。刚入行那阵子,我拿到台架测试返回的一大堆数据点,用scatter散点图糊弄了几版,结果被做系统匹配的同事吐槽说“你这图没法看,效率区域糊成一团,根本没法对比方案”。后来痛定思痛,仔细把Matlab绘图的底层逻辑捋了一遍,写了一套通用绘制程序。这篇就把这套程序的设计思路和完整实现拆开讲清楚,尤其是怎么让同一套代码不仅能画电机MAP,还能秒切到电池内阻MAP、逆变器损耗MAP这些乱七八糟的二维数据场。
1. 先搞清楚电机MAP图的本质:一张图背后是三个维度的数据
我见过不少新手拿到电机MAP图时的第一反应:这不就是个漂亮的彩色云图吗?确实,视觉上它像个云图,但如果你只把它当云图画,那大概率画出来的东西只是“好看”,而无法承载工程判断。电机MAP图在工程上有个更严谨的名字,叫效率等高线图或效率云图,本质上是用二维平面上的颜色变化来表达第三个维度的数值大小。
1.1 MAP图的数据结构:别再把XYZ散点直接怼进绘图函数
具体到Matlab里,电机MAP图的标准数据形态是:X轴为转速(通常单位是rpm,也有用rad/s的),Y轴为转矩(单位是Nm),平面上每一个坐标点对应一个效率值(0到1,或者0到100%)。
这里有个非常容易踩的坑。如果你从试验台架直接读取数据,得到的一般是类似下面这种的表格式散点数据:
| 转速(rpm) | 转矩(Nm) | 效率(%) |
|---|---|---|
| 1000 | 0 | 82.3 |
| 1000 | 20 | 88.5 |
| 1000 | 40 | 90.1 |
| 2000 | 0 | 80.2 |
| 2000 | 20 | 91.4 |
这种表格式的离散点数据,直接plot或scatter是画不出“面”的效果的。你真正需要的是一个二维矩阵,行对应转矩、列对应转速(或者反过来也行),矩阵里的值才是效率。换句话说,散点数据必须先插值网格化,变成类似:
转速向量 R = [1000, 2000, 3000, 4000, 5000]; 转矩向量 T = [0, 20, 40, 60, 80, 100]; 效率矩阵 E = [82.3, 80.2, ...; 88.5, 91.4, ...;]这种矩阵格式,Matlab的pcolor、contourf、imagesc这类函数才能直接吃进去。
1.2 为什么“完美绘制任何类型的数据”这个目标值得追求
标题里写了“完美绘制任何类型的数据”,这句不是噱头。电驱动系统开发过程中,需要画这种二维色图的地方多得超乎想象:
- 电机效率MAP:转速×转矩×效率,最经典的一张图,看高效区是否覆盖主工况区。
- 电机损耗MAP:转速×转矩×总损耗(铜耗+铁耗+机械损耗),做散热分析和峰值能力判断用。
- 电池内阻MAP:SOC×温度×内阻,BMS策略标定时必看,低温低SOC时内阻会飙升,直接影响放电功率限制。
- 逆变器损耗MAP:转速×转矩×IGBT损耗,配合电机损耗可以算系统级效率。
- NVH噪音MAP:转速×转矩×声压级或者阶次幅值,做噪音优化时用,往往要求很高的分辨率。
这些图的物理含义天差地别,但落到绘图层面,数据结构却几乎完全一致——都是X轴向量、Y轴向量、Z值二维矩阵。所以只要把这套数据规范定义好,一套绘图程序完全可以通吃。
我个人写这套程序时定的目标是:输入转速向量、转矩向量和效率矩阵,输出一张“能直接贴进技术报告”的图。也就是说,坐标轴刻度要科学、颜色条要明确、等效率线要清晰、外特性边界要体现,最好还能一键切换显示模式。
2. 数据输入的坑:三分画图,七分数据整理
写绘图程序之前,最需要花心思设计的其实是“如何把数据整理成程序能直接接收的格式”。实测中,来自台架、仿真、整车实测的数据格式千变万化,如果不做预处理,绘图代码里就得塞一堆条件分支,既不优雅也容易出bug。
2.1 三种典型输入格式的统一坐标轴策略
我最终把输入格式统一成了三种模式,分别对应不同来源的数据,在程序开头做一个标准化预处理:
模式A:完整矩阵输入。数据本身就是网格化的,转速向量R、转矩向量T、效率矩阵E(size为length(T)×length(R))齐全。这种情况最容易,直接绘图即可。
模式B:散点列表输入。从试验数据文件读出来的是三列长数据,每行对应一个工况点(转速、转矩、效率),工况点可能覆盖不全,甚至没有覆盖完整网格。这种情况必须做网格重建和插值。
模式C:矩阵+行列坐标输入。部分数据采集系统导出的是完整矩阵,但只附带起始值、步长等坐标信息。比如转速从500rpm到10000rpm,步长500rpm,共20个点;转矩从-100Nm到300Nm,步长50rpm,共9行,需要用linspace或冒号运算符生成坐标向量再拼接。
模式B比较关键,这里放一个我实际在用的散点转网格的代码片段:
function [R_grid, T_grid, E_grid] = map_data_prepare(R_raw, T_raw, E_raw, R_vec, T_vec, method) % 将散点数据映射到规则网格 % R_raw: 散点转速数据 (N×1) % T_raw: 散点转矩数据 (N×1) % E_raw: 散点效率数据 (N×1) % R_vec: 目标转速网格向量 (1×M) % T_vec: 目标转矩网格向量 (1×K) % method: 插值方法,'linear' / 'nearest' / 'cubic' [R_grid, T_grid] = meshgrid(R_vec, T_vec); % 注意:scatteredInterpolant要求输入为列向量 F = scatteredInterpolant(R_raw(:), T_raw(:), E_raw(:), method, 'linear'); % 外插值设置成NaN,避免外特性边界外出现虚假数据 F.ExtrapolationMethod = 'none'; E_grid = F(R_grid, T_grid); % 将没有数据的区域(外特性以外)设为NaN,避免画出色块 E_grid(isnan(E_grid)) = NaN; endscatteredInterpolant是处理这种散点数据最顺手的工具,比老版的griddata在性能和可控性上都强出一截。有一点值得注意:外插值一定要设成'none'。如果保留默认的线性外插,那些没测到的高速大转矩区域会被插值出一些假效率值,画进图里就会出现远超实际范围的异常色块。
2.2 转速和转矩轴的网格梯度设计
很多人在绘制MAP图时忽略了一个细节——电机台架测试的转速点和转矩点往往不是均匀分布的。比如低速工况点密一些,高速稀疏一些;转矩在小转矩区密一些,大转矩区稀疏一些。直接用原始测试点做网格,pcolor画出来的格子会宽窄不一,色块边缘参差不齐。
我的做法是:从原始测试数据里抽取唯一的转速值、转矩值,升序排列作为目标网格。不额外插值加密。比如测试有21个转速点、19个转矩点,生成的效率矩阵就是19×21,每个格子代表真实测试区域,边界清晰。这样画出的图不会因为过度插值而“显得精度很高”,但它忠实反映了原始数据密度。
另外,网格要做“边缘补点”,否则pcolor的色块边界会缩进一圈。pcolor的色块本质上画的是网格单元,如果直接用测得的离散值画,边缘那半个格子是被截断的。解决办法是在转速和转矩向量的首尾各补一个虚拟点,值可以取相邻点的值,或者干脆取相邻点的外推值。
% 边缘补点 R_plot = [R_vec(1) - (R_vec(2)-R_vec(1)), R_vec, R_vec(end) + (R_vec(end)-R_vec(end-1))]; T_plot = [T_vec(1) - (T_vec(2)-T_vec(1)), T_vec, T_vec(end) + (T_vec(end)-T_vec(end-1))]; % 对应补两行两列的数据这一步虽然看起来简单,但没有它,图片边缘就会有一条明显的“白边”,贴到报告里特别掉档次。
3. 选对绘图函数与配色:pcolor、contourf、imagesc到底该用哪个
Matlab里能画二维色图的函数不少,imagesc、imagesc、pcolor、contourf、surf都能干这事,但每个函数的行为差异是实打实的。选错函数,轻则图难看,重则数据表达失真。这里把我用下来的经验按场景对比一下。
3.1 pcolor是电机MAP绘制的首选原因
pcolor的逻辑是“以网格点为中心,把相邻点用色块填充”。它天然适配电机MAP这类数据——每个网格点都有真实的物理测量或仿真计算值,色块边界恰好就是试验工况点的边界。跟contourf相比,pcolor不会对数据做任何光滑或重建,是“所见即所得”。
但pcolor有两个经典副作用:
- 默认带网格线:尤其当网格点很多时,色块之间会出现白色细线,视觉上乱。解决办法是设
shading interp(对颜色做插值)或shading flat(去掉网格线)。 - 边缘截断:前面提到的,需要边缘补点。
我的做法是直接用pcolor(R_plot, T_plot, E_plot),然后紧跟一句shading interp。这样输出平滑无网格线,颜色过渡自然。
figure; h = pcolor(R_plot, T_plot, E_plot); set(h, 'EdgeColor', 'none'); shading interp;shading interp会对每个网格单元做双线性颜色插值,出来的视觉效果比shading flat细腻很多,尤其适合效率MAP这种渐变数据。
3.2 等效率线的叠加逻辑与层级控制
光有云图还不够,工程上还要叠等效率线。比如判断95%高效区的边界在哪、高效区是否覆盖常用巡航工况,这时候就需要contour叠加在pcolor之上。
contour和contourf的选择逻辑要分清:
contourf画的是填充等高线,如果叠在pcolor上,它会用色块覆盖掉底下的云图,除非设透明度,否则会遮住底层信息,一般不用于叠加场景。contour只画线条,不填充,适合叠加在pcolor上。我的标准做法是:
hold on; [C, hContour] = contour(R_vec, T_vec, E_grid, [80, 85, 90, 92, 94, 95, 96], 'k', 'LineWidth', 0.8); clabel(C, hContour, 'FontSize', 8, 'Color', [0.3 0.3 0.3], 'LabelSpacing', 250);clabel是自动标注等高线数值的函数,LabelSpacing参数控制标注沿曲线的间隔,单位是点。我设250左右,标注不会太密也不会太疏。等高线的线条颜色用黑色,线宽0.8,既不喧宾夺主又能清晰读值。如果你觉得全黑线条太沉闷,也可以用深灰色。
3.3 配色方案决定图的“可读性”,这几个colormap值得反复用
电机MAP这类的数据,配色方案是有讲究的。默认的parula比较均衡,蓝到黄,但从工程阅读习惯来说,我更偏向用jet系列加限制,或者用新版Matlab推荐的turbo。
turbo:Matlab R2020b之后的turbo色图,颜色分布均匀,视觉上比jet柔和,高亮区域不刺眼。作为效率MAP的默认选择没问题。jet:经典彩虹色,红橙黄绿青蓝紫,从低到高直觉对应“冷到热”。但jet有个毛病——颜色亮度不单调,红和蓝两端亮度反而高,中间绿色亮度低,人眼对颜色的感知不均匀。做报告用jet会被视觉设计师吐槽,如果你只给自己看,倒是无所谓。parula:Matlab默认色图,蓝黄渐变,色觉障碍人士也能分辨。但用在效率MAP上,蓝色低效率区域和黄色高效率区域对比度偏弱,尤其在投影上看不清晰。
我测试下来最适合电机效率MAP的是双色拼接colormap:高效率区用红色系(红-橙-黄),低效率区用蓝色系(深蓝-浅蓝),中间白色过渡。这种配色在工程报告里辨识度极高。实际实现是用colormap函数拼接两个色彩空间,或者用ColorThreshold做一个自定义色图。
% 自定义双色colormap:白-蓝渐变 + 白-红渐变 cmap_blue = [linspace(1, 0.2, 64)', linspace(1, 0.4, 64)', linspace(1, 0.8, 64)']; cmap_red = [linspace(1, 0.9, 64)', linspace(0.8, 0.2, 64)', linspace(0.8, 0.2, 64)']; cmap = [cmap_blue; cmap_red(2:end, :)]; colormap(cmap);这段代码的意思是:前半段从纯白渐变到深蓝色,后半段从纯白渐变到深红色。这样效率从低到高,颜色由蓝变白再变红,中间白区分明,一眼就能看出高效区。这个配色我用了很久,贴到任何报告里都显得专业。
4. 一套代码画出“任何类型的数据”:从电机MAP到电池、NVH数据的通用化设计
写一套程序最忌“画死了”——就是代码只适配电机效率数据,换个数据源就要大改。所以在设计阶段就要想好通用化策略。我这套程序的接口参数如下,基本做到了数据类型无关。
4.1 通用绘图函数的接口设计
function hFig = plot_map_2d(R_vec, T_vec, Z_mat, varargin) % 通用二维色图绘制(MAP图) % 输入参数: % R_vec - X轴坐标向量(例如转速) % T_vec - Y轴坐标向量(例如转矩) % Z_mat - Z值矩阵,维度为 length(T_vec)×length(R_vec) % 可选参数(Name-Value形式): % 'zlabel' : Z轴标签,默认 'Z' % 'xlabel' : X轴标签,默认 'X' % 'ylabel' : Y轴标签,默认 'Y' % 'title' : 图标题,默认空 % 'levels' : 等高线层级向量,默认 [80 85 90 92 94 95 96] % 'clabel' : 是否显示等高线标注,默认 true % 'cmap' : colormap名称或自定义矩阵,默认 'turbo' % 'nan_color': 数据为NaN区域的填充颜色,默认 [1 1 1] % 'xscale' : 'linear' 或 'log',默认 'linear' % 'mask_threshold' : 低于该阈值的区域置为NaN(可选项)这里想重点说的是mask_threshold参数的设计。电机MAP图里,转矩为零附近(或外特性边界外)实际上没有稳态工况点,这些区域往往是插值出的“空数据”。如果你不做遮盖,图上会出现一大片低效率的蓝色,甚至影响色标的自动范围。所以我在通用接口里加了阈值遮盖功能:效率低于某个值时,把对应位置设置为NaN,绘图时自动变成白色(或指定颜色)。这样画出来的图只显示有效工况区,干净利落。
4.2 数据规范化:自动识别数据的“真实范围”,避免色标误导
imagesc和pcolor都能自动根据数据的最大最小值映射颜色,但这里有个大坑——如果数据里有几个离群异常点(比如某个工况点的效率因为传感器跳变显示成120%),整个色标范围会被拉大,导致正常区域的颜色对比度被严重压缩。
我的通用程序在绘图中加入了两个处理逻辑:
- 物理范围截断。比如效率数据,把超过100%的值硬截断为100%,把低于0%的硬截断为0%。这个操作在物理上是合理的,因为效率不可能超出这个范围。
- 色标范围可调。通过
caxis(新版用clim)把色标范围固定在用户指定的区间内。比如渲染效率图时,我通常把色标范围设在50到100之间,低于50的统统一片蓝。这样高效区与低效区的色差能拉到最大,读图效率明显提升。
% 数据规范化(以效率为例) Z_mat(Z_mat > 100) = 100; Z_mat(Z_mat < 0) = 0; % 设置色标范围 clim([50, 100]);4.3 从效率MAP到损耗MAP:同一套代码的完整切换
这套通用程序我实际用过的场景包括:电机效率MAP、电机损耗MAP、电池内阻MAP(SOC-温度平面)、逆变器IGBT损耗MAP、减速器效率MAP,甚至还有座椅加热的温升云图。每种的差异只在坐标标签、色标专业着色的含义、以及色标范围。
比如画电池内阻MAP时,X轴不是转速而是SOC(荷电状态),Y轴是温度,Z轴是内阻值(mΩ),我只需要改一下函数调用的标签和色标范围,代码主体完全不用动。反过来,画电机损耗MAP时,Z值是损耗功率(单位kW),数值越小越好,那就要把色标范围倒过来设,或者把colormap翻转方向。
通用化的核心收益是:你只需要维护一份经过充分测试的绘图代码,质量稳定可靠,换数据源时不用重新画一遍、重新调一遍格式。对于经常要出图写报告的人来说,这能省下大量时间。
5. 高级美化技巧:外特性曲线、色标设置和图片导出
基础MAP图画出来了,但要让它达到“直接上传到系统、直接投进PPT”的水平,还得加几个工程上的“定制化”元素。其中最重要的就是电机外特性曲线的叠加和色标设计。
5.1 外特性曲线叠加:让转速-转矩工作区边界清晰可见
电机MAP图通常都要叠外特性曲线。外特性曲线是指电机在不同转速下能输出的最大转矩(峰值转矩),是电机工作区域的物理边界。没有这条线,光看图你会以为整个矩形区域内电机都能正常工作,但实际上矩形区域的左上角(高转矩低转速)和右下角(高转速低转矩)往往是不允许运行的。
叠加方法很简单,前提是你要有外特性数据(转速序列和对应转矩上限),然后直接plot上去:
% 外特性曲线数据(示例:峰值转矩曲线) R_ext = [0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]; T_ext = [300, 300, 300, 300, 280, 240, 200, 160, 130, 100, 70]; hold on; plot(R_ext, T_ext, 'k-', 'LineWidth', 2.5); plot(R_ext, -T_ext, 'k-', 'LineWidth', 2.5); % 电动工况和发电工况对称 hold off;如果你的电机有发电工况(转矩为负),就画负转矩外特性。有时候还要叠加峰值功率限制曲线(双曲线形状),同样用plot画上去就行。外特性曲线的线宽设置成2.5,比等高线更粗,主次分明。
5.2 色标与刻度:别让colorbar的数值“完全自动”
colorbar是MAP图的灵魂,但颜色条上显示的内容往往被很多人忽略。默认的colorbar显示的刻度是线性分布的,但效率图的色标从50到100,只有50个单位的跨度,Matlab自动会切成5个刻度:50、60、70、80、90、100。看起来还行,但如果你想强调95%以上是高效区,建议手动指定刻度。更精细的做法是:在colorbar上用一条黑色横线或者用text标注出关键阈值,比如“95%高效区”。
% 手动控制colorbar cb = colorbar; cb.Label.String = '效率(%)'; cb.Label.FontSize = 10; % 设置刻度到指定数值 cb.Ticks = [55, 60, 65, 70, 75, 80, 85, 90, 92, 94, 95, 96, 97]; cb.TickLabels = {'55','60','65','70','75','80','85','90','92','94','95','96','97'};另一个实用技巧是给色标设置“非线性映射”。比如效率数据集中分布在85到97之间,如果你线性映射到色标上,这个区间的颜色过渡不够明显。可以用pcolor里传入一个经过非线性拉伸的Z值矩阵来绘图,但把刻度标签还原成真实值。这样能夸大关注区间的颜色变化,不过做这种图时要格外小心,如果看图的人不知道坐标是非线性映射的,会误读数据,所以我在实际报告中一般不用,除非特别说明。
5.3 图形导出:直接输出高清图片,避免另存为时画质缩水
在Matlab里画完图,很多人喜欢直接点figure窗口的“保存”,这样出来的图清晰度往往不够,尤其是往Word或PPT里贴的时候,会出现毛边与锯齿。我推荐的导出方案是:
% 设置导出尺寸与分辨率 set(gcf, 'PaperPositionMode', 'auto'); set(gcf, 'Position', [100 100 800 600]); print(gcf, '图1_电机效率MAP.png', '-dpng', '-r300');-r300指定DPI为300,做印刷或高清汇报足够了。如果你想要矢量图以备后续在矢量编辑软件中加工,就用-depsc或-dsvg。注意:导出之前在figure窗口里先set(gcf,'Color','w')把背景设为白色,否则默认浅灰色背景会留一圈难看的边框。
6. 边界问题与异常数据处理:画出“干净图”的最后一道防线
到这里,绘制主流程已经完整了,但还有一类问题几乎每个用过我这套程序的人都会遇到——异常数据的处理。这部分单独拿出来说,因为处理不好,会直接影响成图质量,甚至误导决策。
6.1 测试数据里的“坑点”:空值、跳变值、超界值怎么办
台架实测的MAP数据里,经常会出现三类脏数据:
空值(NaN)。由于测点缺失、传感器故障或者外特性边界外区域未测量,数据文件里会有大量NaN。如果直接绘图,pcolor会把NaN显示成空洞,contour碰到NaN可能会断裂。最稳妥的做法是:在插值阶段就处理掉NaN——把NaN数据点剔除后再scatteredInterpolant,而不是把NaN直接扔给插值函数。插值后网格上仍然可能残留NaN(远超出测量范围导致的),这些让它们保持NaN即可,绘图时会自动以白色或透明显示。
跳变值。某个点的效率突然从90%掉到60%,又马上恢复到90%,这通常不是真实物理现象,而是传感器信号干扰或台架数据采集丢帧。处理方式很简单:用滑动中值滤波或者设置一个合理的变化阈值,超过阈值的点置为NaN。但这步操作要谨慎,有些真实的“低效点”(比如电机在零转矩附近,效率确实很低)也是跳变式的,不能一棍子打死。
超界值。效率超过100%、转矩超过电机峰值、转速为负等,这些数据明显违背物理规律,直接在预处理阶段将超界值截断或剔除。效率值超过110%的肯定是错误数据,效率值在100%-105%之间的有可能是测量误差,可以保留并截断到100%。
6.2 MATLAB的版本兼容性问题(2020b/2021a/2022b)
写这套程序时,我特意考虑了Matlab版本兼容性。几个关键函数在不同版本间的差异要注意:
climvscaxis:Matlab R2022a之后推荐用clim,老版本用caxis。为了兼容,可以在程序里做一次判断:if exist('clim', 'file'), clim([...]); else caxis([...]); end。turbo函数在R2020b以上版本才有,老版本用jet代替。scatteredInterpolant比griddata性能好,但从R2013a起才替代老接口,如果你还在用祖传的R2010b,那就只能用griddata了。
另外特别提醒:如果你的Matlab是32位老版本,处理大数据量时可能内存溢出。MAP图矩阵一般不大(几百×几百),但如果你做高分辨率渲染,比如2000×2000的网格,pcolor会非常吃力。这种时候可以用imagesc代替pcolor——imagesc直接按矩阵像素绘制,速度快很多,唯一的缺点是坐标轴和矩阵行列需要手动对齐,而且imagesc默认Y轴方向是从上到下,需要set(gca,'YDir','normal')翻转。
6.3 用NaN遮盖外特性之外的区域,让图更“诚实”
最后还得强调一下NaN遮盖的重要性。电机MAP图有个特殊之处:矩形网格区域内,有很大一部分(外特性曲线之外)是物理上无法达到的工作点。如果不做遮盖,这些区域会被插值算法造出一堆不存在的效率数据,图上会出现大片蓝色或绿色,极大地误导看图的人。
正确做法是:在画图前,生成一个和外特性边界匹配的布尔掩膜(mask),把外特性边界之外的网格点全部置为NaN。这个掩膜可以通过inpolygon函数实现:
% 生成外特性边界内的掩膜 [R_grid, T_grid] = meshgrid(R_vec, T_vec); % 上下边界曲线(正转矩和负转矩) boundary_upper = interp1(R_ext, T_ext, R_vec, 'linear', 'extrap'); boundary_lower = -boundary_upper; mask = (T_grid <= boundary_upper) & (T_grid >= boundary_lower); E_grid(~mask) = NaN;执行这步之后,图上的外特性边界之外的区域都会变成白色,只有真实可运行的工况区有颜色。这是电机MAP图最标准的画法,也是“专业感”的最大来源。很多学弟学妹画的图一眼看上去就是“业余感”,归根结底就是少了这个掩膜处理。
7. 完整实战示例:从散点测试数据到成品MAP图
理论讲了一堆,这里给一个完整、可直接复制运行的示例程序。数据是模拟的,但数据结构和真实台架测试一致,你可以用自己的测试数据直接替换。
%% 模拟测试散点数据(实际使用时替换为台架数据) rng(42); R_raw = []; T_raw = []; E_raw = []; % 模拟外特性 R_ext = [0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]; T_ext = [300, 300, 300, 300, 280, 240, 200, 160, 130, 100, 70]; % 生成散点:在外特性内随机生成测点 for i = 1:500 r = rand * 10000; t_max_here = interp1(R_ext, T_ext, r, 'linear', 'extrap'); t = (rand * 2 - 1) * t_max_here * 0.95; % 测点落在边界内 eff = 90 - 5 * (r / 10000) - 0.005 * abs(t - 100); % 构造效率模型 R_raw(end+1) = r; %#ok<SAGROW> T_raw(end+1) = t; %#ok<SAGROW> E_raw(end+1) = eff + randn * 2; %#ok<SAGROW> 加噪声 end %% 核心步骤1:生成目标网格 R_vec = unique(round(R_raw / 500) * 500); % 按500rpm取整 T_vec = unique(round(T_raw / 20) * 20); % 按20Nm取整 [R_grid, T_grid] = meshgrid(R_vec, T_vec); %% 核心步骤2:散点插值 F = scatteredInterpolant(R_raw(:), T_raw(:), E_raw(:), 'linear', 'none'); E_grid = F(R_grid, T_grid); %% 核心步骤3:外特性掩膜 boundary_upper = interp1(R_ext, T_ext, R_vec, 'linear', 'extrap'); mask = (T_grid <= boundary_upper) & (T_grid >= -boundary_upper); E_grid(~mask) = NaN; %% 核心步骤4:边缘补点 R_plot = [R_vec(1) - 500, R_vec, R_vec(end) + 500]; T_plot = [T_vec(1) - 20, T_vec, T_vec(end) + 20]; E_plot = NaN(length(T_plot), length(R_plot)); E_plot(2:end-1, 2:end-1) = E_grid; E_plot(2:end-1, 1) = E_grid(:, 1); E_plot(2:end-1, end) = E_grid(:, end); E_plot(1, 2:end-1) = E_grid(1, :); E_plot(end, 2:end-1) = E_grid(end, :); %% 核心步骤5:绘图 figure('Color', 'w', 'Position', [100 100 900 650]); h = pcolor(R_plot, T_plot, E_plot); set(h, 'EdgeColor', 'none'); shading interp; colormap(turbo); clim([50 100]); hold on; % 等高线 [C, hC] = contour(R_vec, T_vec, E_grid, [80 85 90 92 94 95 96], 'k', 'LineWidth', 0.8); clabel(C, hC, 'FontSize', 8, 'Color', [0.2 0.2 0.2], 'LabelSpacing', 200); % 外特性曲线 plot(R_ext, T_ext, 'k-', 'LineWidth', 2.5); plot(R_ext, -T_ext, 'k--', 'LineWidth', 2.5); hold off; % 坐标轴与标签 xlabel('转速 (rpm)', 'FontSize', 11); ylabel('转矩 (Nm)', 'FontSize', 11); title('电机效率MAP图', 'FontSize', 12); set(gca, 'FontSize', 10, 'Box', 'on'); cb = colorbar; cb.Label.String = '效率 (%)'; cb.Label.FontSize = 10; cb.Ticks = [55 60 65 70 75 80 85 90 92 94 95 96 97]; % 导出 print(gcf, '电机效率MAP.png', '-dpng', '-r300');这段代码我实测可以直接运行,生成一张带等高线、外特性边界、边缘补点、纳米遮盖的标准电机效率MAP图。你只需要把数据替换成实际的台架数据或仿真数据即可。
8. 进阶扩展思路与我的最终实操体会
画电机MAP图这件事,表面上是个绘图技巧,实质上是个数据处理思维问题。不少人把精力全花在“怎么让颜色更好看”上,却忽略了图的工程语义是否准确。我后期写程序时,越来越觉得几个细节最重要:
一是色标范围要固定。同一台电机的方案对比,两张图的色标范围如果不一致,视觉上根本没法比。我习惯统一设成50到100,哪怕某张图的高效区范围很小。二是外特性边界必须画。没有边界线的MAP图在技术评审时会被质疑“这图到底哪些点能用?”三是网格匹配实测点。不要无脑加密网格,原始测点密度决定了图的真实分辨率。
对于还想进一步扩展的读者,可以往这几个方向尝试:把这套绘图程序封装成函数库,批量处理多种工况的MAP数据,自动命名输出文件,做成流程化报告工具;或者在Map图基础上叠加运行工况点,比如把NEDC、WLTC循环的工况点描在同一张效率MAP上,用颜色深浅表示该工况点的频次权重,就能直观看出电机的效率设计是否匹配了目标工况;也可以写一个简单的GUI界面,通过滑条调节色标范围、等高线层级等参数,方便不会改代码的同事自己出图。
最后分享一个我个人的小习惯:出图之前,永远先跑一遍min(Z_mat(:))和max(Z_mat(:)),确认数据范围合理,再决定色标范围。这一步看起来多余,但真的能挡住一半以上的低级错误。有一次我拿到一批测试数据没检查范围就画图,结果图上出现一片诡异的亮黄色,查了半天才发现是某个测点的效率值是114,传感器接线问题导致跳变。从那以后,数据范围检查成了我画图的固定动作。希望这篇分享能帮你少走这些弯路,直接画出能上会的专业MAP图。
本文还有配套的精品资源,点击获取