MATLAB | 两个较新版本中的坐标区域小技巧
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 两个较新版本中的坐标区域小技巧相关的知识,希望对你有一定的参考价值。
两天不见甚是想念,有的朋友已经注意到我的某乎账号名称已经由hikari
同步为slandarer
希望大家看到不要惊讶哈,
今天带来俩关于坐标区域的小细节,仅仅是小细节,拿来干啥用就看各位的脑洞了。
子图自动最优排布
tiledlayout相关组件已经更新有一段时间了,我也已经写过部分相关教程了,不知道大家有没有尝试过将其TileArrangement
属性设置为flow
后对当前图床进行随意拉拽变形会发生啥,没错会根据当前图窗比例自动调整为合适的子图排布:
tiledlayout('flow')
t=linspace(0,2*pi,500);
for i=1:6
nexttile;
plot(t,sin(i.*t),'LineWidth',2)
end
随着拖拽子图变成六行三行两行一行自动调整,美滋滋。
坐标区域轴的真实位置
R2022b开始我们总算能知道坐标轴在figure的确切位置了!!通过tightPosition(ax)
的方式获取。
需要R2022b
需要R2022b
需要R2022b
t = linspace(0,10,100);
ax = axes;
plot(t.*sin(t),t.*cos(t))
axis equal tight
% 轴位置
pos=tightPosition(ax);
annotation("rectangle",pos,Color="red",LineWidth=2)
% 包括标签的轴位置
poslab = tightPosition(ax,IncludeLabels=true);
annotation("rectangle",poslab,Color="blue",LineWidth=2)
有的人说不是有InnerPosition
和TightInset
这俩玩意嘛?不一样,这个真不一样,虽然基础设置下看起来区别不大,但随着文本标签字体忽大忽小,轴的长宽比例变化,轴位置和InnerPosition
会相去甚远:
给段代码感受一下哈:
ax=axes;hold on
ax.YTickLabel='slandarer随笔';
ax.PlotBoxAspectRatio=[1,1,1];
t=linspace(0,10,100);
plot(t,sin(t))
title('欢迎关注公众号')
% 轴位置
pos=tightPosition(ax);
annotation("rectangle",pos,Color="red",LineWidth=2)
% 包括标签的轴位置
poslab=tightPosition(ax,IncludeLabels=true);
annotation("rectangle",poslab,Color="blue",LineWidth=2)
% InnerPosition
posinner=ax.InnerPosition;
annotation("rectangle",posinner,Color='magenta',LineWidth=2)
% OuterPosition
posouter=ax.OuterPosition;
annotation("rectangle",posouter,Color='green',LineWidth=2)
% 外部位置扣除预留空白
tightInset=ax.TightInset;
posnone=posouter+[tightInset(1:2),-sum(tightInset([1,3])),-sum(tightInset([2,4]))];
annotation("rectangle",posnone,Color='cyan',LineWidth=2)
- 绿色 :OuterPosition
- 粉色 :InnerPosition
- 蓝色 :包括标签的轴位置
- 青色 :扣除预留位置的坐标区域位置
- 红色 :轴位置
好家伙五个位置每个都不一样,可以看到真真正正找到你画图的区域的框只有红色的框!
图例定位
这样我们能够真真正正的算出一些东西应该的位置,比如箭头,框。。。
举个例子,我很多代码需要生成一些特殊的图例,有了tightPosition
函数后我可以极其精确的定位图例在当前坐标范围内当前比例下的位置,之后在框里绘制一些东西:
ax=axes;hold on
t=linspace(0,10,100);
plot(t,sin(t),'LineWidth',2)
plot(t,2.*sin(t),'LineWidth',2)
plot(t,3.*sin(t),'LineWidth',2)
lgdHdl=legend('AutoUpdate','off');
lgdPos=lgdHdl.Position;
tightPos=tightPosition(ax);
XYMin=(lgdPos(1:2)-tightPos(1:2))./tightPos(3:4).*[diff(ax.XLim),diff(ax.YLim)]+[ax.XLim(1),ax.YLim(1)];
XYMax=(lgdPos(1:2)+lgdPos(3:4)-tightPos(1:2))./tightPos(3:4).*[diff(ax.XLim),diff(ax.YLim)]+[ax.XLim(1),ax.YLim(1)];
fill([XYMin(1),XYMax(1),XYMax(1),XYMin(1)],[XYMin(2),XYMin(2),XYMax(2),XYMax(2)],[1,0,0],'EdgeColor',[1,0,0],'LineWidth',5);
为部分坐标区域覆盖颜色
精确定位后,我们可以很轻松的为比如左半边区域上色:
ax=axes;hold on
t=linspace(0,10,100);
plot(t,sin(t),'LineWidth',2)
plot(t,2.*sin(t),'LineWidth',2)
plot(t,3.*sin(t),'LineWidth',2)
lgdHdl=legend('AutoUpdate','off');
tightPos=tightPosition(ax);
bluePos=tightPos;bluePos(3)=bluePos(3)/2;
annotation('textbox',bluePos,'BackgroundColor',[0,0,.8],'FaceAlpha',.3)
完
这期比较水,主要是展示一下发现的有意思的东西,之后可能会更几期算法,或者偷懒再更几期技巧合集。。
以上是关于MATLAB | 两个较新版本中的坐标区域小技巧的主要内容,如果未能解决你的问题,请参考以下文章