如何在应用程序链接不同的扩展轴缩放设计师?

24日视图(30天)
在应用程序设计师,我有两个轴。在第一轴,我和显示亮度图像装载图像并显示它。第二轴,我阴谋y方向上的强度图的图像。
现在我想连接轴,当我放大图片我想放大第二轴。我用linkaxes但它对我没用,因为两个轴的尺度是不同的,它不会放大目标区域。linkaxes还一个问题是它连接轴两种方式所以我希望第二轴的影响当我放大图像轴,但我不想让它相反。我只需要链接的两个轴方向。

接受的答案

亚当Danz
亚当Danz 2021年9月21日
编辑:亚当Danz 2021年9月27日
linkaxes 第二个输入,允许您链接的x, y,或两个轴。然而,由于你的轴有不同的尺度, linkaxes 函数将不会对你有用。
连接轴与不同尺度了 这个答案 但由于回答使用覆盖轴和“ 链接 “x和y都我做了一些调整,演示,如下所示 链接 两个情节之间的轴。
唯一的“ 输入 “在整个代码 斧头 这是一个1 x2轴矢量处理 (ax₁, ax2) 在哪里 ax₁ 左轴和吗 ax2 right-axes处理。
这个过程并不简单,因为你必须手动规模轴,使用一个侦听器,调整“恢复视图”工具栏按钮的行为。如果需要,看到答案上面提到的详细描述和评论。在R2020b和R2021a进行测试。
附件
  • linkedYAxesDiffScale.m——这个答案的完整演示。
  • linkedYAxesDiffScale_UI.m——完整的演示使用UIFigure和UIAxes这个答案修改。
0。设置演示图
我们的目标将是链接不同尺度的轴。
图()
tiledlayout (1、3)
ax = gobject (1、2);
斧子(1)= nexttile (1:2);
x = randn (1500) * 100;
y = randn (1500) * 50 + 500;
情节(x, y,“o”)
网格
斧子(2)= nexttile (3);
直方图(y-mean (y), 20岁,“定位”,“水平”)
网格
重要的是: 在继续之前,yscales应该设置使用 ylim () 在这两个轴(没有显示)。y-limits已经理想中设置简单的演示使用汽车Y-limit-mode。
1。关闭交互轴# 2(右)
应该在所有缩放/移动轴左边# 1。
ax (2)。交互= [];
ax (2) .Toolbar。可见=“关闭”;
2。设立一个侦听器,应对轴极限轴变化# 1(左)
%计算ax₁y轴的比例因子将ax2 y轴
xyscale =范围(ax (2) .YLim) /范围(ax (1) .YLim);
%存储原始轴轴的限制
axBaseLim = [ax (1) .YLim;斧子(2).YLim];
%为ax₁分配侦听器
斧子(1).UserData。侦听器= addlistener (ax (1) {“YLim”},“PostSet”,
@ (~ ~)axisLimitListener ([] [], [ax ax (1), (2)), xyscale, axBaseLim));
3所示。解决“恢复视图”按钮的问题
当你按下“恢复视图”按钮在axis # 1工具栏,此侦听器不会回应。下面地址,这个街区和下面的“myRestoreButtonCallbackFcn”块将更新轴# 2“恢复视图”按钮被按下时轴# 1。
axTB = axtoolbar (ax (1),“默认”);
isRestoreButton = strcmpi ({axTB.Children.Icon},“restoreview”);
如果任何(isRestoreButton)
restoreButtonHandle = axTB.Children (isRestoreButton);
originalRestoreFcn = restoreButtonHandle.ButtonPushedFcn;
restoreButtonHandle。ButtonPushedFcn =
{@myRestoreButtonCallbackFcn ax (2)、originalRestoreFcn xyscale, axBaseLim};
结束
4所示。定义侦听器来响应更改轴轴# 1的限制
函数axisLimitListener (~, ~, ax, scalingFactor axBaseLim)
%侦听器回调,响应轴限制ax₁和变化
%更新轴的极限ax2。
%的输入
% ax: 1 x2轴处理数组(ax₁, ax2)
% scalingFactor(参见上面的描述xyscale):
% axBaseLim(参见上面的描述axBaseLim):
%转换ax2 ylim ax₁原始轴的值归一化距离。
normLowerLimit = (ax (1) .YLim (1) - axBaseLim(1,1))。/范围(axBaseLim (1:));
%计算新的下限ax2。
newLimits = normLowerLimit。*范围(axBaseLim (2:)) + axBaseLim (2, 1);
新上限ax₁%计算。
newLimits (:, 2) = newLimits +范围(ax (1) .YLim)。* scalingFactor;
%更新ax₁限制
集(ax (2),“YLim”newLimits)
结束
5。定义“恢复视图”回调,响应轴# 1工具栏>恢复视图
函数myRestoreButtonCallbackFcn (hobj事件,ax2、originalCallback xyscale, axBaseLim)
%对紧迫的ax₁restore按钮的工具栏。
% originalCallback最初的回调函数处理
%这个按钮功能。
% xyscale和axBaseLim定义。
originalCallback (hobj、事件)%重置ax2
axisLimitListener ([] [], [event.Axes, ax2], xyscale, axBaseLim)%更新ax₁
结束
8的评论

登录置评。

更多的答案(0)

类别

找到更多的在迁移向导的应用帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的