效率云圖到任意二維數(shù)據(jù)場(chǎng))
簡(jiǎn)介本資源是一套開(kāi)箱即用的Matlab電機(jī)MAP繪制程序面向電機(jī)控制工程師、電驅(qū)動(dòng)系統(tǒng)研發(fā)人員及高校相關(guān)方向研究生解決實(shí)際項(xiàng)目中電機(jī)效率、轉(zhuǎn)矩、電流等多維性能數(shù)據(jù)難以高效可視化的問(wèn)題。壓縮包共3個(gè)文件116KB包含核心Matlab腳本.m用于自動(dòng)讀取與插值繪圖、Excel格式的原始MAP數(shù)據(jù)表.xlsx便于替換自定義測(cè)試數(shù)據(jù)、以及生成的高分辨率效率熱力圖示例.png供效果參考。已有196人學(xué)習(xí)下載腳本已適配多種常見(jiàn)電機(jī)數(shù)據(jù)結(jié)構(gòu)支持surf三維曲面、contour等高線、fill填充等多種繪圖模式無(wú)需修改即可繪制轉(zhuǎn)速-轉(zhuǎn)矩平面下的效率/損耗/電流分布圖并內(nèi)置坐標(biāo)軸標(biāo)注、色條標(biāo)定、插值平滑等工程實(shí)用功能顯著降低MAP圖從數(shù)據(jù)到圖表的實(shí)現(xiàn)門檻。 搞電機(jī)或者電驅(qū)系統(tǒng)的人日常打交道最多的圖除了那些時(shí)間軸上的波形曲線恐怕就是這張“轉(zhuǎn)速-轉(zhuǎn)矩-效率”的MAP圖了。剛?cè)胄心顷囎游夷玫脚_(tái)架測(cè)試返回的一大堆數(shù)據(jù)點(diǎn)用scatter散點(diǎn)圖糊弄了幾版結(jié)果被做系統(tǒng)匹配的同事吐槽說(shuō)“你這圖沒(méi)法看效率區(qū)域糊成一團(tuán)根本沒(méi)法對(duì)比方案”。后來(lái)痛定思痛仔細(xì)把Matlab繪圖的底層邏輯捋了一遍寫(xiě)了一套通用繪制程序。這篇就把這套程序的設(shè)計(jì)思路和完整實(shí)現(xiàn)拆開(kāi)講清楚尤其是怎么讓同一套代碼不僅能畫(huà)電機(jī)MAP還能秒切到電池內(nèi)阻MAP、逆變器損耗MAP這些亂七八糟的二維數(shù)據(jù)場(chǎng)。1. 先搞清楚電機(jī)MAP圖的本質(zhì)一張圖背后是三個(gè)維度的數(shù)據(jù)我見(jiàn)過(guò)不少新手拿到電機(jī)MAP圖時(shí)的第一反應(yīng)這不就是個(gè)漂亮的彩色云圖嗎確實(shí)視覺(jué)上它像個(gè)云圖但如果你只把它當(dāng)云圖畫(huà)那大概率畫(huà)出來(lái)的東西只是“好看”而無(wú)法承載工程判斷。電機(jī)MAP圖在工程上有個(gè)更嚴(yán)謹(jǐn)?shù)拿纸行实雀呔€圖或效率云圖本質(zhì)上是用二維平面上的顏色變化來(lái)表達(dá)第三個(gè)維度的數(shù)值大小。1.1 MAP圖的數(shù)據(jù)結(jié)構(gòu)別再把XYZ散點(diǎn)直接懟進(jìn)繪圖函數(shù)具體到Matlab里電機(jī)MAP圖的標(biāo)準(zhǔn)數(shù)據(jù)形態(tài)是X軸為轉(zhuǎn)速通常單位是rpm也有用rad/s的Y軸為轉(zhuǎn)矩單位是Nm平面上每一個(gè)坐標(biāo)點(diǎn)對(duì)應(yīng)一個(gè)效率值0到1或者0到100%。這里有個(gè)非常容易踩的坑。如果你從試驗(yàn)臺(tái)架直接讀取數(shù)據(jù)得到的一般是類似下面這種的表格式散點(diǎn)數(shù)據(jù)轉(zhuǎn)速(rpm)轉(zhuǎn)矩(Nm)效率(%)1000082.310002088.510004090.12000080.220002091.4這種表格式的離散點(diǎn)數(shù)據(jù)直接plot或scatter是畫(huà)不出“面”的效果的。你真正需要的是一個(gè)二維矩陣行對(duì)應(yīng)轉(zhuǎn)矩、列對(duì)應(yīng)轉(zhuǎn)速或者反過(guò)來(lái)也行矩陣?yán)锏闹挡攀切省Q句話說(shuō)散點(diǎn)數(shù)據(jù)必須先插值網(wǎng)格化變成類似轉(zhuǎn)速向量 R [1000, 2000, 3000, 4000, 5000]; 轉(zhuǎn)矩向量 T [0, 20, 40, 60, 80, 100]; 效率矩陣 E [82.3, 80.2, ...; 88.5, 91.4, ...;]這種矩陣格式Matlab的pcolor、contourf、imagesc這類函數(shù)才能直接吃進(jìn)去。1.2 為什么“完美繪制任何類型的數(shù)據(jù)”這個(gè)目標(biāo)值得追求標(biāo)題里寫(xiě)了“完美繪制任何類型的數(shù)據(jù)”這句不是噱頭。電驅(qū)動(dòng)系統(tǒng)開(kāi)發(fā)過(guò)程中需要畫(huà)這種二維色圖的地方多得超乎想象電機(jī)效率MAP轉(zhuǎn)速×轉(zhuǎn)矩×效率最經(jīng)典的一張圖看高效區(qū)是否覆蓋主工況區(qū)。電機(jī)損耗MAP轉(zhuǎn)速×轉(zhuǎn)矩×總損耗銅耗鐵耗機(jī)械損耗做散熱分析和峰值能力判斷用。電池內(nèi)阻MAPSOC×溫度×內(nèi)阻BMS策略標(biāo)定時(shí)必看低溫低SOC時(shí)內(nèi)阻會(huì)飆升直接影響放電功率限制。逆變器損耗MAP轉(zhuǎn)速×轉(zhuǎn)矩×IGBT損耗配合電機(jī)損耗可以算系統(tǒng)級(jí)效率。NVH噪音MAP轉(zhuǎn)速×轉(zhuǎn)矩×聲壓級(jí)或者階次幅值做噪音優(yōu)化時(shí)用往往要求很高的分辨率。這些圖的物理含義天差地別但落到繪圖層面數(shù)據(jù)結(jié)構(gòu)卻幾乎完全一致——都是X軸向量、Y軸向量、Z值二維矩陣。所以只要把這套數(shù)據(jù)規(guī)范定義好一套繪圖程序完全可以通吃。我個(gè)人寫(xiě)這套程序時(shí)定的目標(biāo)是輸入轉(zhuǎn)速向量、轉(zhuǎn)矩向量和效率矩陣輸出一張“能直接貼進(jìn)技術(shù)報(bào)告”的圖。也就是說(shuō)坐標(biāo)軸刻度要科學(xué)、顏色條要明確、等效率線要清晰、外特性邊界要體現(xiàn)最好還能一鍵切換顯示模式。2. 數(shù)據(jù)輸入的坑三分畫(huà)圖七分?jǐn)?shù)據(jù)整理寫(xiě)繪圖程序之前最需要花心思設(shè)計(jì)的其實(shí)是“如何把數(shù)據(jù)整理成程序能直接接收的格式”。實(shí)測(cè)中來(lái)自臺(tái)架、仿真、整車實(shí)測(cè)的數(shù)據(jù)格式千變?nèi)f化如果不做預(yù)處理繪圖代碼里就得塞一堆條件分支既不優(yōu)雅也容易出bug。2.1 三種典型輸入格式的統(tǒng)一坐標(biāo)軸策略我最終把輸入格式統(tǒng)一成了三種模式分別對(duì)應(yīng)不同來(lái)源的數(shù)據(jù)在程序開(kāi)頭做一個(gè)標(biāo)準(zhǔn)化預(yù)處理模式A完整矩陣輸入。數(shù)據(jù)本身就是網(wǎng)格化的轉(zhuǎn)速向量R、轉(zhuǎn)矩向量T、效率矩陣Esize為length(T)×length(R)齊全。這種情況最容易直接繪圖即可。模式B散點(diǎn)列表輸入。從試驗(yàn)數(shù)據(jù)文件讀出來(lái)的是三列長(zhǎng)數(shù)據(jù)每行對(duì)應(yīng)一個(gè)工況點(diǎn)轉(zhuǎn)速、轉(zhuǎn)矩、效率工況點(diǎn)可能覆蓋不全甚至沒(méi)有覆蓋完整網(wǎng)格。這種情況必須做網(wǎng)格重建和插值。模式C矩陣行列坐標(biāo)輸入。部分?jǐn)?shù)據(jù)采集系統(tǒng)導(dǎo)出的是完整矩陣但只附帶起始值、步長(zhǎng)等坐標(biāo)信息。比如轉(zhuǎn)速?gòu)?00rpm到10000rpm步長(zhǎng)500rpm共20個(gè)點(diǎn)轉(zhuǎn)矩從-100Nm到300Nm步長(zhǎng)50rpm共9行需要用linspace或冒號(hào)運(yùn)算符生成坐標(biāo)向量再拼接。模式B比較關(guān)鍵這里放一個(gè)我實(shí)際在用的散點(diǎn)轉(zhuǎn)網(wǎng)格的代碼片段function [R_grid, T_grid, E_grid] map_data_prepare(R_raw, T_raw, E_raw, R_vec, T_vec, method) % 將散點(diǎn)數(shù)據(jù)映射到規(guī)則網(wǎng)格 % R_raw: 散點(diǎn)轉(zhuǎn)速數(shù)據(jù) (N×1) % T_raw: 散點(diǎn)轉(zhuǎn)矩?cái)?shù)據(jù) (N×1) % E_raw: 散點(diǎn)效率數(shù)據(jù) (N×1) % R_vec: 目標(biāo)轉(zhuǎn)速網(wǎng)格向量 (1×M) % T_vec: 目標(biāo)轉(zhuǎn)矩網(wǎng)格向量 (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); % 外插值設(shè)置成NaN避免外特性邊界外出現(xiàn)虛假數(shù)據(jù) F.ExtrapolationMethod none; E_grid F(R_grid, T_grid); % 將沒(méi)有數(shù)據(jù)的區(qū)域外特性以外設(shè)為NaN避免畫(huà)出色塊 E_grid(isnan(E_grid)) NaN; endscatteredInterpolant是處理這種散點(diǎn)數(shù)據(jù)最順手的工具比老版的griddata在性能和可控性上都強(qiáng)出一截。有一點(diǎn)值得注意外插值一定要設(shè)成none。如果保留默認(rèn)的線性外插那些沒(méi)測(cè)到的高速大轉(zhuǎn)矩區(qū)域會(huì)被插值出一些假效率值畫(huà)進(jìn)圖里就會(huì)出現(xiàn)遠(yuǎn)超實(shí)際范圍的異常色塊。2.2 轉(zhuǎn)速和轉(zhuǎn)矩軸的網(wǎng)格梯度設(shè)計(jì)很多人在繪制MAP圖時(shí)忽略了一個(gè)細(xì)節(jié)——電機(jī)臺(tái)架測(cè)試的轉(zhuǎn)速點(diǎn)和轉(zhuǎn)矩點(diǎn)往往不是均勻分布的。比如低速工況點(diǎn)密一些高速稀疏一些轉(zhuǎn)矩在小轉(zhuǎn)矩區(qū)密一些大轉(zhuǎn)矩區(qū)稀疏一些。直接用原始測(cè)試點(diǎn)做網(wǎng)格pcolor畫(huà)出來(lái)的格子會(huì)寬窄不一色塊邊緣參差不齊。我的做法是從原始測(cè)試數(shù)據(jù)里抽取唯一的轉(zhuǎn)速值、轉(zhuǎn)矩值升序排列作為目標(biāo)網(wǎng)格。不額外插值加密。比如測(cè)試有21個(gè)轉(zhuǎn)速點(diǎn)、19個(gè)轉(zhuǎn)矩點(diǎn)生成的效率矩陣就是19×21每個(gè)格子代表真實(shí)測(cè)試區(qū)域邊界清晰。這樣畫(huà)出的圖不會(huì)因?yàn)檫^(guò)度插值而“顯得精度很高”但它忠實(shí)反映了原始數(shù)據(jù)密度。另外網(wǎng)格要做“邊緣補(bǔ)點(diǎn)”否則pcolor的色塊邊界會(huì)縮進(jìn)一圈。pcolor的色塊本質(zhì)上畫(huà)的是網(wǎng)格單元如果直接用測(cè)得的離散值畫(huà)邊緣那半個(gè)格子是被截?cái)嗟?。解決辦法是在轉(zhuǎn)速和轉(zhuǎn)矩向量的首尾各補(bǔ)一個(gè)虛擬點(diǎn)值可以取相鄰點(diǎn)的值或者干脆取相鄰點(diǎn)的外推值。% 邊緣補(bǔ)點(diǎn) 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))]; % 對(duì)應(yīng)補(bǔ)兩行兩列的數(shù)據(jù)這一步雖然看起來(lái)簡(jiǎn)單但沒(méi)有它圖片邊緣就會(huì)有一條明顯的“白邊”貼到報(bào)告里特別掉檔次。3. 選對(duì)繪圖函數(shù)與配色pcolor、contourf、imagesc到底該用哪個(gè)Matlab里能畫(huà)二維色圖的函數(shù)不少imagesc、imagesc、pcolor、contourf、surf都能干這事但每個(gè)函數(shù)的行為差異是實(shí)打?qū)嵉?。選錯(cuò)函數(shù)輕則圖難看重則數(shù)據(jù)表達(dá)失真。這里把我用下來(lái)的經(jīng)驗(yàn)按場(chǎng)景對(duì)比一下。3.1 pcolor是電機(jī)MAP繪制的首選原因pcolor的邏輯是“以網(wǎng)格點(diǎn)為中心把相鄰點(diǎn)用色塊填充”。它天然適配電機(jī)MAP這類數(shù)據(jù)——每個(gè)網(wǎng)格點(diǎn)都有真實(shí)的物理測(cè)量或仿真計(jì)算值色塊邊界恰好就是試驗(yàn)工況點(diǎn)的邊界。跟contourf相比pcolor不會(huì)對(duì)數(shù)據(jù)做任何光滑或重建是“所見(jiàn)即所得”。但pcolor有兩個(gè)經(jīng)典副作用默認(rèn)帶網(wǎng)格線尤其當(dāng)網(wǎng)格點(diǎn)很多時(shí)色塊之間會(huì)出現(xiàn)白色細(xì)線視覺(jué)上亂。解決辦法是設(shè)shading interp對(duì)顏色做插值或shading flat去掉網(wǎng)格線。邊緣截?cái)嗲懊嫣岬降男枰吘壯a(bǔ)點(diǎn)。我的做法是直接用pcolor(R_plot, T_plot, E_plot)然后緊跟一句shading interp。這樣輸出平滑無(wú)網(wǎng)格線顏色過(guò)渡自然。figure; h pcolor(R_plot, T_plot, E_plot); set(h, EdgeColor, none); shading interp;shading interp會(huì)對(duì)每個(gè)網(wǎng)格單元做雙線性顏色插值出來(lái)的視覺(jué)效果比shading flat細(xì)膩很多尤其適合效率MAP這種漸變數(shù)據(jù)。3.2 等效率線的疊加邏輯與層級(jí)控制光有云圖還不夠工程上還要疊等效率線。比如判斷95%高效區(qū)的邊界在哪、高效區(qū)是否覆蓋常用巡航工況這時(shí)候就需要contour疊加在pcolor之上。contour和contourf的選擇邏輯要分清contourf畫(huà)的是填充等高線如果疊在pcolor上它會(huì)用色塊覆蓋掉底下的云圖除非設(shè)透明度否則會(huì)遮住底層信息一般不用于疊加場(chǎng)景。contour只畫(huà)線條不填充適合疊加在pcolor上。我的標(biāo)準(zhǔn)做法是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是自動(dòng)標(biāo)注等高線數(shù)值的函數(shù)LabelSpacing參數(shù)控制標(biāo)注沿曲線的間隔單位是點(diǎn)。我設(shè)250左右標(biāo)注不會(huì)太密也不會(huì)太疏。等高線的線條顏色用黑色線寬0.8既不喧賓奪主又能清晰讀值。如果你覺(jué)得全黑線條太沉悶也可以用深灰色。3.3 配色方案決定圖的“可讀性”這幾個(gè)colormap值得反復(fù)用電機(jī)MAP這類的數(shù)據(jù)配色方案是有講究的。默認(rèn)的parula比較均衡藍(lán)到黃但從工程閱讀習(xí)慣來(lái)說(shuō)我更偏向用jet系列加限制或者用新版Matlab推薦的turbo。turboMatlab R2020b之后的turbo色圖顏色分布均勻視覺(jué)上比jet柔和高亮區(qū)域不刺眼。作為效率MAP的默認(rèn)選擇沒(méi)問(wèn)題。jet經(jīng)典彩虹色紅橙黃綠青藍(lán)紫從低到高直覺(jué)對(duì)應(yīng)“冷到熱”。但jet有個(gè)毛病——顏色亮度不單調(diào)紅和藍(lán)兩端亮度反而高中間綠色亮度低人眼對(duì)顏色的感知不均勻。做報(bào)告用jet會(huì)被視覺(jué)設(shè)計(jì)師吐槽如果你只給自己看倒是無(wú)所謂。parulaMatlab默認(rèn)色圖藍(lán)黃漸變色覺(jué)障礙人士也能分辨。但用在效率MAP上藍(lán)色低效率區(qū)域和黃色高效率區(qū)域?qū)Ρ榷绕跤绕湓谕队吧峡床磺逦?。我測(cè)試下來(lái)最適合電機(jī)效率MAP的是雙色拼接colormap高效率區(qū)用紅色系紅-橙-黃低效率區(qū)用藍(lán)色系深藍(lán)-淺藍(lán)中間白色過(guò)渡。這種配色在工程報(bào)告里辨識(shí)度極高。實(shí)際實(shí)現(xiàn)是用colormap函數(shù)拼接兩個(gè)色彩空間或者用ColorThreshold做一個(gè)自定義色圖。% 自定義雙色colormap白-藍(lán)漸變 白-紅漸變 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);這段代碼的意思是前半段從純白漸變到深藍(lán)色后半段從純白漸變到深紅色。這樣效率從低到高顏色由藍(lán)變白再變紅中間白區(qū)分明一眼就能看出高效區(qū)。這個(gè)配色我用了很久貼到任何報(bào)告里都顯得專業(yè)。4. 一套代碼畫(huà)出“任何類型的數(shù)據(jù)”從電機(jī)MAP到電池、NVH數(shù)據(jù)的通用化設(shè)計(jì)寫(xiě)一套程序最忌“畫(huà)死了”——就是代碼只適配電機(jī)效率數(shù)據(jù)換個(gè)數(shù)據(jù)源就要大改。所以在設(shè)計(jì)階段就要想好通用化策略。我這套程序的接口參數(shù)如下基本做到了數(shù)據(jù)類型無(wú)關(guān)。4.1 通用繪圖函數(shù)的接口設(shè)計(jì)function hFig plot_map_2d(R_vec, T_vec, Z_mat, varargin) % 通用二維色圖繪制MAP圖 % 輸入?yún)?shù) % R_vec - X軸坐標(biāo)向量例如轉(zhuǎn)速 % T_vec - Y軸坐標(biāo)向量例如轉(zhuǎn)矩 % Z_mat - Z值矩陣維度為 length(T_vec)×length(R_vec) % 可選參數(shù)Name-Value形式 % zlabel : Z軸標(biāo)簽?zāi)J(rèn) Z % xlabel : X軸標(biāo)簽?zāi)J(rèn) X % ylabel : Y軸標(biāo)簽?zāi)J(rèn) Y % title : 圖標(biāo)題默認(rèn)空 % levels : 等高線層級(jí)向量默認(rèn) [80 85 90 92 94 95 96] % clabel : 是否顯示等高線標(biāo)注默認(rèn) true % cmap : colormap名稱或自定義矩陣默認(rèn) turbo % nan_color: 數(shù)據(jù)為NaN區(qū)域的填充顏色默認(rèn) [1 1 1] % xscale : linear 或 log默認(rèn) linear % mask_threshold : 低于該閾值的區(qū)域置為NaN可選項(xiàng)這里想重點(diǎn)說(shuō)的是mask_threshold參數(shù)的設(shè)計(jì)。電機(jī)MAP圖里轉(zhuǎn)矩為零附近或外特性邊界外實(shí)際上沒(méi)有穩(wěn)態(tài)工況點(diǎn)這些區(qū)域往往是插值出的“空數(shù)據(jù)”。如果你不做遮蓋圖上會(huì)出現(xiàn)一大片低效率的藍(lán)色甚至影響色標(biāo)的自動(dòng)范圍。所以我在通用接口里加了閾值遮蓋功能效率低于某個(gè)值時(shí)把對(duì)應(yīng)位置設(shè)置為NaN繪圖時(shí)自動(dòng)變成白色或指定顏色。這樣畫(huà)出來(lái)的圖只顯示有效工況區(qū)干凈利落。4.2 數(shù)據(jù)規(guī)范化自動(dòng)識(shí)別數(shù)據(jù)的“真實(shí)范圍”避免色標(biāo)誤導(dǎo)imagesc和pcolor都能自動(dòng)根據(jù)數(shù)據(jù)的最大最小值映射顏色但這里有個(gè)大坑——如果數(shù)據(jù)里有幾個(gè)離群異常點(diǎn)比如某個(gè)工況點(diǎn)的效率因?yàn)閭鞲衅魈冿@示成120%整個(gè)色標(biāo)范圍會(huì)被拉大導(dǎo)致正常區(qū)域的顏色對(duì)比度被嚴(yán)重壓縮。我的通用程序在繪圖中加入了兩個(gè)處理邏輯物理范圍截?cái)?。比如效率?shù)據(jù)把超過(guò)100%的值硬截?cái)酁?00%把低于0%的硬截?cái)酁?%。這個(gè)操作在物理上是合理的因?yàn)樾什豢赡艹鲞@個(gè)范圍。色標(biāo)范圍可調(diào)。通過(guò)caxis新版用clim把色標(biāo)范圍固定在用戶指定的區(qū)間內(nèi)。比如渲染效率圖時(shí)我通常把色標(biāo)范圍設(shè)在50到100之間低于50的統(tǒng)統(tǒng)一片藍(lán)。這樣高效區(qū)與低效區(qū)的色差能拉到最大讀圖效率明顯提升。% 數(shù)據(jù)規(guī)范化以效率為例 Z_mat(Z_mat 100) 100; Z_mat(Z_mat 0) 0; % 設(shè)置色標(biāo)范圍 clim([50, 100]);4.3 從效率MAP到損耗MAP同一套代碼的完整切換這套通用程序我實(shí)際用過(guò)的場(chǎng)景包括電機(jī)效率MAP、電機(jī)損耗MAP、電池內(nèi)阻MAPSOC-溫度平面、逆變器IGBT損耗MAP、減速器效率MAP甚至還有座椅加熱的溫升云圖。每種的差異只在坐標(biāo)標(biāo)簽、色標(biāo)專業(yè)著色的含義、以及色標(biāo)范圍。比如畫(huà)電池內(nèi)阻MAP時(shí)X軸不是轉(zhuǎn)速而是SOC荷電狀態(tài)Y軸是溫度Z軸是內(nèi)阻值mΩ我只需要改一下函數(shù)調(diào)用的標(biāo)簽和色標(biāo)范圍代碼主體完全不用動(dòng)。反過(guò)來(lái)畫(huà)電機(jī)損耗MAP時(shí)Z值是損耗功率單位kW數(shù)值越小越好那就要把色標(biāo)范圍倒過(guò)來(lái)設(shè)或者把colormap翻轉(zhuǎn)方向。通用化的核心收益是你只需要維護(hù)一份經(jīng)過(guò)充分測(cè)試的繪圖代碼質(zhì)量穩(wěn)定可靠換數(shù)據(jù)源時(shí)不用重新畫(huà)一遍、重新調(diào)一遍格式。對(duì)于經(jīng)常要出圖寫(xiě)報(bào)告的人來(lái)說(shuō)這能省下大量時(shí)間。5. 高級(jí)美化技巧外特性曲線、色標(biāo)設(shè)置和圖片導(dǎo)出基礎(chǔ)MAP圖畫(huà)出來(lái)了但要讓它達(dá)到“直接上傳到系統(tǒng)、直接投進(jìn)PPT”的水平還得加幾個(gè)工程上的“定制化”元素。其中最重要的就是電機(jī)外特性曲線的疊加和色標(biāo)設(shè)計(jì)。5.1 外特性曲線疊加讓轉(zhuǎn)速-轉(zhuǎn)矩工作區(qū)邊界清晰可見(jiàn)電機(jī)MAP圖通常都要疊外特性曲線。外特性曲線是指電機(jī)在不同轉(zhuǎn)速下能輸出的最大轉(zhuǎn)矩峰值轉(zhuǎn)矩是電機(jī)工作區(qū)域的物理邊界。沒(méi)有這條線光看圖你會(huì)以為整個(gè)矩形區(qū)域內(nèi)電機(jī)都能正常工作但實(shí)際上矩形區(qū)域的左上角高轉(zhuǎn)矩低轉(zhuǎn)速和右下角高轉(zhuǎn)速低轉(zhuǎn)矩往往是不允許運(yùn)行的。疊加方法很簡(jiǎn)單前提是你要有外特性數(shù)據(jù)轉(zhuǎn)速序列和對(duì)應(yīng)轉(zhuǎn)矩上限然后直接plot上去% 外特性曲線數(shù)據(jù)示例峰值轉(zhuǎn)矩曲線 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); % 電動(dòng)工況和發(fā)電工況對(duì)稱 hold off;如果你的電機(jī)有發(fā)電工況轉(zhuǎn)矩為負(fù)就畫(huà)負(fù)轉(zhuǎn)矩外特性。有時(shí)候還要疊加峰值功率限制曲線雙曲線形狀同樣用plot畫(huà)上去就行。外特性曲線的線寬設(shè)置成2.5比等高線更粗主次分明。5.2 色標(biāo)與刻度別讓colorbar的數(shù)值“完全自動(dòng)”colorbar是MAP圖的靈魂但顏色條上顯示的內(nèi)容往往被很多人忽略。默認(rèn)的colorbar顯示的刻度是線性分布的但效率圖的色標(biāo)從50到100只有50個(gè)單位的跨度Matlab自動(dòng)會(huì)切成5個(gè)刻度50、60、70、80、90、100??雌饋?lái)還行但如果你想強(qiáng)調(diào)95%以上是高效區(qū)建議手動(dòng)指定刻度。更精細(xì)的做法是在colorbar上用一條黑色橫線或者用text標(biāo)注出關(guān)鍵閾值比如“95%高效區(qū)”。% 手動(dòng)控制colorbar cb colorbar; cb.Label.String 效率(%); cb.Label.FontSize 10; % 設(shè)置刻度到指定數(shù)值 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};另一個(gè)實(shí)用技巧是給色標(biāo)設(shè)置“非線性映射”。比如效率數(shù)據(jù)集中分布在85到97之間如果你線性映射到色標(biāo)上這個(gè)區(qū)間的顏色過(guò)渡不夠明顯。可以用pcolor里傳入一個(gè)經(jīng)過(guò)非線性拉伸的Z值矩陣來(lái)繪圖但把刻度標(biāo)簽還原成真實(shí)值。這樣能夸大關(guān)注區(qū)間的顏色變化不過(guò)做這種圖時(shí)要格外小心如果看圖的人不知道坐標(biāo)是非線性映射的會(huì)誤讀數(shù)據(jù)所以我在實(shí)際報(bào)告中一般不用除非特別說(shuō)明。5.3 圖形導(dǎo)出直接輸出高清圖片避免另存為時(shí)畫(huà)質(zhì)縮水在Matlab里畫(huà)完圖很多人喜歡直接點(diǎn)figure窗口的“保存”這樣出來(lái)的圖清晰度往往不夠尤其是往Word或PPT里貼的時(shí)候會(huì)出現(xiàn)毛邊與鋸齒。我推薦的導(dǎo)出方案是% 設(shè)置導(dǎo)出尺寸與分辨率 set(gcf, PaperPositionMode, auto); set(gcf, Position, [100 100 800 600]); print(gcf, 圖1_電機(jī)效率MAP.png, -dpng, -r300);-r300指定DPI為300做印刷或高清匯報(bào)足夠了。如果你想要矢量圖以備后續(xù)在矢量編輯軟件中加工就用-depsc或-dsvg。注意導(dǎo)出之前在figure窗口里先set(gcf,Color,w)把背景設(shè)為白色否則默認(rèn)淺灰色背景會(huì)留一圈難看的邊框。6. 邊界問(wèn)題與異常數(shù)據(jù)處理畫(huà)出“干凈圖”的最后一道防線到這里繪制主流程已經(jīng)完整了但還有一類問(wèn)題幾乎每個(gè)用過(guò)我這套程序的人都會(huì)遇到——異常數(shù)據(jù)的處理。這部分單獨(dú)拿出來(lái)說(shuō)因?yàn)樘幚聿缓脮?huì)直接影響成圖質(zhì)量甚至誤導(dǎo)決策。6.1 測(cè)試數(shù)據(jù)里的“坑點(diǎn)”空值、跳變值、超界值怎么辦臺(tái)架實(shí)測(cè)的MAP數(shù)據(jù)里經(jīng)常會(huì)出現(xiàn)三類臟數(shù)據(jù)空值NaN。由于測(cè)點(diǎn)缺失、傳感器故障或者外特性邊界外區(qū)域未測(cè)量數(shù)據(jù)文件里會(huì)有大量NaN。如果直接繪圖pcolor會(huì)把NaN顯示成空洞contour碰到NaN可能會(huì)斷裂。最穩(wěn)妥的做法是在插值階段就處理掉NaN——把NaN數(shù)據(jù)點(diǎn)剔除后再scatteredInterpolant而不是把NaN直接扔給插值函數(shù)。插值后網(wǎng)格上仍然可能殘留NaN遠(yuǎn)超出測(cè)量范圍導(dǎo)致的這些讓它們保持NaN即可繪圖時(shí)會(huì)自動(dòng)以白色或透明顯示。跳變值。某個(gè)點(diǎn)的效率突然從90%掉到60%又馬上恢復(fù)到90%這通常不是真實(shí)物理現(xiàn)象而是傳感器信號(hào)干擾或臺(tái)架數(shù)據(jù)采集丟幀。處理方式很簡(jiǎn)單用滑動(dòng)中值濾波或者設(shè)置一個(gè)合理的變化閾值超過(guò)閾值的點(diǎn)置為NaN。但這步操作要謹(jǐn)慎有些真實(shí)的“低效點(diǎn)”比如電機(jī)在零轉(zhuǎn)矩附近效率確實(shí)很低也是跳變式的不能一棍子打死。超界值。效率超過(guò)100%、轉(zhuǎn)矩超過(guò)電機(jī)峰值、轉(zhuǎn)速為負(fù)等這些數(shù)據(jù)明顯違背物理規(guī)律直接在預(yù)處理階段將超界值截?cái)嗷蛱蕹?。效率值超過(guò)110%的肯定是錯(cuò)誤數(shù)據(jù)效率值在100%-105%之間的有可能是測(cè)量誤差可以保留并截?cái)嗟?00%。6.2 MATLAB的版本兼容性問(wèn)題2020b/2021a/2022b寫(xiě)這套程序時(shí)我特意考慮了Matlab版本兼容性。幾個(gè)關(guān)鍵函數(shù)在不同版本間的差異要注意climvscaxisMatlab R2022a之后推薦用clim老版本用caxis。為了兼容可以在程序里做一次判斷if exist(clim, file) clim([...]); else caxis([...]); end。turbo函數(shù)在R2020b以上版本才有老版本用jet代替。scatteredInterpolant比griddata性能好但從R2013a起才替代老接口如果你還在用祖?zhèn)鞯腞2010b那就只能用griddata了。另外特別提醒如果你的Matlab是32位老版本處理大數(shù)據(jù)量時(shí)可能內(nèi)存溢出。MAP圖矩陣一般不大幾百×幾百但如果你做高分辨率渲染比如2000×2000的網(wǎng)格pcolor會(huì)非常吃力。這種時(shí)候可以用imagesc代替pcolor——imagesc直接按矩陣像素繪制速度快很多唯一的缺點(diǎn)是坐標(biāo)軸和矩陣行列需要手動(dòng)對(duì)齊而且imagesc默認(rèn)Y軸方向是從上到下需要set(gca,YDir,normal)翻轉(zhuǎn)。6.3 用NaN遮蓋外特性之外的區(qū)域讓圖更“誠(chéng)實(shí)”最后還得強(qiáng)調(diào)一下NaN遮蓋的重要性。電機(jī)MAP圖有個(gè)特殊之處矩形網(wǎng)格區(qū)域內(nèi)有很大一部分外特性曲線之外是物理上無(wú)法達(dá)到的工作點(diǎn)。如果不做遮蓋這些區(qū)域會(huì)被插值算法造出一堆不存在的效率數(shù)據(jù)圖上會(huì)出現(xiàn)大片藍(lán)色或綠色極大地誤導(dǎo)看圖的人。正確做法是在畫(huà)圖前生成一個(gè)和外特性邊界匹配的布爾掩膜mask把外特性邊界之外的網(wǎng)格點(diǎn)全部置為NaN。這個(gè)掩膜可以通過(guò)inpolygon函數(shù)實(shí)現(xiàn)% 生成外特性邊界內(nèi)的掩膜 [R_grid, T_grid] meshgrid(R_vec, T_vec); % 上下邊界曲線正轉(zhuǎn)矩和負(fù)轉(zhuǎn)矩 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;執(zhí)行這步之后圖上的外特性邊界之外的區(qū)域都會(huì)變成白色只有真實(shí)可運(yùn)行的工況區(qū)有顏色。這是電機(jī)MAP圖最標(biāo)準(zhǔn)的畫(huà)法也是“專業(yè)感”的最大來(lái)源。很多學(xué)弟學(xué)妹畫(huà)的圖一眼看上去就是“業(yè)余感”歸根結(jié)底就是少了這個(gè)掩膜處理。7. 完整實(shí)戰(zhàn)示例從散點(diǎn)測(cè)試數(shù)據(jù)到成品MAP圖理論講了一堆這里給一個(gè)完整、可直接復(fù)制運(yùn)行的示例程序。數(shù)據(jù)是模擬的但數(shù)據(jù)結(jié)構(gòu)和真實(shí)臺(tái)架測(cè)試一致你可以用自己的測(cè)試數(shù)據(jù)直接替換。%% 模擬測(cè)試散點(diǎn)數(shù)據(jù)實(shí)際使用時(shí)替換為臺(tái)架數(shù)據(jù) 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]; % 生成散點(diǎn)在外特性內(nèi)隨機(jī)生成測(cè)點(diǎn) 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; % 測(cè)點(diǎn)落在邊界內(nèi) eff 90 - 5 * (r / 10000) - 0.005 * abs(t - 100); % 構(gòu)造效率模型 R_raw(end1) r; %#okSAGROW T_raw(end1) t; %#okSAGROW E_raw(end1) eff randn * 2; %#okSAGROW 加噪聲 end %% 核心步驟1生成目標(biāo)網(wǎng)格 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散點(diǎn)插值 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邊緣補(bǔ)點(diǎn) 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; % 坐標(biāo)軸與標(biāo)簽 xlabel(轉(zhuǎn)速 (rpm), FontSize, 11); ylabel(轉(zhuǎn)矩 (Nm), FontSize, 11); title(電機(jī)效率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]; % 導(dǎo)出 print(gcf, 電機(jī)效率MAP.png, -dpng, -r300);這段代碼我實(shí)測(cè)可以直接運(yùn)行生成一張帶等高線、外特性邊界、邊緣補(bǔ)點(diǎn)、納米遮蓋的標(biāo)準(zhǔn)電機(jī)效率MAP圖。你只需要把數(shù)據(jù)替換成實(shí)際的臺(tái)架數(shù)據(jù)或仿真數(shù)據(jù)即可。8. 進(jìn)階擴(kuò)展思路與我的最終實(shí)操體會(huì)畫(huà)電機(jī)MAP圖這件事表面上是個(gè)繪圖技巧實(shí)質(zhì)上是個(gè)數(shù)據(jù)處理思維問(wèn)題。不少人把精力全花在“怎么讓顏色更好看”上卻忽略了圖的工程語(yǔ)義是否準(zhǔn)確。我后期寫(xiě)程序時(shí)越來(lái)越覺(jué)得幾個(gè)細(xì)節(jié)最重要一是色標(biāo)范圍要固定。同一臺(tái)電機(jī)的方案對(duì)比兩張圖的色標(biāo)范圍如果不一致視覺(jué)上根本沒(méi)法比。我習(xí)慣統(tǒng)一設(shè)成50到100哪怕某張圖的高效區(qū)范圍很小。二是外特性邊界必須畫(huà)。沒(méi)有邊界線的MAP圖在技術(shù)評(píng)審時(shí)會(huì)被質(zhì)疑“這圖到底哪些點(diǎn)能用”三是網(wǎng)格匹配實(shí)測(cè)點(diǎn)。不要無(wú)腦加密網(wǎng)格原始測(cè)點(diǎn)密度決定了圖的真實(shí)分辨率。對(duì)于還想進(jìn)一步擴(kuò)展的讀者可以往這幾個(gè)方向嘗試把這套繪圖程序封裝成函數(shù)庫(kù)批量處理多種工況的MAP數(shù)據(jù)自動(dòng)命名輸出文件做成流程化報(bào)告工具或者在Map圖基礎(chǔ)上疊加運(yùn)行工況點(diǎn)比如把NEDC、WLTC循環(huán)的工況點(diǎn)描在同一張效率MAP上用顏色深淺表示該工況點(diǎn)的頻次權(quán)重就能直觀看出電機(jī)的效率設(shè)計(jì)是否匹配了目標(biāo)工況也可以寫(xiě)一個(gè)簡(jiǎn)單的GUI界面通過(guò)滑條調(diào)節(jié)色標(biāo)范圍、等高線層級(jí)等參數(shù)方便不會(huì)改代碼的同事自己出圖。最后分享一個(gè)我個(gè)人的小習(xí)慣出圖之前永遠(yuǎn)先跑一遍min(Z_mat(:))和max(Z_mat(:))確認(rèn)數(shù)據(jù)范圍合理再?zèng)Q定色標(biāo)范圍。這一步看起來(lái)多余但真的能擋住一半以上的低級(jí)錯(cuò)誤。有一次我拿到一批測(cè)試數(shù)據(jù)沒(méi)檢查范圍就畫(huà)圖結(jié)果圖上出現(xiàn)一片詭異的亮黃色查了半天才發(fā)現(xiàn)是某個(gè)測(cè)點(diǎn)的效率值是114傳感器接線問(wèn)題導(dǎo)致跳變。從那以后數(shù)據(jù)范圍檢查成了我畫(huà)圖的固定動(dòng)作。希望這篇分享能幫你少走這些彎路直接畫(huà)出能上會(huì)的專業(yè)MAP圖。本文還有配套的精品資源點(diǎn)擊獲取