【MATLAB学习笔记】绘图——errorbar误差图+patch误差填充图

前言

  关于MATLAB中errorbar函数和patch函数的使用以及美化加工。如有些细节的地方不清楚的可以点击此先去看看这篇文章:
【MATLAB学习笔记】绘图——去除上、右边框刻度

颜色配置

  这里分享一下本人常用的颜色配置:
在这里插入图片描述
对应的颜色代码如下

myColors = ["#9489fa"; "#f06464"; "#f7af59"; "#f0da49"; "#71c16f"; "#2aaaef";
            "#5690dd"; "#bd88f5"; "#009db2"; "#024b51"; "#0780cf"; "#765005"];

数据准备

  随机生成一些数据,这里有y和z两组数据,同时计算误差err。

x = 3:0.08:5;

y = exp(1.1*x);
y1 = y.*(1+0.1.*x);
err = y1 - y;

z = exp(1.3*x)+100;
z1 = z.*(1+0.03.*x);
err1 = z1 - z;

errorbar函数绘制误差线

  errorbar第一个参数为x,第二个参数为y,第三个参数为误差。

f = figure("Name","误差");
e = errorbar(x,y,err);
e.Color = myColors(1);  % 颜色
e.LineWidth = 1.5;  % 线宽
e.CapSize = 10; % 误差帽宽度

hold on 
e2 = errorbar(x,z,err1);
e2.Color = myColors(2);
e2.LineWidth = 1.5;
e2.CapSize = 10;

在这里插入图片描述

patch函数绘制误差填充图

  patch函数可以绘制多边形的填充图,第一个参数为x坐标,第二个参数为y坐标,第三个参数为颜色(这里我先设置为红色r,再调整为自己的配色);其中fliplr(x)函数表示将x倒序输出。
  下面的代码表示将误差边界围成一圈进行填充颜色:

pa = patch([x,fliplr(x)],[y-abs(err),fliplr(y+abs(err))],'r');

在此基础上,再做细节的调整:

% 绘制误差带
pa = patch([x,fliplr(x)],[y-abs(err),fliplr(y+abs(err))],'r');
pa.FaceColor = myColors(1); % 设置颜色
pa.FaceAlpha = 0.2;  % 设置颜色透明度
pa.LineStyle = 'none';  % 设置误差带边界线为无

pa1 = patch([x,fliplr(x)],[z-abs(err1),fliplr(z+abs(err1))],'r');
pa1.FaceColor = myColors(2);
pa1.FaceAlpha = 0.2;
pa1.LineStyle = 'none';

在这里插入图片描述

细节调整

设置次刻度线

% 设置次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)

设置坐标轴线宽度、刻度线长度

% 设置坐标轴宽度
set(gca,'linewidth',1)

% 设置刻度线长度
set(gca,'ticklength',[0.015,0.25])

设置全局字体、刻度

% 设置全局字体
set(gca,'FontName','Times New Roman','FontSize',13)

% 设置坐标轴刻度
set(gca,'xlim',[min(x)*0.98,max(x)*1.02])
set(gca,'ylim',[0,1000])
set(gca,'ytick',0:200:1000)
set(gca,'yticklabel',0:200:1000)

标签、图例

  这里用到了latex语法,具体的latex语法自行搜索。
  还有一个简便的方法就是先在公式编辑器(Axmath、mathtype)输入,再转化为latex语法复制进MATLAB中就可以了。
  注意:MATLAB采用latex语法的时候,需要将Interpreter设置为latex格式。

% 设置轴标签
xlabel('$$\mathrm{Strain} \enspace  \varepsilon /\mathrm{MPa}\cdot \mathrm{MPa}^{-1}$$','Interpreter','latex')
ylabel('$$\mathrm{Stress} \enspace  \sigma /\mathrm{MPa}$$','Interpreter','latex')

% 设置图例
legend('$$y=e^{1.1x}$$','$$y=e^{1.3x}+100$$','Interpreter','latex','Location','northwest','Fontsize',15)
legend('boxoff')    % 取消图例边框

在这里插入图片描述

取消上、右边框刻度线

% 去除上、右边框的刻度线
box off     % 取消边框
ax1 = axes('Position',get(gca,'Position'),'XAxisLocation','top',...
    'YAxisLocation','right','Color','none','XColor','k','YColor','k');  % 设置坐标区
set(ax1,'linewidth',0.9)
set(ax1,'XTick', [],'YTick', []);   % 去掉xy轴刻度
hold off

在这里插入图片描述

保存图片

  这里的exportgraphics是剪裁白边保存图像的函数。

% 保存图片
exportgraphics(f,'Infww_errorfig.png', 'Resolution',600)

在这里插入图片描述

总代码

clc;clear;close all
set(0,"defaultfigurecolor","w");
%% 
% 配色表
myColors = ["#9489fa"; "#f06464"; "#f7af59"; "#f0da49"; "#71c16f"; "#2aaaef";
            "#5690dd"; "#bd88f5"; "#009db2"; "#024b51"; "#0780cf"; "#765005"];
%% 数据

x = 3:0.08:5;

y = exp(1.1*x);
y1 = y.*(1+0.1.*x);
err = y1 - y;

z = exp(1.3*x)+100;
z1 = z.*(1+0.03.*x);
err1 = z1 - z;

%% 
f = figure("Name","误差");
e = errorbar(x,y,err);
e.Color = myColors(1);  % 颜色
e.LineWidth = 1.5;  % 线宽
e.CapSize = 10; % 误差帽宽度

hold on 
e2 = errorbar(x,z,err1);
e2.Color = myColors(2);
e2.LineWidth = 1.5;
e2.CapSize = 10;

%绘制误差带
pa = patch([x,fliplr(x)],[y-abs(err),fliplr(y+abs(err))],'r');
pa.FaceColor = myColors(1); % 设置颜色
pa.FaceAlpha = 0.2;  % 设置颜色透明度
pa.LineStyle = 'none';  % 设置误差带边界线为无

pa1 = patch([x,fliplr(x)],[z-abs(err1),fliplr(z+abs(err1))],'r');
pa1.FaceColor = myColors(2);
pa1.FaceAlpha = 0.2;
pa1.LineStyle = 'none';

% 设置次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)

% 设置坐标轴宽度
set(gca,'linewidth',1)

% 设置刻度线长度
set(gca,'ticklength',[0.015,0.25])

% 设置全局字体
set(gca,'FontName','Times New Roman','FontSize',13)

% 设置坐标轴刻度
set(gca,'xlim',[min(x)*0.98,max(x)*1.02])
set(gca,'ylim',[0,1000])
set(gca,'ytick',0:200:1000)
set(gca,'yticklabel',0:200:1000)

% 设置轴标签
xlabel('$$\mathrm{Strain} \enspace  \varepsilon /\mathrm{MPa}\cdot \mathrm{MPa}^{-1}$$','Interpreter','latex')
ylabel('$$\mathrm{Stress} \enspace  \sigma /\mathrm{MPa}$$','Interpreter','latex')

% 设置图例
legend('$$y=e^{1.1x}$$','$$y=e^{1.3x}+100$$','Interpreter','latex','Location','northwest','Fontsize',15)
legend('boxoff')    % 取消图例边框

% 去除上、右边框的刻度线
box off     % 取消边框
ax1 = axes('Position',get(gca,'Position'),'XAxisLocation','top',...
    'YAxisLocation','right','Color','none','XColor','k','YColor','k');  % 设置坐标区
set(ax1,'linewidth',0.9)
set(ax1,'XTick', [],'YTick', []);   % 去掉xy轴刻度
hold off

% 保存图片
exportgraphics(f,'Infww_errorfig.png', 'Resolution',600)

总结

  这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。