【Matlab高端绘图SCI绘图模板】第001期 绘制帕累托图(Pareto)

1简介

本文介绍了如何使用Matlab实现绘制帕累托图,包括数据准备、特征因素排序、计算累计频率百分比、筛选核心特征。通过实例展示了帕累托图的绘制过程,适用于数据分析和论文写作。

帕累托图(Pareto chart)是将出现的质量问题和质量改进项目按照重要程度依次排列而采用的一种图表。以意大利经济学家V.Pareto的名字而命名的。帕累托图又叫排列图、主次图,是按照发生频率大小顺序绘制的直方图,表示有多少结果是由已确认类型或范畴的原因所造成。

2 绘制帕累托图的步骤

帕累托图是一种直方图,用于显示按重要性递减排列的因素的贡献。它基于帕累托法则,该法则表明80%的问题通常来自于20%的原因。绘制帕累托图的步骤包括:

(1)收集数据: 收集与问题或现象相关的数据,确保数据是可度量和可分类的。

(2)分类和排序: 将数据按照其贡献的重要性进行分类和排序。通常,这是按照贡献的大小进行的。

(3)绘制条形图: 使用条形图表示每个类别的贡献。类别按照重要性递减的顺序排列。

(4)添加累积百分比线: 添加一条表示累积百分比的线,以显示贡献的累积效果。

(5)分析结果: 通过帕累托图,可以清晰地看到哪些因素对整体有重大影响,使决策者能够更有针对性地解决问题。

3 整体效果图 

4 关键代码展示:

%% 细节优化

% 对象属性调整

% 柱属性

p(1).BarWidth = 0.5;

p(1).LineWidth = 1; 

p(1).FaceColor = C1;

p(1).FaceAlpha =

%% Q4.m —— 多目标遗传算法 + 传输矩阵 + 斯特藩–玻尔兹曼 clear; clc; %% 1. 读取 nk 数据并清洗(按你的本地路径) dataStruct.PDMS = cleanData(readmatrix('C:\Users\Administrator\Desktop\亚太杯代码\Zhang-10-1-0.4-20μm.csv')); % [wl, n, k] dataStruct.PMMA = cleanData(readmatrix('C:\Users\Administrator\Desktop\亚太杯代码\Zhang-MitsubishiPMMA.csv')); dataStruct.Ag = cleanData(readmatrix('C:\Users\Administrator\Desktop\亚太杯代码\CiesielskiAg.csv')); dataStruct.SiO2 = cleanData(readmatrix('C:\Users\Administrator\Desktop\亚太杯代码\Herguedas-SiO1.92.csv')); dataStruct.TiO2 = cleanData(readmatrix('C:\Users\Administrator\Desktop\亚太杯代码\KischkatTIO2.csv')); %% 2. 读取成本、密度、加工费 costTbl = readtable('C:\Users\Administrator\Desktop\成本-密度.xlsx', ... 'Sheet',1, ... 'VariableNamingRule','preserve'); % Excel 里的真实列名(注意带下标 ₂) rawNames = {'Ag','PMMA','SiO₂','TiO₂','PDMS'}; % 在代码中统一使用的名字(不带下标) stdNames = {'Ag','PMMA','SiO2','TiO2','PDMS'}; for i = 1:numel(rawNames) colName = rawNames{i}; % 表格中的列名,例如 'SiO₂' fieldName = stdNames{i}; % matProp 中用的字段名,例如 'SiO2' % 三行分别是:成本 / 密度 / 加工费 costStr = costTbl{1,colName}; % 第一行:成本 densStr = costTbl{2,colName}; % 第二行:密度 procStr = costTbl{3,colName}; % 第三行:加工费 % 提取数字 matProp.(fieldName).cost = extractNumber(costStr); % $/kg densVal = extractNumber(densStr); % g/mL matProp.(fieldName).rho = densVal * 1000; % kg/m^3 matProp.(fieldName).proc = extractNumber(procStr); % $/m^2 end %% 3. 基本物理参数与波长网格 sigma = 5.670374e-8; % 斯特藩–玻尔兹曼常数 Ts = 320; % K,器件表面温度 Tenv = 300; % K,环境等效温度 lambda = linspace(8,13,101); % μm,大气窗口 8–13 μm %% 4. 三层膜材料组合:PDMS 固定为中间层,Ag 只做基底 materialCombos = { {'PMMA','PDMS','SiO2'}; {'PMMA','PDMS','TiO2'}; {'SiO2','PDMS','PMMA'}; {'SiO2','PDMS','TiO2'}; {'TiO2','PDMS','PMMA'}; {'TiO2','PDMS','SiO2'}; }; %% 5. 遗传算法参数(厚度范围在循环里按材料设置) options = optimoptions('gamultiobj',... 'PopulationSize', 80, ... 'MaxGenerations', 80, ... 'UseParallel', false, ... 'Display','iter'); %% 6. 对每个材料组合进行多目标优化 for c = 1:numel(materialCombos) mats = materialCombos{c}; % 比如 {'PMMA','PDMS','SiO2'} % === 6.0 根据材料类型设置每一层的厚度上下限 === lb = zeros(1,3); ub = zeros(1,3); for j = 1:3 matName = mats{j}; switch matName case 'PDMS' % PDMS 厚度 50–80 μm lb(j) = 50; ub(j) = 80; case 'PMMA' % PMMA 厚度 50–100 μm lb(j) = 50; ub(j) = 100; case {'SiO2','TiO2'} % SiO2 / TiO2 厚度 0.1–0.5 μm lb(j) = 0.1; ub(j) = 0.5; otherwise % 理论上不会进入,因为 Ag 不在材料组合里 lb(j) = 0.1; ub(j) = 1.0; end end % ==================================================== % 多目标目标函数 [成本, -冷却功率] fitnessFcn = @(d) multiObjFun(d, mats, lambda, ... matProp, dataStruct, sigma, Ts, Tenv); fprintf('=== 正在优化组合 %d: %s / %s / %s ===\n', ... c, mats{1}, mats{2}, mats{3}); [xPareto, fPareto] = gamultiobj(fitnessFcn, 3, ... [],[],[],[], lb, ub, [], options); % 存储原始 Pareto 结果(可选) result(c).materials = mats; result(c).xPareto = xPareto; result(c).fPareto = fPareto; %% 6.1 不再限制冷却功率,直接输出所有 Pareto 解到 Excel Ctotal = fPareto(:,1); % 成本 Pcool = -fPareto(:,2); % 冷却功率(目标里是 -Pcool) rows = size(xPareto,1); mat1 = repmat(string(mats{1}), rows, 1); mat2 = repmat(string(mats{2}), rows, 1); mat3 = repmat(string(mats{3}), rows, 1); T = table(mat1,mat2,mat3, ... xPareto(:,1),xPareto(:,2),xPareto(:,3), ... Ctotal, Pcool, ... 'VariableNames',{'Layer1','Layer2','Layer3', ... 'd1_um','d2_um','d3_um', ... 'Cost_USD_m2','Pcool_W_m2'}); filename = sprintf('Combo_%d_results.xlsx', c); writetable(T, filename); fprintf('组合 %d 已输出到 %s(所有 Pareto 解)。\n', c, filename); end disp('所有组合的 Pareto 结果已输出到当前文件夹的 Excel 文件。'); %% ========= 辅助函数区域 ========= function data = cleanData(raw) % 去掉 NaN 行并按波长升序排序 data = raw; data = data(~any(isnan(data),2),:); data = sortrows(data,1); end function num = extractNumber(str) % 从类似 "2.1美元" 这种字符串里提取数字 2.1 if iscell(str) str = str{1}; end str = char(str); % 转为 char 方便正则处理 pat = '[0-9.]+'; tok = regexp(str, pat, 'match'); if isempty(tok) num = NaN; else num = str2double(tok{1}); end end function f = multiObjFun(d, mats, lambda, matProp, dataStruct, sigma, Ts, Tenv) % 多目标: f = [成本, -冷却功率] % 1. 用 TMM 计算 8–13 μm 光谱发射率 eps_lambda = calcEmissivityTMM(mats, d, lambda, dataStruct); % 2. 有效发射率(简单平均) eps_eff = mean(eps_lambda); % 3. 冷却功率(Stefan–Boltzmann 简化) deltaP_bb = sigma*(Ts^4 - Tenv^4); Pcool = eps_eff * deltaP_bb; % 4. 成本计算(按 1 m^2 面积) C_total = 0; for j = 1:3 matName = mats{j}; % 如 'SiO2' p = matProp.(matName); rho = p.rho; % kg/m^3 c = p.cost; % $/kg cpr = p.proc; % $/m^2 dj_m = d(j)*1e-6; % μm -> m mass = rho * dj_m * 1; % 面积 = 1 m^2 C_total = C_total + c*mass + cpr; end % 5. 返回多目标 f = [C_total, -Pcool]; end function eps_lambda = calcEmissivityTMM(mats, d, lambda, dataStruct) % mats: {'PDMS','SiO2','TiO2'} 等 % d : [d1,d2,d3],单位 μm % lambda: 波长数组,单位 μm Nlambda = numel(lambda); eps_lambda = zeros(1,Nlambda); for k = 1:Nlambda lam = lambda(k); % 1) 各层复折射率 n_layers = zeros(1,numel(mats)); for j = 1:numel(mats) matName = mats{j}; nkData = dataStruct.(matName); % [wl, n, k] wl = nkData(:,1); ncol = nkData(:,2); kcol = nkData(:,3); n_real = myInterp1(wl, ncol, lam); k_imag = myInterp1(wl, kcol, lam); n_layers(j) = n_real + 1i*k_imag; end % 2) 基底 Ag 的复折射率(只做底层,不出现在 mats 里) nkAg = dataStruct.Ag; wlA = nkAg(:,1); nAcol = nkAg(:,2); kAcol = nkAg(:,3); nA = myInterp1(wlA, nAcol, lam); kA = myInterp1(wlA, kAcol, lam); n_sub = nA + 1i*kA; % 3) 传输矩阵 M = eye(2); for j = 1:numel(mats) n_j = n_layers(j); eta_j = 1/n_j; delta_j = 2*pi*n_j*d(j)/lam; % 注意 d 和 lam 都是 μm Mj = [cos(delta_j), 1i*sin(delta_j)/eta_j; 1i*eta_j*sin(delta_j), cos(delta_j)]; M = M * Mj; end % 4) 计算等效反射系数 n0 = 1; % 空气 eta0 = 1/n0; etas = 1/n_sub; % 基底 Ag num = eta0*M(1,1) + eta0*etas*M(1,2) - M(2,1) - etas*M(2,2); den = eta0*M(1,1) + eta0*etas*M(1,2) + M(2,1) + etas*M(2,2); r = num / den; R = abs(r)^2; % 5) 发射率 = 1 - 反射率(无透射) eps_lambda(k) = max(0, min(1, 1-R)); % 截断数值误差到 [0,1] end end function vq = myInterp1(x, v, xq) % 简单的一维线性插值 + 线性外推,避免使用内置 interp1 % x: N×1 单调(升序),v: N×1,xq: 标量 x = x(:); v = v(:); % 如果只一个点,直接返回 if numel(x) == 1 vq = v(1); return; end % 保证 x 升序 [x, idx] = sort(x); v = v(idx); if xq <= x(1) % 左侧外推 vq = v(1) + (v(2)-v(1)) * (xq - x(1)) / (x(2) - x(1)); elseif xq >= x(end) % 右侧外推 vq = v(end-1) + (v(end)-v(end-1)) * (xq - x(end-1)) / (x(end) - x(end-1)); else % 区间内线性插值 i = find(x <= xq, 1, 'last'); if i == numel(x) i = numel(x) - 1; end x1 = x(i); x2 = x(i+1); v1 = v(i); v2 = v(i+1); t = (xq - x1)/(x2 - x1); vq = v1 + t*(v2 - v1); end end 将这个代码的绘制全部改掉,根据计算数据或者上传数据,出归一化光谱热,对比多种材料(如不同配方、厚度)的光谱发射率 / 反射率分布,用颜色梯度体现数值差异,替代多折线的视觉混乱。冷却功率类数据,用响应面 3D ,展示冷却功率随两个关键变量(如材料厚度 d、填充率 f)的三维分布,直观呈现 “最优参数区域”。还出小提琴,展示多组冷却功率数据的 “分布特征”(如不同批次实验、不同环境条件下的冷却功率分布),替代传统误差棒,更全面体现数据离散度和概率密度。雷达,综合评价材料的 “多维度性能”(如太阳反射率、大气窗口发射率、冷却功率、机械强度、成本),替代传统的 “多列数据表格”。对于光谱发射率反射率采用堆叠面积 - 折线组合,展示光谱参数(ε/ρ)在不同波长区间的 “贡献占比”(如大气窗口 / 太阳光谱区的积分贡献),同时保留原始光谱趋势。 将以上集中全部根据上传的 代码和数据进行改写代码,编纂出matlab完整代码,并且绘图要求能够复合sci和nature的绘图质量
11-24
使用MATLAB绘制高端有多种方法,以下是不同类型高端绘制方式: ### 对比绘柱状 可采用3组实验对比的效果展示,代码已调试好,只需替换数据即可生成相关柱状。代码涵盖从数据准备到最终像输出的全过程,包括文件读取、颜色自定义、形界面设置、数据可视化以及像导出等关键步骤。用户能够生成既美观又精确的数据可视化表,还可通过获得Nature配色的柱状提升论文档次,也能根据需求修改数据读取范围和颜色设置,以适应不同的数据集和视觉喜好[^1]。 ### 美化折线 以下是美化折线的代码示例: ```matlab % 将每个数据用o标记 plot(x(1,:),x(2,:),'-o','MarkerIndices',1:1:length(x(2,:))) % 将y的值写在每个数据的正上方 text(x(1,:),x(2,:),{'0.48','0.18','0.06','0.03','0.08'},'Color','b','FontSize',11,'HorizontalAlignment','center',... 'VerticalAlignment','bottom') % 继续 hold on % 将每个数据用*标记 plot(x(1,:),x(3,:),'-o','MarkerIndices',1:1:length(x(3,:)),'Marker','*') % 设置x坐标轴的值 xticks(x(1,:)) xticklabels({'2017年','2018年','2019年','2020年','2021年'}) % 加上y轴标题 ylabel('单位(万亿元)') % 加上例的名称 legend('全国性AMC资产增加额','商业银行处置不良资产规模') % 将y的值写在每个数据的正上方,即加上数据标签 text(x(1,:),x(3,:),{'1.4','2','2','3.02','3.13'},'Color','r','FontSize',11,'HorizontalAlignment','center',... 'VerticalAlignment','bottom') ``` 此代码通过标记数据点、添加数据标签、设置坐标轴和例等方式,让折线更加美观和清晰[^2]。 ### 绘制高端大气的分组矩阵 为使绘图更加好看,可使用`fisher.mat`中的数据绘图,该数据第一列即为分组情况。以下是绘图代码示例: ```matlab % 导入数据 load Fisher.mat group=Fisher(:,1); pntSet=Fisher(:,2:end); % 绘图 pp=pairplot(pntSet,group); pp=pp.draw(); ``` 上述代码通过加载特定数据集并使用`pairplot`函数绘制分组矩阵,让形更具专业性和高端感[^3]。 ### 绘制帕累托 帕累托Pareto chart)是将出现的质量问题和质量改进项目按照重要程度依次排列而采用的一种表,又叫排列、主次,是按照发生频率大小顺序绘制的直方,表示有多少结果是由已确认类型或范畴的原因所造成[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值