在科学研究和工程实践中,数据可视化是理解数据特性、验证模型假设的重要手段。今天,我们来深入探讨一种极具价值的数据可视化形式——带误差棒的拟合图,并手把手教你如何用 MATLAB 实现它。
一、什么是带误差棒的拟合图
带误差棒的拟合图是一种将原始数据点及其误差范围与拟合模型曲线相结合的图表。
-
数据点与误差棒 :图中的每个数据点代表观测值或实验结果,而误差棒则以线条形式从数据点向上下(或左右)延伸,直观展示数据的离散程度或不确定性。例如,在物理实验中,测量某个物理量多次,计算出平均值作为数据点,标准差作为误差棒长度。
-
拟合曲线 :基于选定的数学模型(如线性模型、指数模型等),通过拟合算法得到最佳参数,绘制出一条平滑曲线,反映数据的整体变化趋势。
这种图表形式能让我们在一张图中同时观察数据的局部波动和全局规律,评估模型对数据的拟合效果。
二、带误差棒拟合图的用处
-
模型验证 :通过对比拟合曲线与数据点的吻合程度,判断所选模型是否适合描述数据。若大部分数据点落在拟合曲线附近,且误差棒范围与曲线无明显偏离,则模型具有较好的适用性。
-
不确定性分析 :误差棒清晰呈现数据的不确定性范围,帮助我们了解在不同输入条件下,输出结果可能出现的波动区间。这对于预测未来趋势、评估风险等具有重要意义,例如在金融领域预测股票价格波动,或在工程中评估结构承受载荷的安全范围。
-
结果展示与交流 :在学术论文、研究报告或项目展示中,带误差棒的拟合图能直观、简洁地传达实验结果和模型信息,使读者快速理解数据特点和研究结论,促进知识共享和讨论。
三、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])
使用x
和y
数据,根据指定的模型类型进行拟合。StartPoint
参数给出初始猜测的模型参数值a = 1
和b = 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)
根据拟合得到的模型参数a
和b
,计算出对应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')
是绘制误差棒的关键函数,x
、y
是数据点坐标,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_upper
和y_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 数据可视化之旅中更进一步!如果你有任何问题或想法,欢迎在评论区交流探讨。