MATLAB制图

散点图

1
2
3
4
5
6
7
8
9
10
11
% 利用预测的新值绘制散点图
% 导入数据
traditional_sales = [6561, 6899, 7264, 7372, 7595, 7882, 7992, 7513, 8157.1, 8341.8, 8530.7];
new_energy_sales = [11.82, 21.8, 32.1, 56.8, 77.4, 122.8, 208.8, 240.9, 373.64, 541.99, 786.18];

% 绘制散点图
scatter(traditional_sales, new_energy_sales, 'filled');
title('传统能源汽车与新能源汽车销量散点图');
xlabel('传统能源汽车销量(万辆)');
ylabel('新能源汽车销量(万辆)');
grid on;

折线-柱状图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
% Data
years = [2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022];
traditionalSales = [6561, 6899, 7264.2, 7372, 7595, 7882, 7992, 7513, 5489, 6387, 6498];
newEnergySales = [11.82, 21.8, 32.1, 56.8, 77.4, 122.8, 208.8, 240.9, 305.2, 551.8, 1031];
marketShare = [0.18, 0.31, 0.44, 0.76, 1.01, 1.53, 2.55, 3.11, 5.27, 7.95, 13.69];

% Plotting
figure;

% Line plot for traditional car sales
yyaxis left;
plot(years, traditionalSales, '-o', 'LineWidth', 2, 'MarkerSize', 8);
ylabel('Traditional Car Sales (in thousands)');

hold on;

% Line plot for new energy car sales
plot(years, newEnergySales, '-s', 'LineWidth', 2, 'MarkerSize', 8);
ylabel('New Energy Car Sales (in thousands)');

% Bar plot for market share
yyaxis right;
bar(years, marketShare, 0.5, 'FaceColor', [0.5 0.5 0.5], 'FaceAlpha', 0.5); % Adjust FaceAlpha
ylabel('New Energy Car Market Share (%)');

xlabel('Year');
title('Global Car Sales and New Energy Car Market Share Over the Years');

legend('Traditional Car Sales', 'New Energy Car Sales', 'New Energy Car Market Share', 'Location', 'Best');
grid on;

相关系数热力图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
% 相关系数矩阵
correlation_matrix = [1.000000 0.598759 -0.223368;
0.598759 1.000000 -0.217538;
-0.223368 -0.217538 1.000000];

h = heatmap(correlation_matrix)

column_labels = {'平均销售单价', '种植成本', '预期销售量'};
h.XData = column_labels;

row_labels = {'平均销售单价', '种植成本', '预期销售量'};
h.YData = row_labels;

下同理

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
% 定义数据
land = {'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6'};
years = [2024, 2025, 2026, 2027, 2028, 2029, 2030];
planting_numbers = [
1, 15, 8, 6, 6, 4, 1, 4, 14, 5, 8, 7, 11, 13, 2, 3, 6, 9, 8, 6, 12, 15, 3, 5, 10, 8;
8, 2, 1, 3, 8, 14, 7, 6, 8, 4, 13, 4, 3, 1, 15, 11, 7, 2, 5, 1, 1, 3, 12, 7, 3, 6;
3, 6, 7, 6, 2, 6, 10, 4, 5, 11, 3, 8, 7, 12, 3, 9, 4, 8, 1, 3, 6, 4, 9, 13, 5, 1;
6, 1, 3, 8, 6, 2, 4, 9, 8, 4, 7, 3, 14, 11, 8, 3, 7, 6, 3, 9, 14, 12, 4, 1, 6, 13;
8, 7, 2, 1, 7, 10, 8, 1, 4, 6, 2, 11, 4, 5, 6, 9, 8, 3, 14, 6, 4, 6, 13, 14, 14, 8;
5, 3, 4, 7, 4, 2, 13, 9, 14, 3, 5, 8, 7, 1, 3, 12, 1, 8, 8, 2, 6, 2, 7, 4, 1, 4;
7, 7, 10, 1, 8, 9, 4, 6, 12, 4, 11, 3, 8, 8, 1, 4, 6, 5, 2, 1, 1, 7, 4, 15, 8, 6];

% 转置矩阵,使年份对齐X轴,土地编号对齐Y轴
planting_numbers = planting_numbers';

% 创建热图
figure;
h = heatmap(years, land, planting_numbers);

% 设置标题和轴标签
h.Title = '';
h.XLabel = '';
h.YLabel = '';

% 调整颜色图
h.Colormap = parula; % 可以根据喜好调整为其他配色,例如 jet, hot, cool
h.ColorbarVisible = true; % 显示颜色条

% 设置字体大小
h.FontSize = 12;

多对象柱状图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
% 定义地块类型和对应的地块面积
land_type = {'平旱地', '梯田', '山坡地', '水浇地', '普通大棚', '智慧大棚'};
land_area = [80, 55, 35, 72, 68, 55,... % 平旱地
60, 46, 40, 28, 25, 86, 55, 44, 50, 25, 60, 45, 35, 20,... % 梯田
15, 13, 15, 18, 27, 20,... % 山坡地
15, 10, 14, 6, 10, 12, 22, 20,... % 水浇地
0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6... % 普通大棚
0.6,0.6,0.6,0.6]; % 智慧大棚

% 每种地块类型的索引
idx_pinghandi = 1:6;
idx_titian = 7:20;
idx_shanpodi = 21:26;
idx_shuijiaodi = 27:34;
idx_putongdapeng = 35:50;
idx_zhihuidapeng = 51:54;

% 计算各个类型地块的总面积
total_pinghandi = sum(land_area(idx_pinghandi));
total_titian = sum(land_area(idx_titian));
total_shanpodi = sum(land_area(idx_shanpodi));
total_shuijiaodi = sum(land_area(idx_shuijiaodi));
total_putongdapeng = sum(land_area(idx_putongdapeng));
total_zhihuidapeng = sum(land_area(idx_zhihuidapeng));

% 各类型总面积数组
total_area = [total_pinghandi, total_titian, total_shanpodi, total_shuijiaodi, total_putongdapeng, total_zhihuidapeng];

% 绘制柱状图
figure;
bar(total_area);
set(gca, 'XTickLabel', land_type);
xlabel('地块类型');
ylabel('总面积(亩)');
title('各类地块总面积柱状图');
grid on;

% 添加文本标签显示具体面积数据
for i = 1:numel(land_type)
text(i, total_area(i), num2str(total_area(i)), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
end

饼状图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
clc,clear;
crop_names = {'刀豆','包菜','南瓜','土豆','大白菜','大麦','小青菜','小麦','榆黄菇','水稻','油麦菜','爬豆','玉米','生菜','白灵菇','白萝卜','空心菜','红萝卜','红薯','红豆','绿豆','羊肚菌','芸豆','芹菜','茄子','荞麦','莜麦','菜花','菠菜','西红柿','谷子','豇豆','辣椒','青椒','香菇','高粱','黄心菜','黄瓜','黄豆','黍子','黑豆'};
total_yields = [26880,3930,35100,30000,150000,10000,35480,170840,9000,21000,4500,9875,132750,2850,18000,100000,3300,36000,36000,22400,33040,4200,6240,1800,45360,1500,14000,3480,900,36210,71400,36240,1200,2610,7200,30000,1620,13050,57000,12500,21850];

% 找到总产量最大的 6 种作物的索引
[sorted_yields, indices] = sort(total_yields, 'descend');
top_6_indices = indices(1:6);

% 提取总产量最大的 6 种作物的名称和产量
top_6_crop_names = crop_names(top_6_indices);
top_6_yields = sorted_yields(1:6);

% 计算占比
total_yield = sum(total_yields); % 计算全部作物的总产量
percentages = top_6_yields / total_yield;

% 绘制饼图
pie(top_6_yields);
legend(cellstr(strcat(top_6_crop_names)));
title('');

共轴折线图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
clc,clear;
% 数据准备
yield_percentages = [93 96 99 101 104 107 110];
profit_yield = [5918674.225 7160341.775 7133337.781 8161369.288 8600767.775 8918903.188 9086045.75];
cost_percentages = [95 100 105 110 115 ];
profit_cost = [8350873.55 8782234 8442952.9 6415051.275 5898857.225];
sales_percentages = [95 97 99 101 103 105];
profit_sales = [7225529.469 7749355.981 7894046.581 9346733.056 8425265.481 9151209.469];

% 绘制三个共坐标轴的折线图
figure;
subplot(1,1,1);
plot(yield_percentages, profit_yield, '-o', 'LineWidth', 2, 'MarkerSize', 8, 'DisplayName', '亩产量与收益');
hold on;
plot(cost_percentages, profit_cost, '-s', 'LineWidth', 2, 'MarkerSize', 8, 'DisplayName', '种植成本与收益');
plot(sales_percentages, profit_sales, '-d', 'LineWidth', 2, 'MarkerSize', 8, 'DisplayName', '预期销售量与收益');
xlabel('变化范围');
% 设置横坐标刻度标签
xticks(yield_percentages);
xticklabels(cellstr(strcat(num2str(yield_percentages'), '%'))); % 在原始的数据基础上添加百分号
ylabel('最优种植方案的收益');
title('不同因素对最优种植方案收益的影响');
legend('show');
grid on;

双折线面积填充图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
% 定义年份
years = 2024:2030;

% 定义问题二和问题三的数据
problem_2 = [6073137.855, 9703740.231, 8240189.817, 8520396.352, 10605292.94, 9159255.435, 7725378.371];
problem_3 = [6102450.555, 10786663.11, 11004881.17, 9784583.747, 13440646.73, 13191190.89, 10449639.38];

% 绘制双折线图
figure;

% 填充两条折线之间的区域
fill([years, fliplr(years)], [problem_2, fliplr(problem_3)], [0.8 0.8 1], 'EdgeColor', 'none'); % 蓝色填充

hold on;

% 绘制问题二和问题三的折线
plot(years, problem_2, '-o', 'LineWidth', 2, 'DisplayName', '问题二', 'Color', 'b'); % 问题二
plot(years, problem_3, '-s', 'LineWidth', 2, 'DisplayName', '问题三', 'Color', 'r'); % 问题三

% 添加图例
legend('show');

% 设置坐标轴标签
xlabel('年份');
ylabel('数据值');

% 添加标题
title('问题二与问题三的变化趋势(颜色填充)');

% 显示网格
grid on;

% 保持图形
hold off;

二次函数曲线预测

https://pic.imgdb.cn/item/66e188d6d9c307b7e91b6e27.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
% 提供的数据
time = datetime({'2021.10', '2021.11', '2021.12', '2022.1', '2022.2', '2022.3', '2022.4', '2022.5', '2022.6', '2022.7', '2022.8', '2022.9', '2022.10', '2022.11', '2022.12'}, 'InputFormat', 'yyyy.MM');
export_data = [6, 3.7, 1.8, 5.6, 10.4, 12.0, 13.1, 17.4, 20.2, 25.7, 34, 38.9, 49.9, 59.3, 67.9];

% 计算相对日期序列号
time_relative_serial = 1:length(time);

% 给定的二次曲线参数
const = 6.897;
linear_coeff = -1.939;
quadratic_coeff = 0.399;

% 使用二次曲线拟合
quadratic_fit = @(x) const + linear_coeff * x + quadratic_coeff * x.^2;

% 预测未来10个月的值
forecast_horizon = 10;
forecast_time_relative_serial = (1:forecast_horizon) + max(time_relative_serial);
forecast_values = quadratic_fit(forecast_time_relative_serial);

% 绘制实际值、二次曲线和预测值
figure;
plot(time_relative_serial, export_data, 'o-', 'DisplayName', '实际值');
hold on;
plot(forecast_time_relative_serial, forecast_values, 'r--o', 'DisplayName', '预测值');
plot(time_relative_serial, quadratic_fit(time_relative_serial), 'k-', 'DisplayName', '二次曲线拟合');
title('新能源汽车出口量预测(二次曲线拟合)');
xlabel('相对时间序列号');
ylabel('出口量(万)');

legend('Location', 'Best');
grid on;

拟合---线性趋势模型

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
%2.0线性预测
% 提供的数据
time = datetime({'2021.10', '2021.11', '2021.12', '2022.1', '2022.2', '2022.3', '2022.4', '2022.5', '2022.6', '2022.7', '2022.8', '2022.9', '2022.10', '2022.11', '2022.12'}, 'InputFormat', 'yyyy.MM');
export_data = [6, 3.7, 1.8, 5.6, 10.4, 12.0, 13.1, 17.4, 20.2, 25.7, 34, 38.9, 49.9, 59.3, 67.9];

% 使用序列号代替日期时间
time_serial = 1:length(time);

% 拟合线性趋势模型
linear_trend_model = fit(time_serial', export_data', 'poly1');

% 预测未来值
forecast_horizon = 12;
forecast_time_serial = length(time_serial) + (1:forecast_horizon);
forecast_values = feval(linear_trend_model, forecast_time_serial);

% 将序列号转换回日期时间
forecast_time = time(end) + calmonths(1:forecast_horizon);

% 绘制实际值、线性趋势和预测值
figure;
plot(time, export_data, 'o-', 'DisplayName', '实际值');
hold on;
plot(forecast_time, forecast_values, 'r--o', 'DisplayName', '预测值');
plot(time, feval(linear_trend_model, time_serial), 'k-', 'DisplayName', '线性趋势');
title('新能源汽车出口量预测(线性趋势模型)');
xlabel('时间');
ylabel('出口量(万)');
legend('Location', 'Best');
grid on;

% 不设置横坐标刻度标签
xticks([]);
xticklabels([]);

曲线填充图

area函数是Y轴数值对 x 坐标轴围成的面积图,该函数根据 Y 的形状填充曲线之间的区域。

fill函数是创建二维填充补片(patch),即填充多边形区域绘制为补片,其顶点位于由X和Y指定的(x,y)坐标位置,主要用于平面中多个区域的颜色填充。

patch函数是创建彩色多边形的补片,即按X和Y指定为每个顶点的坐标创建一个或多个彩色多边形补片,主要用于平面中多边形的颜色填充。

patchfill 函数功能和用法类似。area 函数主要针对与坐标轴围成的区域的填充,如果需要对图形窗口内任意闭合区域或多边形区域及进行填充,则需要用到fillpatch函数。

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
clc; clear; close all;

% 数据
x = linspace(-8,12,100);
y1 = normpdf(x,4,6);% Normal probability density function
y2 = normpdf(x,0,1).*0.5+normpdf(x,4,2).*0.5;
y3 = normpdf(x,-3,2);
y = [y1;y2;y3];

% 颜色
c = [184 194 140; 201 226 240; 250 181 157]./255; % Three colors

% 绘图
for i = 1:size(y,1)
area(x,y(i,:),'FaceColor',c(i,:),'EdgeColor','none','FaceAlpha',0.5); hold on
end

% 坐标轴
xlabel('x/Samples'),ylabel('y/Value')
legend({'- Area No.1','- Area No.2','- Area No.3'})
set(gca,'XLim',[-8 12]);

% 修饰
defaultAxes

数据生成

  1. x = linspace(-8,12,100);
    • 生成向量 x,包含从-8到12之间均匀分布的100个点,这些点将用于绘制函数曲线。

计算概率密度函数

  1. y1 = normpdf(x,4,6);
    • 计算正态分布PDF,其中均值为4,标准差为6。结果存储在 y1 中。
  2. y2 = normpdf(x,0,1).*0.5+normpdf(x,4,2).*0.5;
    • 计算两个正态分布PDF的线性组合,其中一个均值为0,标准差为1,权重为0.5;另一个均值为4,标准差为2,权重也为0.5。结果合并后存入 y2
  3. y3 = normpdf(x,-3,2);
    • 计算均值为-3,标准差为2的正态分布PDF,并将其结果保存在 y3 中。

定义颜色

  1. c = [184 194 140; 201 226 240; 250 181 157]./255;
    • 定义一个3×3矩阵,包含三组RGB颜色值,分别对应三个分布的填充颜色。这些数值经过除以255的操作,将它们归一化到0到1之间,以便MATLAB能够正确理解。

绘制图形

  1. for i = 1:size(y,1)
    • 使用循环结构,遍历 y 的每一行(即每一个分布)。
  2. area(x,y(i,:), ...)
    • 对于每个分布,调用 area 函数绘制面积图。输入参数为 x 轴坐标向量和对应的 y 值向量。
  3. 'FaceColor', c(i,:), 'EdgeColor', 'none', 'FaceAlpha', 0.5
    • 设置面积图的填充颜色为当前循环索引对应的色彩,边缘颜色为无(即不显示边缘线),并设置填充透明度为0.5,使得底层分布能部分透过上层分布显现。
  4. hold on
    • 在同一张图上保持绘制状态,允许后续循环中的面积图叠加在同一坐标系中。
  5. end
    • 结束循环。

坐标轴与图例

  1. xlabel('x/Samples'), ylabel('y/Value')
    • 设置横纵坐标的标签,分别为“x/Samples”和“y/Value”。
  2. legend({'- Area No.1', '- Area No.2', '- Area No.3'})
    • 添加图例,标识三个面积区域分别为“Area No.1”、“Area No.2”和“Area No.3”。

坐标轴范围设定

  1. set(gca, 'XLim', [-8 12])
    • 设置当前坐标轴(gca)的x轴范围为-8到12,确保图形覆盖指定的x轴区间。

双向对比图

alt text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 设置参数
num_values = 100; % 随机数数量
min_value = -100; % 最小值(包括)
max_value = 100; % 最大值(包括)

% 生成随机数列表
y = min_value + (max_value - min_value) * rand(num_values, 1);
x = linspace(0,100,length(y));
y1 = y; y1(y1<0)=0; % 负数
y2 = y; y2(y2>0)=0; % 正数
figure,
area(x,y1,'FaceColor','r','EdgeColor','r','FaceAlpha',0.6); hold on
area(x,y2,'FaceColor','b','EdgeColor','b','FaceAlpha',0.6);
xlabel('x-axis/Samples'),ylabel('y-axis/Intensity value')
set(gca,'FontName','Times New Roman','FontSize',12)
legend({'- Positive value area','- Negative value area'})
set(gcf,'Color','White'); %设置背景颜色
% 修饰
defaultAxes
1
2
% 生成随机数列表
y = min_value + (max_value - min_value) * rand(num_values, 1);

这一行利用Matlab内置函数rand()生成一个num_values行、1列的矩阵,其中元素值为在[0,1]之间均匀分布的随机数。然后将这些随机数乘以(max_value - min_value)得到一个缩放后的范围,并加上min_value,确保最终生成的随机数在[-100, 100]范围内。结果存储在变量y中。

1
x = linspace(0,100,length(y));

这里使用linspace()函数创建一个等差数列x,起点为0,终点为100,包含的点数与y的长度相同。这意味着x将作为面积图的x轴坐标,与y中的随机数值一一对应。

1
2
y1 = y; y1(y1<0)=0;      % 负数
y2 = y; y2(y2>0)=0; % 正数

为了分别绘制正负值部分的面积图,创建两个新变量y1y2。它们最初都复制自y,然后通过逻辑索引将: - y1中所有小于0的值置为0,保留所有负数部分; - y2中所有大于0的值置为0,保留所有正数部分。

1
2
3
figure,
area(x,y1,'FaceColor','r','EdgeColor','r','FaceAlpha',0.6); hold on
area(x,y2,'FaceColor','b','EdgeColor','b','FaceAlpha',0.6);

首先打开一个新的图形窗口(figure),然后使用area()函数绘制面积图: - 第一个面积图基于xy1,表示负值部分,其填充颜色(FaceColor)和边缘颜色(EdgeColor)均为红色('r'),透明度(FaceAlpha)设为0.6; - 第二个面积图基于xy2,表示正值部分,颜色属性与第一个面积图相同,只是颜色为蓝色('b')。

hold on命令确保在同一张图上绘制这两个面积图,不会被自动清空。

1
2
3
4
xlabel('x-axis/Samples'),ylabel('y-axis/Intensity value')
set(gca,'FontName','Times New Roman','FontSize',12)
legend({'- Positive value area','- Negative value area'})
set(gcf,'Color','White'); %设置背景颜色

接下来对图形进行标注和样式调整: - 设置x轴标签为“x-axis/Samples”,y轴标签为“y-axis/Intensity value”; - 使用set(gca,...)修改当前坐标轴属性,将字体设为“Times New Roman”,字号设为12; - 添加图例,说明两个面积图分别代表“- Positive value area”(正值区域)和“- Negative value area”(负值区域); - 使用set(gcf,...)设置当前图形窗口的背景颜色为白色。

fill和patch函数,这两个函数功能和用法类似,它们的基本用法MATLAB帮助文件均有详细说明。以下以fill函数为例,用一个稍复杂的应用为例进行说明。

置信度区间图

首先,我们产生一条含随机噪声的Bessel分布数据。然后,对其进行多项式拟合,绘制拟合误差范围的置信度区间。 alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
x = 0 : 0.2 : 10;
y = besselj(0, x); % Bessel 函数
y = y+0.8*rand([1,length(x)]);
% 多项式拟合
[p,S] = polyfit(x,y,3);
[y_fit, delta] = polyval(p,x,S); % delta 标准误差估计值
%绘制原始数据、线性拟合及95%预测区间 y±2Δ
uy = y_fit+2*delta;
dy = y_fit-2*delta;
figure,
% 绘制原始数据
plot(x,y,'rx','LineWidth',1.5)
hold on
%绘制拟合曲线
plot(x,y_fit,'Color',[0 1 1],'LineWidth',1.5)
hold on
%绘制置信区间
xconf = [x x(end:-1:1)] ;% x坐标回转形成闭合区域
yconf = [uy dy(end:-1:1)]; % 扩大数据区间
c2 = [182,100,199]./255;
plot([x',x'],[uy',dy'],'Color',c2,'LineWidth',1.2,'LineStyle','--')
fill(xconf, yconf,'k','FaceColor',c2,'EdgeColor','none','FaceAlpha',0.1);
xlabel('x-axis/Samples'),ylabel('y-axis/Intensity value')
set(gca,'FontName','Times New Roman','FontSize',12)
legend({'- Data','- Linear fit','- 95% Prediction Interval'})
set(gcf,'Color','White'); % Background is white

1
2
3
x = 0 : 0.2 : 10;
y = besselj(0, x); % Bessel 函数
y = y+0.8*rand([1,length(x)]);

这部分定义了x轴的取值范围,并计算相应的Bessel函数值。具体步骤如下: - x = 0 : 0.2 : 10;:创建一个从0开始,以0.2为步长递增到10的向量,作为x轴坐标值。 - y = besselj(0, x);:利用Matlab内置函数besselj计算阶数为0的Bessel函数在给定x值上的值,结果存储在向量y中。 - y = y+0.8*rand([1,length(x)]);:为Bessel函数值添加随机噪声。生成一个与y同长度的随机向量(均值为0,标准差为1),乘以常数0.8后加到y上,使得数据点带有一定随机扰动。

1
2
3
% 多项式拟合
[p,S] = polyfit(x,y,3);
[y_fit, delta] = polyval(p,x,S); % delta 标准误差估计值

这部分进行数据的三次多项式拟合: - polyfit(x,y,3):使用polyfit函数对xy数据进行三次多项式拟合,返回拟合多项式的系数向量p和结构体S,其中包含了拟合的标准误差等信息。 - polyval(p,x,S):使用polyval函数基于拟合的系数p和x坐标x计算拟合值,并利用结构体S中的信息计算标准误差估计值delta

1
2
3
% 绘制原始数据、线性拟合及95%预测区间 y±2Δ
uy = y_fit+2*delta;
dy = y_fit-2*delta;

计算95%预测区间的上下界: - uy = y_fit+2*delta;:计算拟合值y_fit上方两倍标准误差的位置,即预测区间的上界。 - dy = y_fit-2*delta;:计算拟合值y_fit下方两倍标准误差的位置,即预测区间的下界。

1
2
3
4
5
6
7
8
9
10
11
12
13
figure,
% 绘制原始数据
plot(x,y,'rx','LineWidth',1.5)
hold on
% 绘制拟合曲线
plot(x,y_fit,'Color',[0 1 1],'LineWidth',1.5)
hold on
% 绘制置信区间
xconf = [x x(end:-1:1)] ;% x坐标回转形成闭合区域
yconf = [uy dy(end:-1:1)]; % 扩大数据区间
c2 = [182,100,199]./255;
plot([x',x'],[uy',dy'],'Color',c2,'LineWidth',1.2,'LineStyle','--')
fill(xconf, yconf,'k','FaceColor',c2,'EdgeColor','none','FaceAlpha',0.1);

这部分绘制图形并设置相关样式: - figure:创建一个新的图形窗口。 - plot(x,y,'rx','LineWidth',1.5):绘制原始数据点,使用红色菱形标记('rx'),线宽为1.5。 - hold on:保持当前图形,后续绘制将在同一窗口中进行。 - plot(x,y_fit,'Color',[0 1 1],'LineWidth',1.5):绘制拟合曲线,颜色为亮青色,线宽为1.5。 - xconf = [x x(end:-1:1)]:构造一个包含x轴坐标原序列及其逆序的向量,用于闭合预测区间图形。 - yconf = [uy dy(end:-1:1)]:构造一个包含预测区间上界和下界逆序的向量,使区间闭合。 - c2 = [182,100,199]./255;:定义预测区间颜色为淡紫色(RGB值转换为[0,1]范围)。 - plot([x',x'],[uy',dy'],'Color',c2,'LineWidth',1.2,'LineStyle','--'):绘制预测区间的边界线,颜色为淡紫色,线宽1.2,虚线样式。 - fill(xconf, yconf,'k','FaceColor',c2,'EdgeColor','none','FaceAlpha',0.1):填充预测区间,内部颜色为淡紫色,无边框,填充透明度为0.1。

1
2
3
4
xlabel('x-axis/Samples'),ylabel('y-axis/Intensity value')
set(gca,'FontName','Times New Roman','FontSize',12)
legend({'- Data','- Linear fit','- 95% Prediction Interval'})
set(gcf,'Color','White'); % Background is white

最后进行图形的标签、字体、图例及背景设置: - xlabel('x-axis/Samples'):设置x轴标签为“x-axis/Samples”。 - ylabel('y-axis/Intensity value'):设置y轴标签为“y-axis/Intensity value”。 - set(gca,'FontName','Times New Roman','FontSize',12):将当前坐标轴的字体设为“Times New Roman”,字号为12。 - legend({'- Data','- Linear fit','- 95% Prediction Interval'}):添加图例,分别标识原始数据、拟合曲线和95%预测区间。 - set(gcf,'Color','White'):设置当前图形窗口背景颜色为白色。

参考

https://mp.weixin.qq.com/s/PJoY5QrlgRGecBStkFiTEQ


MATLAB制图
http://jrhu0048.github.io/2024/04/25/matlab-zhi-tu/
作者
JR.HU
发布于
2024年4月25日
更新于
2024年9月11日
许可协议