前言
在原有的绘图区上直接添加新的坐标区再次进行绘图。原有绘图区详见下面这篇文章:
【MATLAB学习笔记】绘图——errorbar误差图+patch误差填充图
axes函数的使用
原有绘图区
先给出原有绘图区如下:
设置新坐标区的位置和大小
MATLAB中的axes函数可以直接在原有绘图区直接创建新的坐标系,这里的位置和大小[0.2,0.5,0.4,0.2]是通过自己尝试慢慢调整的:
ax2 = axes('Position',[0.2,0.5,0.4,0.2]); % 设置坐标区
关于Position的说明:
- 'Position’表示坐标区的大小和位置,不包括标签边距,指定为 [left bottom width height] 形式的四元素向量。默认情况下,MATLAB 按照归一化的容器单位来测量值。要更改单位,请设置 Units 属性。
- left 和 bottom 元素定义从容器(通常为图窗、面板或选项卡)左下角到位置边界左下角之间的距离。
- width 和 height 元素是位置边界维度。对于三维视图中的坐标区,Position 属性是包围坐标区的最小矩形。
然后就可以看到图中多了一个坐标区:
在新坐标区进行绘图
这里绘制了一个堆叠条形图:
b = bar(ax2,x(1:2:end),[y(1:2:end);z(1:2:end)]','stacked');
调整绘图参数
b(1).BarWidth = 0.7; % 设置柱状图宽度
b(1).FaceColor = myColors(1); % 设置填充颜色
b(1).EdgeColor = myColors(1); % 设置边框颜色
b(1).FaceAlpha = 0.8; % 设置填充颜色透明度
b(2).FaceColor = myColors(2);
b(2).EdgeColor = myColors(2);
b(2).FaceAlpha = 0.8;
box off
set(ax2,'FontName','Times New Roman','FontSize',10) % 设置字体字号
% 设置次刻度线
set(ax2,'XMinorTick',true)
set(ax2,'YMinorTick',true)
% 设置坐标轴宽度
set(ax2,'linewidth',1)
保存图片
采用exportgraphics函数进行剪裁白边保存图像:
exportgraphics(f,'Infww_errorfig_axes.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',18);
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
%% 新绘图区
ax2 = axes('Position',[0.2,0.5,0.4,0.2]); % 设置坐标区
b = bar(ax2,x(1:2:end),[y(1:2:end);z(1:2:end)]','stacked');
b(1).BarWidth = 0.7; % 设置柱状图宽度
b(1).FaceColor = myColors(1); % 设置填充颜色
b(1).EdgeColor = myColors(1); % 设置边框颜色
b(1).FaceAlpha = 0.8; % 设置填充颜色透明度
b(2).FaceColor = myColors(2);
b(2).EdgeColor = myColors(2);
b(2).FaceAlpha = 0.8;
box off
set(ax2,'FontName','Times New Roman','FontSize',10) % 设置字体字号
% 设置次刻度线
set(ax2,'XMinorTick',true)
set(ax2,'YMinorTick',true)
% 设置坐标轴宽度
set(ax2,'linewidth',1)
%% 保存图片
exportgraphics(f,'Infww_errorfig_axes.png', 'Resolution',600)
总结
这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。