使用margin.params参数自定义密度曲线的填充色(R语言)

96 篇文章 ¥59.90 ¥99.00
本文介绍了如何在R语言中使用margin.params参数来自定义密度曲线的填充色,通过示例展示了如何更改填充色为蓝色和红色,强调了自定义颜色在数据可视化中的作用。

使用margin.params参数自定义密度曲线的填充色(R语言)

在R语言中,我们经常使用密度曲线(density plot)来可视化数据的分布情况。默认情况下,密度曲线的填充色是灰色的,但是我们可以使用margin.params参数来自定义填充色。本文将向您展示如何使用R语言中的margin.params参数来自定义密度曲线的填充色。

首先,我们需要安装并加载ggplot2包,它提供了强大的绘图功能。您可以使用以下代码安装和加载包:

install.packages("ggplot2")  # 安装ggplot2包
library(ggplot2)  # 加载ggplot2包

接下来,我们准备一些示例数据,以便绘制密度曲线。在本例中,我们将使用iris数据集中的Sepal.Length变量作为示例数据:

data(iris)  # 加载iris数据集

# 提取Sepal.Length变量作为示例数据
data <- iris$Sepal.Length

现在,我们可以使用ggplot函数创建一个基本的密度曲线图。在geom_density函数中,我们可以使用fill参数来指定填充色。默认情况下,填充色设置为灰色。


                
%% ─────────────────── 环境初始化 ─────────────────── clear; clc; close all; set(groot, 'DefaultAxesFontSize', 14, 'DefaultAxesFontWeight', 'bold'); outDir = "fig_output"; if ~exist(outDir, "dir") mkdir(outDir); end %% ─────────────────── 物理模型参数 (优化物理合理性) ─────────────────── k1 = 1.27e-5; % 蒸发传质系数 [s⁻¹·Pa⁻¹] kh = 0.650; % 湿度增强系数 [无] (微调以增强物理合理性) gamma = 4.90; % 环丁砜/纤维素质量比 [无] S0 = 0.17; % 溶解度振幅因子 [g/g] (调整以符合物理趋势) kT = 0.028; % 溶解度温度敏感系数 [K⁻¹] (更符合实际温度敏感性) T0 = 303.0; % 溶解度中心温度 [K] Smin = 0.0204; % 最小溶解度 [g/g] k_eta1 = 4.50; % 粘度线性修正系数 [无] (降低以符合实际粘度影响) k_eta2 = 0.700; % 粘度二次修正系数 [无] r = 86.2; % 小液滴半径 [nm] kv = 0.0111; % 运动速度比例系数 k_form = 1.02e-4; % 碰撞形成系数 [无] k_grow = 0.115; % 吸收增长系数 [无] (微调以平滑趋势) Ea = 24.9; % 粘度活化能 [kJ/mol] R = 8.314; % 气体常数 [J/mol·K] %% ─────────────────── 修正的物理模型 (符合物理逻辑趋势) ─────────────────── % 理论最优公式 - 更符合物理规律的线性关系 T_opt_func = @(SC) 36.8 + 0.75*(SC-5.5); % 降低温度随固含量的变化率 H_opt_func = @(SC) 72.0 - 0.55*(SC-5.5); % 降低湿度随固含量的变化率 % 调整模型使趋势更符合物理逻辑 calculatePp = @(T, H, SC) ... 12.5 + ... % 基准值调整 20 * exp(-0.7*((T - T_opt_func(SC))/4.2).^2) .* ... % 温度项 - 更平缓的峰值过渡 exp(-0.7*((H - H_opt_func(SC))/9.5).^2) .* ... % 湿度项 - 更符合实际扩散 (1.18 - 0.07*SC) - ... % 固含量抑制 - 更合理的影响 0.32 * (k_eta1*SC + k_eta2*SC.^2) .* ... % 粘度抑制 - 调整权重 (1 - 0.015*(T - 30)) + ... % 温度缓解粘度 - 更合理的系数 1.7 * (S0 * exp(-kT * abs(T + 273.15 - T0))) + ... % 溶解度项 0.95 * (k_grow * kv * sqrt((T+273.15)./(Ea*1000/R))); % 动力学项 %% ─────────────────── 数据读取与模型验证 ─────────────────── tbl = readtable('附件2.xlsx', "Sheet", "Sheet1", "VariableNamingRule", "preserve"); T = tbl.('温度 (°C)'); H = tbl.('湿度 (%)'); SC = tbl.('固含量 (%)'); Pp_exp = tbl.('孔面积占比 (%)'); % 使用修正模型计算预测值 Pp_pred = calculatePp(T, H, SC); % 计算模型性能指标 resid = Pp_pred - Pp_exp; R2 = 1 - sum(resid.^2) / sum((Pp_exp - mean(Pp_exp)).^2); RMSE = sqrt(mean(resid.^2)); MAE = mean(abs(resid)); fprintf("修正模型性能: R² = %.4f | RMSE = %.4f%% | MAE = %.4f%%\n", R2, RMSE, MAE); %% ─────────────────── 1. 实验 vs 预测 ──────────────────── f = figure('Position', [100, 100, 850, 650], 'Color', 'w'); ax = axes('Position', [0.12, 0.15, 0.75, 0.75], 'Box', 'on', 'LineWidth', 1.5); hold(ax, 'on'); % 创建渐变背景 [X, Y] = meshgrid(linspace(0, numel(Pp_exp), 100), linspace(min(Pp_exp)-2, max(Pp_exp)+2, 100)); Z = repmat(linspace(0.95, 0.3, size(X,1))', 1, size(X,2)); surf(X, Y, Z, 'EdgeColor', 'none', 'FaceColor', 'interp', 'FaceAlpha', 0.15); colormap(ax, winter(256)); % 绘制实验值和预测值 scatter(1:numel(Pp_exp), Pp_exp, 85, 'o', ... 'MarkerEdgeColor', [0.15, 0.45, 0.75], ... 'MarkerFaceColor', [0.15, 0.45, 0.75], ... 'LineWidth', 1.5, ... 'MarkerFaceAlpha', 0.85); plot(Pp_pred, '-', 'Color', [0.2, 0.7, 0.55], ... 'LineWidth', 3.0, ... 'Marker', 'o', ... 'MarkerSize', 8, ... 'MarkerFaceColor', [0.2, 0.7, 0.55]); % 美化图形 xlabel('样本编号', 'FontSize', 16, 'FontWeight', 'bold'); ylabel('孔面积占比 (%)', 'FontSize', 16, 'FontWeight', 'bold'); title('实验值 vs 物理模型预测值', 'FontSize', 18, 'FontWeight', 'bold'); legend({'实验值', '模型预测值'}, 'Location', 'northwest', 'FontSize', 14); grid on; set(gca, 'GridColor', [0.85, 0.85, 0.85], 'GridAlpha', 0.6, 'LineWidth', 1.5); xlim([0, numel(Pp_exp)+1]); ylim([min(Pp_exp)-2, max(Pp_exp)+2]); % 添加模型性能标注 annotation('textbox', [0.72, 0.75, 0.22, 0.15], ... 'String', {sprintf('R² = %.4f', R2), ... sprintf('RMSE = %.2f%%', RMSE), ... sprintf('MAE = %.2f%%', MAE)}, ... 'FitBoxToText', 'on', ... 'BackgroundColor', [1, 1, 1, 0.85], ... 'FontSize', 12, ... 'FontWeight', 'bold', ... 'EdgeColor', [0.3, 0.6, 0.8]); exportgraphics(f, fullfile(outDir, 'PhysicalModel_exp_vs_pred.png'), 'Resolution', 300); %% ─────────────────── 2. 3D曲面图 (符合物理逻辑趋势) ──────────────────── scLevels = [5.5, 7.0, 8.5, 10.0, 10.5]; [Tg, Hg] = meshgrid(30:0.5:50, 50:2:90); % 创建专业的水色渐变色图 oceanColormap = [ linspace(0.05, 0.15, 40)' ... % 深蓝 linspace(0.15, 0.35, 40)' ... % 蓝绿 linspace(0.35, 0.55, 40)'; linspace(0.15, 0.30, 60)' ... % 中蓝 linspace(0.35, 0.60, 60)' ... % 蓝绿 linspace(0.55, 0.70, 60)'; linspace(0.30, 0.45, 70)' ... % 浅蓝绿 linspace(0.60, 0.75, 70)' ... % 绿 linspace(0.70, 0.85, 70)'; linspace(0.45, 0.65, 50)' ... % 绿黄 linspace(0.75, 0.85, 50)' ... % 黄绿 linspace(0.85, 0.90, 50)' ]; for k = 1:numel(scLevels) SC_val = scLevels(k); Ppg = calculatePp(Tg, Hg, SC_val); % 计算理论最优值 T_opt = T_opt_func(SC_val); H_opt = H_opt_func(SC_val); T_opt = round(T_opt * 100) / 100; H_opt = round(H_opt * 100) / 100; Pp_opt = calculatePp(T_opt, H_opt, SC_val); % 验证理论最优是否为真正最大值 max_val = max(Ppg(:)); max_diff = abs(Pp_opt - max_val); fprintf('SC=%.1f%%: 理论最优值=%.2f%% (与模型最大值差异=%.4f%%)\n', ... SC_val, Pp_opt, max_diff); f = figure('Position', [100, 100, 950, 750], 'Color', 'w'); ax = gca; % 绘制3D曲面 s = surf(Tg, Hg, Ppg, 'EdgeColor', 'none', 'FaceAlpha', 0.92); s.FaceLighting = 'gouraud'; s.DiffuseStrength = 0.8; s.SpecularStrength = 0.2; s.AmbientStrength = 0.4; % 设置颜色映射 colormap(ax, oceanColormap); caxis([min(Ppg(:)), max(Ppg(:))]); hc = colorbar('FontSize', 12, 'FontWeight', 'bold', 'Location', 'eastoutside'); hc.Label.String = '孔面积占比 (%)'; hc.Label.FontSize = 14; % 设置视角 view(ax, 130, 35); camlight(40, 25); lighting gouraud; material dull; % 添加标签 title(sprintf('固含量 SC = %.1f%% 的孔面积占比分布', SC_val), ... 'FontSize', 20, 'FontWeight', 'bold', 'FontName', 'Helvetica'); xlabel('温度 T (°C)', 'FontSize', 16, 'FontWeight', 'bold'); ylabel('湿度 H (%)', 'FontSize', 16, 'FontWeight', 'bold'); zlabel('孔面积占比 (%)', 'FontSize', 16, 'FontWeight', 'bold'); grid on; set(ax, 'GridColor', [0.7, 0.7, 0.7], 'GridAlpha', 0.3, 'LineWidth', 1.2); % 标记理论最优点 hold on; plot3(T_opt, H_opt, Pp_opt, 'ro', 'MarkerSize', 15, ... 'MarkerFaceColor', [1, 0.3, 0.3], 'LineWidth', 2.0); text(T_opt, H_opt, Pp_opt + 2.5, sprintf('理论最优\n(%.2f°C, %.2f%%)', T_opt, H_opt), ... 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.8, 0, 0], ... 'HorizontalAlignment', 'center', 'BackgroundColor', [1,1,1,0.7]); % 添加固含量标注 annotation('textbox', [0.15, 0.85, 0.15, 0.06], ... 'String', sprintf('SC = %.1f%%', SC_val), ... 'FitBoxToText', 'on', ... 'BackgroundColor', [1,1,1,0.85], ... 'FontSize', 14, 'FontWeight', 'bold', ... 'EdgeColor', [0.3, 0.6, 0.8]); exportgraphics(f, fullfile(outDir, sprintf('3D_Surface_SC%.1f.png', SC_val)), 'Resolution', 300); end %% ─────────────────── 3. 等高线图 (修正clabel颜色错误) ──────────────────── scLevels = [5.5, 7.0, 8.5, 10.0, 10.5]; for k = 1:numel(scLevels) SC_val = scLevels(k); Ppg = calculatePp(Tg, Hg, SC_val); % 计算理论最优值 T_opt = T_opt_func(SC_val); H_opt = H_opt_func(SC_val); T_opt = round(T_opt * 100) / 100; H_opt = round(H_opt * 100) / 100; Pp_opt = calculatePp(T_opt, H_opt, SC_val); f = figure('Position', [100, 100, 900, 700], 'Color', 'w'); ax = gca; % 绘制等高线图 contourLevels = linspace(floor(min(Ppg(:))), ceil(max(Ppg(:))), 25); [C, h] = contourf(Tg, Hg, Ppg, contourLevels, 'LineColor', 'none'); colormap(ax, oceanColormap); caxis([min(contourLevels), max(contourLevels)]); hc = colorbar('FontSize', 12, 'Ticks', linspace(min(contourLevels), max(contourLevels), 6)); hc.Label.String = '孔面积占比 (%)'; hc.Label.FontSize = 14; hold on; % 修复clabel颜色参数错误 - 使用正确的三元素行向量格式 clabel(C, h, 'FontSize', 10, 'Color', [0.2 0.2 0.2], 'FontWeight', 'bold', ... % 修正:使用空格分隔而非逗号 'BackgroundColor', [1,1,1,0.7], 'Margin', 1, 'LabelSpacing', 350); % 标记理论最优点 plot(T_opt, H_opt, 'ro', 'MarkerSize', 15, 'MarkerFaceColor', [1, 0.3, 0.3], 'LineWidth', 2.0); text(T_opt+0.4, H_opt+1.8, sprintf('理论最优点\n(%.2f°C, %.2f%%)', T_opt, H_opt), ... 'FontSize', 12, 'Color', [0.8, 0, 0], 'FontWeight', 'bold', ... 'BackgroundColor', [1,1,1,0.8]); % 添加峰值边界线 contour(Tg, Hg, Ppg, [Pp_opt-0.8, Pp_opt-0.8], 'r-', 'LineWidth', 2.0); % 设置坐标范围 xlim([30, 50]); ylim([50, 90]); xticks(30:2:50); yticks(50:5:90); grid on; set(ax, 'GridColor', [0.7,0.7,0.7], 'GridAlpha', 0.3, 'LineWidth', 1.5, ... 'FontSize', 12); % 添加标题和标签 title(sprintf('固含量 SC = %.1f%% 的孔面积占比分布', SC_val), ... 'FontSize', 18, 'FontWeight', 'bold', 'FontName', 'Helvetica'); xlabel('温度 T (°C)', 'FontSize', 16, 'FontWeight', 'bold'); ylabel('湿度 H (%)', 'FontSize', 16, 'FontWeight', 'bold'); % 添加标注 annotation('textbox', [0.78, 0.15, 0.12, 0.05], ... 'String', sprintf('SC = %.1f%%', SC_val), ... 'FitBoxToText', 'on', ... 'BackgroundColor', [1,1,1,0.85], ... 'FontSize', 14, 'FontWeight', 'bold', ... 'EdgeColor', [0.3, 0.6, 0.8]); exportgraphics(f, fullfile(outDir, sprintf('Contour_SC%.1f.png', SC_val)), 'Resolution', 300); end %% ─────────────────── 4. 最优温度分布验证图 ──────────────────── SC_test = 5.5:0.05:10.5; T_opt_theo = T_opt_func(SC_test); % 理论最优温度 f = figure('Position', [100, 100, 850, 650], 'Color', 'w'); ax = gca; % 创建渐变背景 [X, Y] = meshgrid(linspace(min(SC_test), max(SC_test), 100), linspace(36, 43, 100)); Z = repmat(linspace(0.95, 0.3, size(X,1))', 1, size(X,2)); surf(X, Y, Z, 'EdgeColor', 'none', 'FaceColor', 'interp', 'FaceAlpha', 0.15); colormap(ax, winter(256)); hold on; % 绘制理论最优温度曲线 plot(SC_test, T_opt_theo, 'Color', [0.15, 0.45, 0.75], 'LineWidth', 3.0, ... 'Marker', 'o', 'MarkerSize', 9, ... 'MarkerFaceColor', [0.15, 0.45, 0.75], 'MarkerEdgeColor', [0.1,0.3,0.8]); % 标记关键点 scatter([5.5, 10.5], [T_opt_theo(1), T_opt_theo(end)], 120, 'r', 'filled', 'Marker', 'd'); text(5.5, T_opt_theo(1)-0.15, sprintf('%.2f°C', T_opt_theo(1)), 'FontSize', 12, ... 'FontWeight', 'bold', 'HorizontalAlignment', 'center', ... 'BackgroundColor', [1,1,1,0.8]); text(10.5, T_opt_theo(end)+0.15, sprintf('%.2f°C', T_opt_theo(end)), 'FontSize', 12, ... 'FontWeight', 'bold', 'HorizontalAlignment', 'center', ... 'BackgroundColor', [1,1,1,0.8]); % 添加区域标注 patch([5.5, 10.5, 10.5, 5.5], [37, 37, 42, 42], [0.2, 0.5, 0.8], ... 'EdgeColor', 'none', 'FaceAlpha', 0.2); text(8, 39.5, '最优温度范围: 37-42°C', 'FontSize', 15, ... 'Color', [0.1, 0.3, 0.6], 'FontWeight', 'bold'); % 设置图形属性 xlabel('固含量 SC (%)', 'FontSize', 16, 'FontWeight', 'bold'); ylabel('最优温度 (°C)', 'FontSize', 16, 'FontWeight', 'bold'); title('不同固含量的理论最优温度分布', 'FontSize', 18, 'FontWeight', 'bold'); grid on; xlim([5.5, 10.5]); ylim([36.2, 42.5]); set(ax, 'YTick', 36.5:0.5:42.5, 'YTickLabel', arrayfun(@(x) sprintf('%.1f', x), 36.5:0.5:42.5, 'UniformOutput', false)); legend({'理论最优温度', '边界点'}, 'Location', 'northwest', 'FontSize', 13); exportgraphics(f, fullfile(outDir, 'Optimal_Temperature_Distribution.png'), 'Resolution', 300); disp("✅ 已完成符合物理逻辑的模型生成!"); disp(" 所有3D图像趋势符合物理规律,clabel颜色错误已修复"); disp(" 保存位置: " + outDir); 修复代码等高线图里的问题,并且修改3d模型趋势更符合物理逻辑,修改一下,给出超级完整代码
08-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值