搞振动噪声的人,迟早都要跟瀑布图打交道。不管是电机加速过程的阶次噪声,还是变速箱在各档位下的共振带分布,又或者是压缩机起停机时的瞬态响应,手里握着一堆Workbench、Simcenter 3D的仿真结果,最后想在一张图里讲清楚“频率随时间/转速怎么变、幅值有多少”,最直观的做法就是用Matlab把瀑布图画出来。
我之前帮同事处理过一组电机NVH数据:ANSYS Workbench谐响应算了几十个频率点,Simcenter 3D又导出一批时域响应,两边数据格式还不一样,频率轴一个密一个疏,幅值单位一个用mm/s²一个用dB。折腾了一下午,最终靠Matlab脚本把数据统一成三维矩阵,用surf、waterfall、contourf各出了一版图。这个流程踩过不少坑,今天就完整拆开讲讲:从仿真软件导出什么数据、Matlab怎么读、三维矩阵怎么组织,到瀑布图四种画法、工程级显示调优、转频线和阶次线叠加,最后附上我实际踩过的坑和排查方法。
这套内容适合两类人:一类是刚接触NVH的仿真工程师,对着导出的数据不知从哪下手;另一类是已经会画简单瀑布图,但想让图更专业、能直接放进报告里的朋友。只要你Matlab基础操作没问题,照着下面的思路走,基本半小时能出一张能看的图。
1. 瀑布图是什么,NVH分析为什么绕不开它
1.1 从一堆仿真曲线到一眼看穿整个变速工况
想象一个简单的工况:电机从1000 rpm匀加速到6000 rpm,整个过程持续5秒。如果你只看某一个转速下的频谱,只能知道“这个转速下有哪些峰值频率”;但共振不是只在一个转速点出现,它跟激励频率、结构固有频率是否匹配有关。随着转速上升,各个阶次的激励频率也在扫过结构固有频率,某个转速下幅值突然蹿高,就可能触发了共振。
一张图能同时容纳三个维度信息,就是瀑布图的核心价值:横轴是频率,纵轴是转速(或时间),高度(颜色)是响应幅值。这样一来,横线是恒定频率的共振带,斜线是随转速变化的阶次线,共振带和阶次线的交点往往就是临界转速。没有瀑布图,你得翻几十张频谱图肉眼对比,有了瀑布图,一眼扫过去全清楚了。
1.2 先分清你画的到底是哪种瀑布图
这里有个容易混淆的概念。工程里说的瀑布图其实至少有两种:
一种是把不同工况点(比如不同转速、不同测点、不同阻尼比)的频谱曲线在三维空间里等距排列,用z方向高度表示幅值,看起来像一排平行的“帘幕”,这种在模态测试里很常见,用来对比不同状态下频谱形状的变化。
另一种是Campbell图,也叫阶次瀑布图,纵轴是转速或时间,颜色/高度表示该时刻各频率分量的幅值,电驱NVH、转子动力学、发动机噪声分析都用这种。它强调的是“频率成分随转速/时间如何演化”,重点看斜线(阶次线)和竖线(结构共振)的交点。
本文重点讲第二种,因为Workbench的谐响应结果、Simcenter 3D的瞬态响应结果,做完后最常需要的就是这种Map图。但画法本身是通用的,理解了三维矩阵的组织方式,两种瀑布图都能画。
2. 仿真端的数据导出:Workbench与Simcenter 3D的准备工作
2.1 Workbench导出响应谱的两种常用姿势
用ANSYS Workbench做振动分析,最常遇到的情况是已经算完了谐响应(Harmonic Response),得到了某个节点或某个面上的位移/加速度/应力随频率变化的曲线。这时候导出数据要分两步走:
第一步,选对结果对象。在Solution下插入Frequency Response,选中你要监测的节点,或者直接选一个面然后取平均值。建议多选几个关键节点,因为实际共振点不一定在你最初猜的那个位置。我之前遇到过只看轴承座节点,结果真正的共振在端盖边缘,后来把几个候选节点的数据都导出来对比,才发现之前漏了重要信息。
第二步,设置输出选项。在Frequency Response的Details面板里,把Frequency Display设为Linear或Tabular,然后在Worksheet里把结果复制出来,或者右键导出为CSV/Excel格式。这里有个关键细节:Workbench默认按“频率—实部—虚部”导出,如果你要的是幅值,记得在设置里把Solution Display改成Amplitude。
如果是瞬态分析(Transient Structural),导出的就是每个时间步的位移/速度/加速度时域信号。这时候拿到的是时间序列,要做FFT才能转成频谱,工作量更大一点。但好处是时域数据包含了完整的启停过程,做Campbell图的信息量比单纯的稳态谐响应更丰富,后续处理的空间也大。
2.2 Simcenter 3D的数据导出与单位陷阱
Simcenter 3D(以前叫NX Nastran)在声振分析里用得非常多。做声学响应或振动响应分析后,结果文件里可以提取节点或单元在某频率段内的响应谱。
Simcenter 3D导出数据比Workbench稍微绕一点:在Post-Processing里打开Response,选Function->Export,可以输出成CSV、TXT或者RPC格式。如果你后续还要用其他软件,CSV和TXT是最稳妥的;如果数据量巨大,RPC格式更紧凑,但Matlab直接读RPC需要额外工具包,我一般建议直接导出CSV,省得给自己找麻烦。
单位问题一定要检查。Workbench默认用的单位制通常会在Quantity里标清楚,但Simcenter 3D里,你模型的单位制跟导出结果的单位可能不一致。我就遇到过模型用mm制建的,结果加速度导出来是m/s²,但频率轴是Hz,幅值轴单位没标,差点按mm/s²去读。建议导出后先看文件头部或者另存一份带单位说明的元数据,养成习惯。
另外Simcenter 3D的Frequency Response函数可以设置频率容差和干涉容差,导出的频率点可能是非均匀分布的。这意味着你导出的两个文件频率轴大概率不一样,后面Matlab里必须做重采样或者插值,这一步躲不掉。
2.3 数据落地规范,决定后面省不省心
我在处理仿真数据时有一个习惯,先把数据落成一个统一的目录结构:
NVH_Data/ 01_1000rpm/ acc_node_1.csv acc_node_2.csv 02_1500rpm/ acc_node_1.csv 03_2000rpm/ ...文件命名里带上转速或时间信息,后面Matlab批量读取时可以根据文件名自动提取工况参数,不用人工一个个维护参数表。导出的CSV内部格式也尽量统一:第一列频率,第二列实部,第三列虚部,或者第一列频率,第二列幅值。如果软件导出的格式不统一,我建议在Matlab读取时做一个标准化函数,统一字段名称,而不是在仿真软件里反复调整导出设置。数据管理规范一点,后面写脚本会省非常多时间。
3. 用Matlab批量读数据,整理成可绘图的三维矩阵
3.1 不要手工导Excel,用脚本批量读取
很多人习惯从Workbench里把数据复制到Excel,再手动在Matlab里xlsread。数据少还行,一旦有几十个转速工况点,手工操作不仅慢,还容易串行。实际上Matlab有一套非常成熟的批量读取流程,配合好点的文件命名规则,可以做到全自动。
下面是我常用的批量读取脚本片段:
% 批量读取NVH仿真导出的CSV文件 clear; clc; close all; % 设置数据目录 dataDir = 'NVH_Data'; fileList = dir(fullfile(dataDir, '*.csv')); % 预分配存储变量 freqData = {}; ampData = {}; rpmData = []; for i = 1:length(fileList) % 从文件名中提取转速,例如 01_1000rpm_acc_node_1.csv -> 1000 fileName = fileList(i).name; tokens = regexp(fileName, '(\d+)rpm', 'tokens'); if isempty(tokens) continue; end rpm = str2double(tokens{1}{1}); % 读取CSV raw = readmatrix(fullfile(dataDir, fileName)); % 假设第一列是频率,第二列是幅值 freq = raw(:, 1); amp = raw(:, 2); % 保存 freqData{end+1} = freq; %#ok<SAGROW> ampData{end+1} = amp; %#ok<SAGROW> rpmData(end+1) = rpm; %#ok<SAGROW> end % 排序转速(保证画图顺序正确) [rpmSorted, idx] = sort(rpmData); freqData = freqData(idx); ampData = ampData(idx);注意readmatrix在R2019a之后才有,如果你用旧版本Matlab,改用csvread或者importdata都可以。另外,dir返回的文件顺序不是按数字排序的,所以一定要做一次sort,否则画出来的图会出现转速乱跳的情况。
文件是中文路径的话,不同版本Matlab处理能力不同,有时候会读出乱码或者报错。我的建议是所有目录和文件名尽量用英文,省得折腾编码问题。
3.2 频率轴不一致?插值统一是必做步骤
不同工况点的数据,频率轴可能不一样,因为仿真软件的频率分辨率、输出点数量是随频率或转速变化的。如果你直接把原始频率和幅值丢给surf,Matlab要求X、Y、Z必须是网格点,各个工况点的频率轴不一致,根本构不成网格,画出来要么报错,要么图形很诡异。
所以必须先定义一个统一的频率轴,推荐用所有工况频率范围的并集,或者直接指定一个你关心的频段。比如:统一从0到2000 Hz,步长1 Hz。然后把每个工况的幅值通过插值映射到这个统一频率轴上。
% 定义统一的频率轴 freq_uniform = 0:1:2000; % 根据实际需要调整 % 插值到统一频率轴 amp_interp = zeros(length(rpmSorted), length(freq_uniform)); for i = 1:length(rpmSorted) amp_interp(i, :) = interp1(freqData{i}, ampData{i}, freq_uniform, 'linear', 0); end插值方法推荐linear,精度对瀑布图足够了。如果数据点很密,用spline会带来轻微的过冲,可能在峰值附近出现假的小毛刺;但如果数据点太少,linear又会丢失峰值细节,这时候需要结合原始仿真设置的频率步长来权衡。末端值设成0,表示在某个转速下,超出该工况实测范围之外的频率区间无响应。
如果你手上的数据本身就是不均匀频率点,也可以用griddata做更复杂的插值,但常规情况下interp1就够了。
3.3 三维矩阵的排列顺序,画出来不花的前提
拿到amp_interp矩阵后,需要构建三个网格矩阵:X是转速(纵轴),Y是频率(横轴),Z是幅值。注意:surf/waterfall/pcolor这类函数的接受方式是X、Y、Z三个同尺寸的矩阵。
% 构建网格矩阵 [X, Y] = meshgrid(rpmSorted, freq_uniform); Z = amp_interp';这里有个容易搞混的点:amp_interp的行是转速,列是频率;但meshgrid(rpmSorted, freq_uniform)生成的第一维(行)对应freq_uniform,第二维(列)对应rpmSorted,所以转置一下才能对上。很多人画出来图花成一团,就是这里行列搞反了。
转置之后,X(i,j)是某个频率的数值,Y(i,j)是某个转速的数值,Z(i,j)是对应的幅值。经常有人问为什么surf出来的坐标轴对不上,80%以上的原因是矩阵顺序错了,剩下的可能是数据没有排序。
4. 四种瀑布图画法,以及工程级显示设置的调优
4.1 surf与mesh:同套矩阵,两种观察逻辑
最直接的方式是用surf画彩色曲面图。面颜色代表幅值高低,视觉冲击力最强,适合在PPT和汇报里展示“哪里能量集中”。
figure('Color', 'w'); surf(X, Y, Z, 'EdgeColor', 'none', 'FaceAlpha', 0.95); xlabel('转速 (rpm)'); ylabel('频率 (Hz)'); zlabel('幅值 (mm/s^2)'); view(45, 30); colormap('turbo'); colorbar;view(45, 30)是我试过比较舒服的视角,既能看出三维起伏,又不至于把后端数据遮住太多。如果你想突出峰值,可以试试view(90, 0),相当于俯视投影,更像颜色图。
surf的坑在于,如果网格过密,曲面太复杂,旋转视角时会非常卡;如果网格过疏,共振带会变成一个一个的凸点,看不出连续分布。建议转速方向至少20到50个点,频率方向100到500个点就足够展示细节了,再多只会拖慢渲染。
如果文章或论文需要黑白打印,surf的彩色填充会变成一片灰,很难看清。这时候用mesh画线框图,靠线条的疏密变化来表达幅值高低,黑白打印后依然能读出来。
figure('Color', 'w'); mesh(X, Y, Z, 'EdgeColor', 'k', 'LineWidth', 0.5);mesh的视觉细节取决于网格多少,太密会变成一团黑,太疏又看不出变化。我通常先画surf做快速检查,确定没问题后再用mesh出黑白版,或者把两个都输出,看场景用哪个。
4.2 waterfall:最经典的“瀑布”效果实现
Matlab自带waterfall函数,专门用来画这种沿一个方向排列的谱线。它的效果是一组等转速间隔的曲线沿频率方向排列,看上去格外“工程”。很多专业NVH报告里的瀑布图就是这种风格。
figure('Color', 'w'); waterfall(X, Y, Z); xlabel('转速 (rpm)'); ylabel('频率 (Hz)'); zlabel('幅值'); colormap('parula');waterfall默认只在X方向画线,频率方向的连续性由颜色体现。如果希望每条频谱曲线更突出,可以把转速间距设得稀疏一点。但waterfall有一个小问题:当转速条数很多时,前面的线会遮挡后面的谱峰,导致局部亮点看不清。这时可以通过view(45, 50)稍微调高视角,让后方暴露更多。
这里有一个很多人不知道的细节:waterfall画出来的线的颜色默认是随幅值变化的,但如果你用quiver的方式去理解它,X和Y的方向跟我们习惯的“频率在横轴、转速在纵轴”其实可以通过view来调整。如果发现转速方向跑到了左右水平方向,可以交换X和Y,或者用set(gca,'YDir','reverse')调整视觉方向。
4.3 pcolor/contourf:俯视投影更适合定量判断
三维视角的瀑布图适合讲故事,但做定量判断——比如读出共振频率精确是多少、临界转速是多少——三维图并不方便,因为视线有透视畸变,很难直接从坐标轴上读准位置。这时候应该用俯视投影图。
俯视图有两种常用画法:pcolor和contourf。
figure('Color', 'w'); contourf(freq_uniform, rpmSorted, amp_interp, 40, 'LineStyle', 'none'); xlabel('频率 (Hz)'); ylabel('转速 (rpm)'); colormap('turbo'); colorbar;其实不需要构建三维网格矩阵,直接用freq_uniform、rpmSorted和amp_interp就能画。这就是俯视图比三维图更简单方便的地方。contourf后面那个40是等值线的层级数,层级越多颜色过渡越细腻,但太多也会让颜色条读起来费劲。我一般先用40层看整体,输出报告时换成20层,视觉效果更干净。
pcolor和contourf的区别是:pcolor是逐格填色,色块边界清晰,但数据量太大时显得马赛克感很强;contourf是对数据进行平滑插值后再填色,视觉上更连续、更像专业NVH软件的Map图。所以做俯视图,我推荐contourf为主,pcolor只在数据点极少、想要强调“这是离散仿真结果”时才用。
4.4 坐标轴视角、颜色映射与高清导出
把三维图和俯视图弄出来后,还要做一组统一的显示设置,才能保证图能放进报告里不用再返工。
坐标轴字号和方向:仿真图的坐标轴标签尽量用中文不加单位?不一定,行业报告里常用英文或中文都可以,但用户问的是可以直接复现的方法,坐标轴设置用你习惯的语言就行。
set(gca, 'FontName', 'Arial', 'FontSize', 11); grid on; box on;颜色映射推荐原因:Matlab老版本默认的jet色彩映射,虽然颜色鲜艳,但有两个知名缺点——黄绿色段亮度太高,容易把中等幅值区域显示得比实际更亮;而且颜色顺序在色觉障碍的人眼里很难区分。现在Matlab已经默认parula,另外我建议试试turbo,它更接近jet的层次但亮度分布更均匀,视觉上更清晰。
导出图片时,尽量避免直接print默认导出,分辨率低、字体发虚。推荐用exportgraphics,这是R2020a之后加入的函数,可以指定分辨率:
exportgraphics(gcf, 'campbell_diagram.png', 'Resolution', 300);如果你还用旧版Matlab,只能用print(gcf, '-dpng', '-r300', 'campbell_diagram.png')。打印导出最大的坑是尺寸:默认的figure在导出后,宽高比会和屏幕上看到的不一样,字体、线条比例都变了。建议在figure创建时就用set(gcf, 'Position', [100 100 800 600])或者直接指定Units='centimeters',把尺寸定好再导出。
还有一个细节:如果你最终要把图放在Word或者Latex里,背景色建议设成白色,不要用默认灰色背景。
5. 把瀑布图变成诊断图:叠加转频、阶次线与共振带
5.1 自动叠加转频线和倍频线
瀑布图的横轴是频率,纵轴是转速,这就有了一个天然的好处:转速和频率之间存在一个比例关系。对于旋转机械,1阶激励频率等于转速除以60(转速单位rpm,频率单位Hz),2阶、3阶同理。
在俯视图或者三维图上叠加转频线,马上就能看出“哪些峰值落在阶次线上,哪些是独立的共振带”。
% 在contourf图上叠加转频线和2倍转频线(适用于俯视图) hold on; order1 = rpmSorted / 60; order2 = 2 * rpmSorted / 60; plot(order1, rpmSorted, 'w--', 'LineWidth', 1.2); plot(order2, rpmSorted, 'w-.', 'LineWidth', 1.2);在图上白色虚线表示1阶,白色点划线表示2阶,这样既能看到激励频率的变化趋势,又能通过颜色带在白色线上的“亮斑”判断该阶次激励是否激发了结构共振。如果是电机噪声,还要关注电磁力波的主阶次,可能是某个极对数和槽数组合算出来的阶次,不是简单的整数阶。
有一个技巧:如果噪声峰值恰好落在2阶线上,说明该阶次激励与结构模态发生了共振耦合;或者在某个转速下峰值出现在线上但前后都没有连续性,说明该转速下存在稳健的模态参与。把这些亮斑和转速轴对应起来,就能锁定临界转速值。
5.2 用包络峰提取共振带,定位临界转速
叠加阶次线之后,肉眼能看出来哪里有“亮斑”,但写报告时需要定量结论。这时可以用包络峰值提取,自动找出每个频率下幅值的最大值,形成共振带包络线。
% 提取每个频率点的最大幅值及对应转速 [maxAmp, idxMax] = max(amp_interp, [], 1); rpm_at_max = rpmSorted(idxMax); % 在三维图上用深色粗线标出共振带 hold on; plot3(rpm_at_max, freq_uniform, maxAmp, 'k-', 'LineWidth', 2);这行代码非常实用。它把每个频率下响应最强的那个转速点连起来,形成一条脊线。如果瀑布图里有明确的共振带,脊线会在那个频带附近形成连续的峰值走廊。再往下,你还可以用findpeaks在某个转速切片里提取更精细的峰频,把共振频率做统计,这样报告里就能写“该结构在 340~360 Hz 区间存在明显共振,转速在 2100 rpm 时响应最剧烈”。
我建议用这个方式验证,而不是只用肉眼。仿真数据本身是确定的,峰值就是最大值,没有噪声干扰,所以包络法提取出来的是严格准确的共振走廊。
5.3 阶次切片:瀑布图之外的另一种常用视角
瀑布图看全局,但工程上还经常需要看“某一阶次随时间/转速的变化”。做法是在每个转速点,以该阶次的转频为中心,取一个窄频带内的能量积分或峰值,得到order slice曲线。
order = 2; % 2阶切片 halfBandwidth = 5; % 半带宽 Hz orderAmp = zeros(size(rpmSorted)); for i = 1:length(rpmSorted) centerFreq = order * rpmSorted(i) / 60; idxBand = find(abs(freq_uniform - centerFreq) <= halfBandwidth); if isempty(idxBand) orderAmp(i) = 0; else orderAmp(i) = max(amp_interp(i, idxBand)); end end figure('Color', 'w'); plot(rpmSorted, orderAmp, 'LineWidth', 1.5); xlabel('转速 (rpm)'); ylabel('2阶幅值 (mm/s^2)');这条曲线可以清楚地看到该阶次随转速变化的趋势:某段转速下陡增,说明进入了该阶次对应的共振区;某段转速下比较平缓,说明结构响应以其他阶次为主。这里带宽的选择很重要:带宽太窄,频率分辨率不够,可能漏掉峰值;太宽,又会把邻近阶次的能量混进来。一般取5~10 Hz,具体看你的频率轴分辨率,如果频率步长是1 Hz,取±5 Hz就足够稳定了。
这个阶次切片在电动驱动总成的NVH分析里很常用,比如“2阶电磁噪声在3000 rpm附近有峰”,这种结论就是靠order slice得到的。
6. 常见问题与排查技巧实录
6.1 画出来是乱线或麻布纹
最常见的现象:surf画出来像一团打结的蜘蛛网,根本看不出趋势。这个问题的根源几乎都是数据矩阵没有按顺序排列,或者插值矩阵的行列顺序搞反。
先检查转速数据有没有sort过,然后验证矩阵尺寸是否一致:
disp(size(X)); disp(size(Y)); disp(size(Z));三个矩阵必须完全一样。如果X和Y是通过meshgrid生成的但Z是原始转置过来的,尺寸可能会差个维度。另外,如果数据本身频率轴不均匀,没有插值就硬画,也会出现网格错乱。我之前有次数据是从Simcenter 3D导出的非均匀频率点,忘了插值,surf虽然没报错,但画出来像被撕碎的布片,插值之后立刻正常。
6.2 转速轴方向反了,或坐标轴比例失调
仿真数据经常是从高转速往低转速记录,比如先算6000 rpm再算1000 rpm。如果不排序,瀑布图整体会倒过来,转速轴大的在左边,小的在右边,看着很别扭。用sort之后就好了。
如果surf画出来,转速轴数值范围是1000到6000,频率轴是0到2000,Matlab会自动把X和Y轴的单位长度设成不一样,图形会偏扁或偏长。这时可以用axis equal强制等比例,但对于瀑布图未必合适,因为频率和转速单位不同,等比例通常会让图变得很丑。更推荐的做法是手动调整figure宽高比,让长轴水平放置,最终呈现效果会更协调。
6.3 幅值跨度太大,小信号被淹没
仿真响应中,共振峰值可能比背景高几个数量级。如果直接画线性幅值,瀑布图会呈现“一座尖峰,其他全是平地”。这时候有两个选择:
一是把幅值取对数或dB转换。振动噪声里常用20倍log10换算成dB:
amp_dB = 20 * log10(amp + eps);这样画出来的图更能展示较小幅值区域的细节,共振带和阶次线都更清楚。但注意,如果幅值里有0值或者负值,需要先做处理,加eps只是临时办法,最好先检查数据有效性。
二是对色彩映射做非线性变换,比如在contourf里设定等值线级别为指数分布,而不是线性分布:
levels = logspace(log10(minAmp), log10(maxAmp), 30); contourf(freq_uniform, rpmSorted, amp_interp, levels, 'LineStyle', 'none');这会让颜色条更关注大峰值,同时保留小信号的存在感。
6.4 数据量大,Matlab卡顿
三维图的数据量一大,比如转速点500个、频率点5000个,surf会非常卡,转个视角得等好几秒。这时我的经验是减少绘图点的数量,但保留原始数据分析:把矩阵做降采样画图,用原始矩阵做定量计算。
stepFreq = 5; % 每5个点取1个 stepRpm = 2; % 每2个转速取1个 plotFreq = freq_uniform(1:stepFreq:end); plotRpm = rpmSorted(1:stepRpm:end); plotZ = amp_interp(1:stepRpm:end, 1:stepFreq:end); surf(plotRpm, plotFreq, plotZ);降采样只是显示层面的操作,不影响最终定量结论。如果你真的需要在全分辨率下交互查看,可以考虑用pcolor代替surf,因为pcolor本质是平面贴图,渲染效率高很多。
这里整理一张常见问题速查表,方便以后排查:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 图形乱成蜘蛛网 | 数据未排序或矩阵行列不匹配 | sort转速;检查X/Y/Z尺寸一致 |
| 频率轴对不上 | 原始频率轴不一致 | 先插值到统一频率轴 |
| 转速方向反了 | 数据从高到低排列 | 用sort排序 |
| 颜色一片蓝或一片红 | 幅值量级差异过大 | 用dB或对数等值线层级 |
| 峰值不清晰 | 网格过疏或视角不对 | 增加层级数或调整view角度 |
| 导出图片模糊 | 分辨率不够 | 用exportgraphics 300dpi |
| 卡顿严重 | 数据点过多 | 降采样画图,原始数据全保留 |
6.5 颜色区分度不高,报告里看不清关键信息
这个不算报错,但很影响出图效果。如果你用的是jet色系,黄绿段和暗红段的亮度差异不大,打印成黑白后几乎分不出来。换成turbo或parula之后,对比度会有明显提升。
如果想让“峰值区域”更突出,可以自己定义colormap。比如希望高幅值区域显示为黑色,其他区域为灰色渐变,可以在出图前用colormap(gca, [zeros(1,3); gray(255)])来做一段自定义映射。这种方法在某些技术报告中非常有用,能让峰值区域非常醒目。
做了这么多次瀑布图,我最深的体会是:拿到数据后不要急着画,先花十分钟整理数据、统一单位、排序插值,后面能省几小时返工的力气。尤其是从Workbench和Simcenter 3D导出的数据,格式单位差异很大,这两步做好了,瀑布图基本就是水到渠成的事。
最后分享一个小技巧:如果你需要定期对不同的仿真结果出瀑布图,可以把整套读取、插值、绘制封装成函数,输入参数是数据目录和绘图选项,输出是图。以后换一组数据,一行命令就搞定了,不用每次都从头重写脚本。这也是我这套流程里最值钱的部分。