常见的MATLAB制图代码集合
area函数是Y轴数值对 x 坐标轴围成的面积图,该函数根据Y的形状填充曲线之间的区域。
fill函数是创建二维填充补片(patch),即填充多边形区域绘制为补片,其顶点位于由X和Y指定的(x,y)坐标位置,主要用于平面中多个区域的颜色填充。
patch函数是创建彩色多边形的补片,即按X和Y指定为每个顶点的坐标创建一个或多个彩色多边形补片,主要用于平面中多边形的颜色填充。
patch与fill函数功能和用法类似。area函数主要针对与坐标轴围成的区域的填充,如果需要对图形窗口内任意闭合区域或多边形区域及进行填充,则需要用到fill和patch函数。
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
数据生成
x = linspace(-8,12,100);
- 生成向量
x
,包含从-8到12之间均匀分布的100个点,这些点将用于绘制函数曲线。
- 生成向量
计算概率密度函数
y1 = normpdf(x,4,6);
- 计算正态分布PDF,其中均值为4,标准差为6。结果存储在
y1
中。
- 计算正态分布PDF,其中均值为4,标准差为6。结果存储在
y2 = normpdf(x,0,1).*0.5+normpdf(x,4,2).*0.5;
- 计算两个正态分布PDF的线性组合,其中一个均值为0,标准差为1,权重为0.5;另一个均值为4,标准差为2,权重也为0.5。结果合并后存入
y2
。
- 计算两个正态分布PDF的线性组合,其中一个均值为0,标准差为1,权重为0.5;另一个均值为4,标准差为2,权重也为0.5。结果合并后存入
y3 = normpdf(x,-3,2);
- 计算均值为-3,标准差为2的正态分布PDF,并将其结果保存在
y3
中。
- 计算均值为-3,标准差为2的正态分布PDF,并将其结果保存在
定义颜色
c = [184 194 140; 201 226 240; 250 181 157]./255;
- 定义一个3×3矩阵,包含三组RGB颜色值,分别对应三个分布的填充颜色。这些数值经过除以255的操作,将它们归一化到0到1之间,以便MATLAB能够正确理解。
绘制图形
for i = 1:size(y,1)
- 使用循环结构,遍历
y
的每一行(即每一个分布)。
- 使用循环结构,遍历
area(x,y(i,:), ...)
- 对于每个分布,调用
area
函数绘制面积图。输入参数为x
轴坐标向量和对应的y
值向量。
- 对于每个分布,调用
'FaceColor', c(i,:), 'EdgeColor', 'none', 'FaceAlpha', 0.5
- 设置面积图的填充颜色为当前循环索引对应的色彩,边缘颜色为无(即不显示边缘线),并设置填充透明度为0.5,使得底层分布能部分透过上层分布显现。
hold on
- 在同一张图上保持绘制状态,允许后续循环中的面积图叠加在同一坐标系中。
end
- 结束循环。
坐标轴与图例
xlabel('x/Samples'), ylabel('y/Value')
- 设置横纵坐标的标签,分别为“x/Samples”和“y/Value”。
legend({'- Area No.1', '- Area No.2', '- Area No.3'})
- 添加图例,标识三个面积区域分别为“Area No.1”、“Area No.2”和“Area No.3”。
坐标轴范围设定
set(gca, 'XLim', [-8 12])
- 设置当前坐标轴(gca)的x轴范围为-8到12,确保图形覆盖指定的x轴区间。
% 设置参数
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
% 生成随机数列表
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
中。
x = linspace(0,100,length(y));
这里使用linspace()
函数创建一个等差数列x
,起点为0,终点为100,包含的点数与y
的长度相同。这意味着x
将作为面积图的x轴坐标,与y
中的随机数值一一对应。
y1 = y; y1(y1<0)=0; % 负数
y2 = y; y2(y2>0)=0; % 正数
为了分别绘制正负值部分的面积图,创建两个新变量y1
和y2
。它们最初都复制自y
,然后通过逻辑索引将:
y1
中所有小于0的值置为0,保留所有负数部分;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);
首先打开一个新的图形窗口(figure
),然后使用area()
函数绘制面积图:
- 第一个面积图基于
x
和y1
,表示负值部分,其填充颜色(FaceColor
)和边缘颜色(EdgeColor
)均为红色('r'
),透明度(FaceAlpha
)设为0.6; - 第二个面积图基于
x
和y2
,表示正值部分,颜色属性与第一个面积图相同,只是颜色为蓝色('b'
)。
hold on
命令确保在同一张图上绘制这两个面积图,不会被自动清空。
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分布数据。然后,对其进行多项式拟合,绘制拟合误差范围的置信度区间。
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
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
上,使得数据点带有一定随机扰动。
% 多项式拟合
[p,S] = polyfit(x,y,3);
[y_fit, delta] = polyval(p,x,S); % delta 标准误差估计值
这部分进行数据的三次多项式拟合:
polyfit(x,y,3)
:使用polyfit
函数对x
和y
数据进行三次多项式拟合,返回拟合多项式的系数向量p
和结构体S
,其中包含了拟合的标准误差等信息。polyval(p,x,S)
:使用polyval
函数基于拟合的系数p
和x坐标x
计算拟合值,并利用结构体S
中的信息计算标准误差估计值delta
。
% 绘制原始数据、线性拟合及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
下方两倍标准误差的位置,即预测区间的下界。
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。
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