常见的MATLAB绘图代码

常见的MATLAB制图代码集合

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

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

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

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

alt text

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

% 设置参数
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;      % 正数

为了分别绘制正负值部分的面积图,创建两个新变量y1y2。它们最初都复制自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()函数绘制面积图:

  • 第一个面积图基于xy1,表示负值部分,其填充颜色(FaceColor)和边缘颜色(EdgeColor)均为红色('r'),透明度(FaceAlpha)设为0.6;
  • 第二个面积图基于xy2,表示正值部分,颜色属性与第一个面积图相同,只是颜色为蓝色('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分布数据。然后,对其进行多项式拟合,绘制拟合误差范围的置信度区间。
alt text

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函数对xy数据进行三次多项式拟合,返回拟合多项式的系数向量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

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值