MATLAB 绘制带误差棒的拟合图:从入门到精通

article/2025/6/9 5:24:12

在科学研究和工程实践中,数据可视化是理解数据特性、验证模型假设的重要手段。今天,我们来深入探讨一种极具价值的数据可视化形式——带误差棒的拟合图,并手把手教你如何用 MATLAB 实现它。

一、什么是带误差棒的拟合图

带误差棒的拟合图是一种将原始数据点及其误差范围拟合模型曲线相结合的图表。

  • 数据点与误差棒 :图中的每个数据点代表观测值或实验结果,而误差棒则以线条形式从数据点向上下(或左右)延伸,直观展示数据的离散程度或不确定性。例如,在物理实验中,测量某个物理量多次,计算出平均值作为数据点,标准差作为误差棒长度。

  • 拟合曲线 :基于选定的数学模型(如线性模型、指数模型等),通过拟合算法得到最佳参数,绘制出一条平滑曲线,反映数据的整体变化趋势。

这种图表形式能让我们在一张图中同时观察数据的局部波动和全局规律,评估模型对数据的拟合效果。

二、带误差棒拟合图的用处

  1. 模型验证 :通过对比拟合曲线与数据点的吻合程度,判断所选模型是否适合描述数据。若大部分数据点落在拟合曲线附近,且误差棒范围与曲线无明显偏离,则模型具有较好的适用性。

  2. 不确定性分析 :误差棒清晰呈现数据的不确定性范围,帮助我们了解在不同输入条件下,输出结果可能出现的波动区间。这对于预测未来趋势、评估风险等具有重要意义,例如在金融领域预测股票价格波动,或在工程中评估结构承受载荷的安全范围。

  3. 结果展示与交流 :在学术论文、研究报告或项目展示中,带误差棒的拟合图能直观、简洁地传达实验结果和模型信息,使读者快速理解数据特点和研究结论,促进知识共享和讨论。

三、MATLAB 实现可视化

下面我们将对绘制带误差棒拟合图的 MATLAB 代码进行详细解释,让你轻松掌握每个关键步骤。

1. 数据准备

% 清空工作区和命令行
clear; clc;

在开始绘图前,先清空 MATLAB 工作区和命令行窗口,确保没有之前的变量干扰,相当于为新的绘图任务清理 “桌面”。 

% 1. 生成新的模拟数据
x = 5:1:15;  % 自变量(可理解为时间、频率等,步长为1)
mu = 2 * exp(0.25 * x);  % 理论模型的均值:指数增长关系 y = 2e^(0.25x)
sigma = 0.1 * mu;  % 设置每个点的标准差为其值的10%,模拟测量误差
y = mu + randn(size(mu)) .* sigma;  % 添加高斯噪声,模拟有误差的观测数据

这部分代码用于生成模拟数据,模拟真实的观测场景。

  • x 是自变量,相当于实验中的控制变量,比如时间、温度等,从 5 到 15,步长为 1。

  • mu 表示理论上期望的因变量值,按照指数增长关系y = 2e^(0.25x)计算得到,这相当于我们假设的真实模型。

  • sigma 定义每个数据点的标准差,这里设为mu的 10%,模拟测量过程中的误差大小。

  • y 则是在mu的基础上,添加了高斯噪声(随机波动)后的观测数据,更贴近实际测量中得到的数据情况。

% 验证数据:模拟独立于拟合区域的数据(比如“测试集”)
xv = 15 + rand(1,30)*3;  % 生成30个在 [15, 18] 区间内的随机点
yv = 2 * exp(0.25 * xv) + randn(1,30)*20;  % 添加较大的噪声模拟测量误差

生成验证数据,用于后续检验模型的外推能力。

  • xv 在区间 [15, 18] 内随机生成 30 个点,模拟新的实验条件或更广泛的输入范围。

  • yv 同样基于理论模型计算,并添加了更大的噪声(标准差为 20),模拟在新条件下测量的不确定性。

 2. 模型拟合

% 拟合指数模型: y = a * exp(b * x)
ft = fittype('a*exp(b*x)', 'independent','x');  % 定义拟合函数类型
fittedModel = fit(x', y', ft, 'StartPoint', [1 0.1]);  % 用起始值拟合模型,返回拟合结果

这是拟合模型的核心步骤。

  • fittype('a*exp(b*x)', 'independent','x') 定义了要拟合的模型类型为指数模型y = a*exp(b*x),并指定x为自变量。

  • fit(x', y', ft, 'StartPoint', [1 0.1]) 使用xy数据,根据指定的模型类型进行拟合。StartPoint 参数给出初始猜测的模型参数值a = 1b = 0.1,拟合算法将从这个起点出发,自动调整参数以最佳匹配数据。

% 为绘图生成平滑的拟合曲线
xf = linspace(5,15,200);  % 在拟合区间内生成200个点
yf = fittedModel.a * exp(fittedModel.b * xf);  % 根据拟合结果计算拟合曲线的 y 值

为了更直观展示拟合结果,我们需要绘制一条平滑的拟合曲线。

  • linspace(5,15,200)x的原始区间(5 到 15)内生成 200 个均匀分布的点,这些点将用于绘制更细腻的曲线。

  • yf = fittedModel.a * exp(fittedModel.b * xf) 根据拟合得到的模型参数ab,计算出对应xf处的拟合因变量值yf,从而得到一条与数据趋势相匹配的平滑曲线。

3. 绘图展示

% 2. 绘图
figure('Color','w'); hold on;  

创建一个新的绘图窗口,背景颜色设为白色('Color','w'),hold on 表示保持当前图形窗口,以便在后续代码中添加多个绘图元素。

% 绘制带误差棒的数据点(μ ± σ)
errorbar(x, y, sigma, 'ko', ...  'MarkerFaceColor',[0.8 0.8 0.8], ...  'LineWidth',1.2, 'CapSize',8);  

绘制带有误差棒的原始数据点。

  • errorbar(x, y, sigma, 'ko') 是绘制误差棒的关键函数,xy是数据点坐标,sigma是误差范围(误差棒长度),'ko'指定数据点标记为黑色圆圈(k代表黑色,o代表圆圈)。

  • 'MarkerFaceColor',[0.8 0.8 0.8] 设置圆圈内部填充颜色为浅灰色(RGB 值为 [0.8 0.8 0.8]),使其更易辨识。

  • 'LineWidth',1.2'CapSize',8 分别设置误差棒线条的宽度和末端横杠的大小,提升图形美观度。

% 绘制拟合曲线
plot(xf, yf, 'b-', 'LineWidth',2);  

在图中添加拟合曲线。

  • plot(xf, yf, 'b-', 'LineWidth',2) 使用蓝色实线('b-')绘制平滑的拟合曲线,线条宽度设为 2,使其清晰突出在图表中。

% 绘制验证数据点(透明蓝色)
scatter(xv, yv, 36, ...  % 点大小36'MarkerFaceColor',[0.5 0.7 1], ... 'MarkerEdgeColor','none', ...      'MarkerFaceAlpha',0.4);           

展示验证数据点。

  • scatter(xv, yv, 36, ... 用散点图形式绘制验证数据,点大小为 36。

  • 'MarkerFaceColor',[0.5 0.7 1] 给散点填充浅蓝色(RGB 值为 [0.5 0.7 1]),使其与原始数据点有所区分。

  • 'MarkerEdgeColor','none' 移除散点的边缘颜色,'MarkerFaceAlpha',0.4 设置填充颜色的透明度为 0.4,使图形层次感更强,便于观察数据分布关系。

4. 模型线与置信区间

xt = linspace(15,18,100);  % 用于绘制模型预测曲线的x值
yt = 2 * exp(0.25 * xt);  % 模拟理论模型的预测值(无拟合,仅原始模型)
% 置信区间设置为±10%
y_upper = yt * 1.1;  % 上界
y_lower = yt * 0.9;  % 下界

进行模型预测并计算置信区间。

  • xt = linspace(15,18,100)x的外推区间(15 到 18)生成 100 个点,用于展示模型在未直接测量区域的预测能力。

  • yt = 2 * exp(0.25 * xt) 按照原始理论模型计算出这些xt点对应的预测值yt

  • y_uppery_lower分别计算预测值的上下限,这里假设置信区间为±10%,即上界为预测值的 1.1 倍,下界为 0.9 倍,模拟模型预测的不确定性范围。

% 绘制预测模型曲线(红色虚线)
plot(xt, yt, 'r--', 'LineWidth',2);
% 绘制置信区间(绿色虚线)
plot(xt, y_upper, 'g--', 'LineWidth',1.5);
plot(xt, y_lower, 'g--', 'LineWidth',1.5);

将预测结果及其置信区间添加到图表中。

  • plot(xt, yt, 'r--', 'LineWidth',2) 用红色虚线('r--')绘制理论模型的预测曲线,宽度为 2,与拟合曲线形成对比,展示理论预期与实际拟合结果的关系。

  • plot(xt, y_upper, 'g--', 'LineWidth',1.5)plot(xt, y_lower, 'g--', 'LineWidth',1.5) 分别用绿色虚线绘制置信区间的上界和下界,宽度为 1.5,直观呈现模型预测的可信范围。

5. 图表美化与注释

% 4. 注释与排版美化
% 添加模型公式注释
text(6, 60, 'Model: y = 2e^{0.25x}', ...'FontSize', 12, 'FontAngle','italic');  
% 图表标题
title('Exponential Model Fit with Uncertainty', ...'FontWeight','bold', 'FontSize',14);  
% 坐标轴标签
xlabel('Time (s)', 'FontSize',12);  % x轴标题
ylabel('Measurement Value', 'FontSize',12);  % y轴标题
% 图例(按绘图顺序添加)
legend(...{'Data (\mu \pm \sigma)', ...  % 原始数据和误差棒'Fitted Curve', ...           % 拟合曲线'Validation Data', ...        % 验证数据点'Model Prediction', ...       % 理论模型'95% Confidence Interval'}, ...  % 模拟置信区间'Location','northwest', ...       % 位置:左上'FontSize',10);                   % 图例字体大小
% 添加网格和边框
grid on;    
box on;     
% 坐标轴样式设置
set(gca, 'FontSize', 11, 'LineWidth',1.2);  
% 增加图像周围留白
set(gca, 'LooseInset', get(gca,'TightInset') + [0.03 0.03 0.03 0.03]);
  • text(6, 60, 'Model: y = 2e^{0.25x}', ... 在图表坐标为(6,60)的位置添加文本注释。

  • 'FontSize', 12 设置字体大小为 12,'FontAngle','italic' 将字体设为斜体,使注释更符合数学公式排版习惯,增强图表专业性。

  • title('Exponential Model Fit with Uncertainty', ... 明确指出这是关于指数模型拟合且包含不确定性(误差棒)的图表。

  • 'FontWeight','bold''FontSize',14 使标题加粗并设置字体大小为 14,突出显示,吸引读者注意力。

  • xlabel('Time (s)', 'FontSize',12)ylabel('Measurement Value', 'FontSize',12) 分别将横轴标签设为 “时间(秒)”,纵轴标签设为 “测量值”,字体大小均设为 12,便于读者理解数据背景。

  • legend({... 列出图中各个元素对应的名称,包括带有误差棒的原始数据、拟合曲线、验证数据点、模型预测曲线以及置信区间。

  • 'Location','northwest' 将图例放置在图表的左上角(西北方向),'FontSize',10 设置图例字体大小为 10,使图表信息组织清晰,便于读者快速区分不同绘图元素的含义。

  • grid on 在图表上添加网格线,帮助读者更准确地估算数据点的位置和数值大小。

  • box on 绘制坐标轴边框,使图表结构更紧凑、规整,增强视觉稳定性。

  • set(gca, 'FontSize', 11, 'LineWidth',1.2) 将当前坐标轴(gca)的字体大小设为 11,线条宽度设为 1.2,使坐标轴刻度和标签更清晰易读,与整个图表风格协调统一。

  • set(gca, 'LooseInset', get(gca,'TightInset') + [0.03 0.03 0.03 0.03]) 获取当前坐标轴的紧凑内边距(TightInset),并在其基础上各方向增加 0.03 的留白量,重新设置为新的内边距(LooseInset),使图表内容有更充裕的空间展示,防止文字、线条等被截断或挤压,确保图表美观且信息完整呈现。

完整代码: 

% 清空工作区和命令行,防止变量冲突
clear; clc;
% 1. 生成新的模拟数据
x = 5:1:15;  % 自变量(可理解为时间、频率等,步长为1)
mu = 2 * exp(0.25 * x);  % 理论模型的均值:指数增长关系 y = 2e^(0.25x)
sigma = 0.1 * mu;  % 设置每个点的标准差为其值的10%,模拟测量误差
y = mu + randn(size(mu)) .* sigma;  % 添加高斯噪声,模拟有误差的观测数据
% 验证数据:模拟独立于拟合区域的数据(比如“测试集”)
xv = 15 + rand(1,30)*3;  % 生成30个在 [15, 18] 区间内的随机点
yv = 2 * exp(0.25 * xv) + randn(1,30)*20;  % 添加较大的噪声模拟测量误差
% 拟合指数模型: y = a * exp(b * x)
ft = fittype('a*exp(b*x)', 'independent','x');  % 定义拟合函数类型
fittedModel = fit(x', y', ft, 'StartPoint', [1 0.1]);  % 用起始值拟合模型,返回拟合结果
% 为绘图生成平滑的拟合曲线
xf = linspace(5,15,200);  % 在拟合区间内生成200个点
yf = fittedModel.a * exp(fittedModel.b * xf);  % 根据拟合结果计算拟合曲线的 y 值% 2. 绘图
figure('Color','w'); hold on;  
% 绘制带误差棒的数据点(μ ± σ)
errorbar(x, y, sigma, 'ko', ...  'MarkerFaceColor',[0.8 0.8 0.8], ...  'LineWidth',1.2, 'CapSize',8);  
% 绘制拟合曲线
plot(xf, yf, 'b-', 'LineWidth',2);  
% 绘制验证数据点(透明蓝色)
scatter(xv, yv, 36, ...  % 点大小36'MarkerFaceColor',[0.5 0.7 1], ... 'MarkerEdgeColor','none', ...      'MarkerFaceAlpha',0.4);           % 3. 模型线与置信区间(预测区域)
xt = linspace(15,18,100);  % 用于绘制模型预测曲线的x值
yt = 2 * exp(0.25 * xt);  % 模拟理论模型的预测值(无拟合,仅原始模型)
% 置信区间设置为±10%
y_upper = yt * 1.1;  % 上界
y_lower = yt * 0.9;  % 下界
% 绘制预测模型曲线(红色虚线)
plot(xt, yt, 'r--', 'LineWidth',2);
% 绘制置信区间(绿色虚线)
plot(xt, y_upper, 'g--', 'LineWidth',1.5);
plot(xt, y_lower, 'g--', 'LineWidth',1.5);% 4. 注释与排版美化
% 添加模型公式注释
text(6, 60, 'Model: y = 2e^{0.25x}', ...'FontSize', 12, 'FontAngle','italic');  
% 图表标题
title('Exponential Model Fit with Uncertainty', ...'FontWeight','bold', 'FontSize',14);  
% 坐标轴标签
xlabel('Time (s)', 'FontSize',12);  % x轴标题
ylabel('Measurement Value', 'FontSize',12);  % y轴标题
% 图例(按绘图顺序添加)
legend(...{'Data (\mu \pm \sigma)', ...  % 原始数据和误差棒'Fitted Curve', ...           % 拟合曲线'Validation Data', ...        % 验证数据点'Model Prediction', ...       % 理论模型'95% Confidence Interval'}, ...  % 模拟置信区间'Location','northwest', ...       % 位置:左上'FontSize',10);                   % 图例字体大小
% 添加网格和边框
grid on;    
box on;     
% 坐标轴样式设置
set(gca, 'FontSize', 11, 'LineWidth',1.2);  
% 增加图像周围留白
set(gca, 'LooseInset', get(gca,'TightInset') + [0.03 0.03 0.03 0.03]);

 最终实现带误差棒的拟合图:
 

四、总结

通过以上详细步骤,我们成功利用 MATLAB 绘制了一张信息丰富、专业美观的带误差棒拟合图。这种图表不仅能直观展示数据的测量值及其不确定性,还能清晰呈现模型拟合效果和预测能力,在科学研究、数据分析、工程实践等领域具有广泛应用价值。掌握这一技能,将帮助你更有效地处理数据、验证模型并传达研究结果。无论是学术研究论文、项目报告还是日常数据探索,带误差棒的拟合图都将成为你手中强有力的可视化工具,助你深入洞察数据背后的规律与故事。

希望这篇教程对你有所帮助,让你在 MATLAB 数据可视化之旅中更进一步!如果你有任何问题或想法,欢迎在评论区交流探讨。

 


http://www.hkcw.cn/article/ysEXJCgYiU.shtml

相关文章

[面试精选] 0206. 反转链表

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 206. 反转链表 - 力扣(LeetCode) 2. 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 3. 题目示例 示例 1 :…

“香会”现场,中方代表发声!

第22届香格里拉对话会正在新加坡举行中国人民解放军国防大学代表团成员张弛在现场回应一系列焦点问题解放军打“独”促统不停步!在今年的香格里拉对话会上,台湾问题多次被提及。对此,张弛表示,“台独”分裂与台海和平是水火不容的,赖清德当局一年多来大肆挑动两岸的对立对…

乌总统顾问:备忘录未来实施恐困难重重

俄罗斯方面5月30日称,俄代表团已经准备好在6月2日与乌克兰开启第二轮谈判,希望双方能就和平协议备忘录内容进行讨论。乌克兰官员5月31日表示,由于俄罗斯未公开备忘录内容,乌方猜测大概率与俄方官员此前声明并无差异,未来实施备忘录内容可能困难重重。乌克兰总统办公室主任…

夺冠、庆祝、然后被捕……昨夜巴黎街头如“战场”

5月31日,法甲球队巴黎圣日耳曼5比0大胜意甲球队国际米兰,捧起本赛季欧冠联赛冠军奖杯。彻夜狂欢的法国球迷聚集在巴黎香榭丽舍大街及“大巴黎”主场王子公园一带。据巴黎警方消息,至午夜已有至少81人因滋事被捕。户外烟花声、鸣笛声、欢呼声不绝于耳,间或传来警笛声。据法媒…

基于联咏平台NT985XX 编码配置及常见问题解析

一、概述 hd_videoenc 的主要目的是从上层单元获取图像原始数据,并控制视频编码器对该图像进行编码,输出码流后可用于保存档案或进行在线串流。 二、HDAL interface介绍 这部分可以直接参考 video_record.c 这支 sample code, 开启与关闭…

【PCI】PCI入门介绍(包含部分PCIe讲解)

先解释一下寻址空间: 机器是32bit的话,意味着4G(2的32次方)寻址空间,内存条作为它的实际物理存储设备。大部分在跑内存程序运行,少部分用来存放其他东西。这是一个常见的4G寻址空间分布(不一定是…

中方批美印太战略:除了挑事端搞乱亚太毫无建树

中方批美“印太战略”:除了挑事端 搞乱亚太 毫无建树5月31日,在新加坡出席香格里拉对话会的中国国防大学教授孟祥青在接受总台记者采访时表示,美国在对话会中制造地区分裂,但是东盟国家更关注合作和发展,这才是地区国家的共同心声。var chan_v_w = 960,chan_v_h = 540,cha…

【NLP 78、手搓Transformer模型结构】

你以为走不出的淤泥,也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑,它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…

Attention GhostUNet++ 混合的U-Net

最近看到一个全新的分割网络,虽然这个网络并没有发在什么顶级期刊,但是思路还是有点意思的。它是一个混合结合。他将所有的基本都组合在一起了。大家看名字就可以看出来。

C++23 已移除特性解析

文章目录 引言C23 已移除特性介绍1. 垃圾收集的支持和基于可达性的泄漏检测(P2186R2)背景与原理存在的问题移除的影响 2. 混合宽字符串字面量拼接非良构(P2201R1)宽字符串编码概述混合拼接的问题示例分析移除的意义 3. 不可编码宽…

CTFHub-RCE 命令注入-过滤cat

观察源代码 代码里面可以发现过滤了cat 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 打开flag文件 我们尝试将cat转义打开这个文件 127.0.0.1|c\a\t flag_6562854712907.php 可是发现 文本内容显示不出来,所以怀…

Dota2参议院与递增的三元子序列:算法揭示策略与模式的双重世界

博客引言: 在我们的生活中,策略与模式无处不在,它们既是解决问题的关键,也是揭示隐藏规律的钥匙。今天,我们将通过两个有趣的问题,探索算法如何在策略博弈与模式识别中发挥作用。 首先,我们将…

ShenNiusModularity项目源码学习(31:ShenNius.Admin.Mvc项目分析-16)

关键词管理页面用于新建、维护、删除、导入/导出系统CMS管理模块的关键词,关键词信息用于匹配CMS管理模块新建的文章内容中相同的信息,使其点击文章中的关键词时可以跳转到关键词关联的链接。关键词管理页面的后台控制器类KeywordController位于ShenNius…

ESP32-idf学习(三)esp32C3连接iot

一、前言 上一篇用蓝牙作为通信方式,虽然勉强完成了控制,但结果显然不是那么符合我们的预期,既然用蓝牙还需要研究一段时间,那我们就先整一些现成的,不需要研究的!iot云平台!这里当然也是通过w…

五芳斋陷多重困局 业绩下滑与库存压力增大

端午节期间,五芳斋面临了多重挑战。2024年公司营收和净利润双双下滑,分别下降超过14%,依然高度依赖粽子销售。市场方面,公司遭遇代工企业“蜜枣粽异物”风波,品牌形象受损。此外,公司给股东送粽子礼盒的举动被网友解读为清理库存,股价也连续下跌,5月30日更是收跌超7%。…

儿童节愿我们永葆童真 留住那份纯真好奇

今天是六一儿童节,每个孩子都会慢慢长大,而每个大人也都曾是孩子。在岁月的流逝中,那颗童心始终未变。愿我们永远保持童真和对这个世界的爱与好奇,快乐、灿烂、温暖、纯粹,一直可爱。责任编辑:zhangxiaohua

python里面导入yfinance的时候报错

我的代码: import yfinance as yf import os proxy http://127.0.0.1:7890 # 代理设置,此处修改 os.environ[HTTP_PROXY] proxy os.environ[HTTPS_PROXY] proxydata yf.download("AAPL",start"2010-1-1",end"2021-8-1&quo…

window桌面任务栏不见了鼠标移动底部无响应命令重启资源管理器无效解决办法

首先虽然重启是万能的,但是我不想重启啊大哥 以前喜欢用taskkill /f /im explorer 然后start explorerwindow11竟然没效果 ,所以ctrlaltdel 任务管理器 直接找到资源管理器右击重启,发现好了 {C44C69DC-D2BB-4E68-9F11-0AC2E2B5300B}.png 另外 ctrlwinsh…

Rollup打包输出产物遇到的一个坑。(分享心得)

文章目录 前言一、rollup的generateBundle钩子?二、遇到bug之前三、bug解决总结 前言 本人在学习过程中,发现一个基于vite的项目,在打包的过程中遇到了一个bug,就是我在学习开发一个vite插件功能,我需要获取到打包的产…

杭州一凶宅竞拍14轮后七五折成交 低价吸引买家

5月30日,杭州富阳区丁香花园蓝庭5号1703室房源在法拍平台上进行拍卖。该房源建成于2007年前后,建筑面积为200.73平方米,是一套东边套顶跃结构的房子。一层布局为二室三厅一厨二卫南北双阳台,二层则有一室(带书房、走入式衣柜)、一卫、一储藏室、一阳台和两露台。房子评估…