如何链接不同的缩放轴在App Designer?

44次(过去30天)
哈米德科里奇
哈米德科里奇 2021年9月21日
评论道: 亚当Danz 2021年9月28日22:19
在App Designer中,我有两个轴。在第一个轴上,我加载一个图像并用imagesc显示它。在第二个轴上,我在图像的y方向上绘制了强度图。
现在我想链接轴,当我放大图像时,我也想放大第二个轴。我使用了链接轴,但它对我不起作用,因为两个轴的比例是不同的,它不能放大预期的区域。另外,链接轴的一个问题是它用两种方式连接轴所以我想让第二个轴在我放大图像轴时受到影响但我不想反过来。我只需要在x方向上连接两个轴。

接受的答案

亚当Danz
亚当Danz 2021年9月21日
编辑:亚当Danz 2021年9月27日20:21
linkaxes 有第二个输入,允许你连接x,y,或两个轴。然而,由于y轴有不同的比例 linkaxes 功能对你没有用处。
中演示了不同尺度的连接轴 这个答案 但是因为这个答案使用了重叠的坐标轴 链接 “x轴和y轴,我对演示做了一些调整,如下所示 链接 两个图之间的y轴。
唯一的“ 输入 在整个代码中 斧头 哪个是轴柄的1x2向量 (ax₁,ax2) 在哪里 ax₁ 左轴是和吗 ax2 为右轴手柄。
这个过程并不简单,因为您必须手动缩放坐标轴,使用侦听器,并调整“恢复视图”工具栏按钮的行为。如果需要,请参阅上面提到的答案以获得详细的描述和评论。在R2020b和R2021a中测试。
附件
  • linkedYAxesDiffScale.m-这个答案的完整演示。
  • linkedYAxesDiffScale_UI.m这个答案的完整演示修改为使用ui图形和ui轴。
0.设置演示图
我们的目标是连接具有不同比例的y轴。
图()
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岁,“定位”“水平”
网格
重要的是: 在继续之前,应该使用 ylim () 在两个轴上(未显示)。在使用自动y限制模式的简单演示中,y限制已经被理想地设置了。
1.关闭轴2的交互作用(右)
所有的缩放/平移都应该在左边的1号轴上完成。
ax(2)。交互= [];
ax (2) .Toolbar。可见=“关闭”
2.设置一个侦听器,它将响应轴#1(左)的y轴限制变化
计算比例系数将ax2的y比例转换为ax1的y比例
= range(ax(2).YLim) / range(ax(1).YLim);
%存储两个轴的原始y轴限制
axBaseLim = [ax (1) .YLim;斧子(2).YLim];
将监听器分配给ax1
斧子(1).UserData。侦听器= addlistener (ax (1) {“YLim”},“PostSet”...
@ axisLimitListener (~ ~) ([], [], [ 斧子(1),ax (2)), xyscale, axBaseLim));
3.解决“恢复视图”按钮的问题
当您按下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中y轴限制更改的侦听器
函数axisLimitListener (~, ~, ax, scalingFactor axBaseLim)
%监听器回调,响应y轴限制更改为ax1和
%将y轴限制更新为ax2。
%的输入
% ax: 1x2轴句柄数组[ax1,ax2]
比例因子:(见上面xyscale的描述)
% axBaseLim:(参见上面关于axBaseLim的描述)
将ax2 ylim从ax1转换为由原始轴范围归一化的值。
normLowerLimit = (ax(1). ylim (1) - axBaseLim(1,1))./range(axBaseLim(1,:));
计算ax2的新下限。
newLimits = normLowerLimit.*range(axBaseLim(2,:)) + axBaseLim(2,1);
%计算新的上限ax1。
newLimits(:,2) = newLimits + range(ax(1). ylim).*scalingFactor;
%更新ax1限制
集(ax (2),“YLim”newLimits)
结束
5.定义响应1号轴工具栏>恢复视图的“恢复视图”回调
函数myRestoreButtonCallbackFcn(hobj, event, ax2, originalCallback, xyscale, axBaseLim)
%响应按下ax1工具栏中的恢复按钮。
% originalCallback是原始回调的函数句柄
此按钮的%函数。
% xyscale和axBaseLim在别处定义。
originalCallback (hobj、事件)%重置ax2
axisLimitListener ([] [], [event.Axes, ax2], xyscale, axBaseLim)%更新ax₁
结束
8的评论

登录评论。

更多的答案(0)

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!