我试图让两个矩阵的链接控制具有不同的xlims和ylims linkaxes()
,其中两个矩阵之间存在反函数。
矩阵的轴(信号D
/方阵D_square
)分别为ax2
/ ax4
。
轴的尺寸为
ax2
的限制与ax4
的限制不同,因为linkaxes()
只是使所有输入轴具有相同的限制。
选择图ax2(=缩放图中的一个区域)应该在图4中给出适当的选择。
我想你应该告诉Matlab如何做到这一点。
两个数据集之间的唯一区别是ax2
的数据是矩阵D
,而ax4
的数据是矩阵D_square=squareform(D, 'tomatrix')
,它具有逆变换{{1}因此可以在两个数字之间进行控制。
代码
D=squareform(D_square, 'tomatrix')
输出
其中图ax4被替换,因为data=randi(513,513);
D=mat2gray(pdist(data, 'correlation'));
% Set normalized outer position (x,y,width,height)
ax2 = axes('OuterPosition', [0.51 0.5 0.5 0.5]);
plot(D, 'Parent', ax2);
axis(ax2, 'square');
title('Corr pdist');
cbar2 = colorbar();
set(ax2, 'XLim', [0 size(D,2)]);
set(cbar2, 'Visible', 'off')
grid minor;
% Force a draw event to have the axes determine where the
labelconverter = @(x)sprintf('%.2g', x); % http://stackoverflow.com/a/35780915/54964
callback = @(varargin)set(ax2, 'xticklabels', arrayfun(labelconverter, get(ax2, 'xtick'), 'uniform', 0));
set(hFig, 'SizeChangedFcn', callback);
callback(); % necessary for the original small window and its scientific numbering
%% Problem here!
D_square=squareform(D, 'tomatrix');
ax4 = axes('OuterPosition', [0.51 0 0.5 0.5]);
set(ax4, 'XLim', [0 size(D_square,2)]);
image( D_square, 'Parent', ax4 ); % TODO problem here!
set(gca,'YDir','normal');
colormap('parula'); colorbar;
axis(ax4, 'square');
title('Square Corr pdist');
linkaxes([ax2,ax4], 'x');
的lims被ax4
替换,反之亦然,最后一行是ax2
。
一些变化
linkaxes([ax4,ax2], 'x');
imagesc()
him=imagesc( D_square, 'Parent', ax4 );
之后axis(ax4, 'square');
发起/让事情成为正方形; imagesc()
还是仅一个轴linkaxes([ax2,ax4], 'xy');
代码
linkaxes([ax2,ax4], 'x');
问题出在哪里
data=randi(513,513);
D=mat2gray(pdist(data, 'correlation'));
% Figure out the xrange of your first plot
xrange = [1, numel(D)];
% Set normalized outer position (x,y,width,height)
ax2 = axes('OuterPosition', [0.51 0.5 0.5 0.5]);
plot(D, 'Parent', ax2);
axis(ax2, 'square');
title('Corr pdist');
cbar2 = colorbar();
set(ax2, 'XLim', [0 size(D,2)]);
set(cbar2, 'Visible', 'off')
grid minor;
% Force a draw event to have the axes determine where the
labelconverter = @(x)sprintf('%.2g', x); % http://stackoverflow.com/a/35780915/54964
callback = @(varargin)set(ax2, 'xticklabels', arrayfun(labelconverter, get(ax2, 'xtick'), 'uniform', 0));
set(hFig, 'SizeChangedFcn', callback);
callback(); % necessary for the original small window and its scientific numbering
D_square=squareform(D, 'tomatrix');
ax4 = axes('OuterPosition', [0.51 0 0.5 0.5]);
set(ax4, 'XLim', [0 size(D_square,2)]);
him=imagesc( D_square, 'Parent', ax4 );
axis(ax4, 'square'); % To let things be square!
set(gca,'YDir','normal');
colormap('parula'); colorbar;
title('Square Corr pdist');
% Set XData AND YData (to keep things square)
set(him, 'XData', xrange, 'YData', xrange);
linkaxes([ax2,ax4], 'xy');
set(him, 'XData', xrange, 'YData', xrange);
之后axis(ax4, 'square');
启动/让它们成为正方形;由于某种原因,代码没有按预期工作,因为方形形状的起点太远了。我个人认为,在两个数字之间可能无法严格控制(imagesc()
的x,y轴)。
我认为至少可以控制一个轴(linkaxes([ax2,ax4], 'xy')
或linkaxes([ax2,ax4], 'x')
),因为存在反函数。一些经验证据
linkaxes([ax2,ax4], 'y')
中的输出是两个空数字。 linkaxes([ax2,ax4], 'xy');
中的输出是一个带有一些图形和完整矩阵的数字。与y控制类似。 这里通过linkaxes([ax2,ax4], 'x');
主动控制方形。
在原始视图中保持平方的输出
其中一个完整的矩阵。
禁用set(him, 'XData', xrange, 'YData', xrange);
其中Fig.ax4是对的。否
set(him, 'XData', xrange, 'YData', xrange);
的x控制中的原始视图以及Suever的答案中描述的有关标签的其他更改
其中媒体图片也是功能性的。
如何告诉Matlab使用linkaxes()的数字之间的关系? 如何在Matlab中的两个数字之间建立链接控制?
答案 0 :(得分:1)
由于底部轴的图像为513 x 513(xlims = [0.5 513.5])而顶部轴的xlimits为[0 131328],因此您遇到了问题。如果您需要它们相同,则只需将图像的XData
和YData
更改为与顶部图形的XLims相同。
% Figure out the xrange of your first plot
xrange = [1, numel(D)];
% Set XData AND YData (to keep things square)
him = image( D_square, 'Parent', ax4 );
set(him, 'XData', xrange, 'YData', xrange);
现在当你致电linkaxes
(链接XLims)时,他们应该一起移动。您还需要调用axis(ax4, 'tight')
将轴重新调整为新的图像数据。
我在下面添加了代码的修改版本也使两个图之间的xticklabels保持一致。
hFig = figure();
data = randi(513,513);
D = mat2gray(pdist(data, 'correlation'));
D_square = squareform(D, 'tomatrix');
% Set normalized outer position (x,y,width,height)
ax2 = axes('OuterPosition', [0.51 0.5 0.5 0.5]);
plot(D, 'Parent', ax2);
axis(ax2, 'square');
title('Corr pdist');
cbar2 = colorbar();
set(ax2, 'XLim', [0 size(D,2)]);
set(cbar2, 'Visible', 'off')
grid minor;
% Force a draw event to have the axes determine where the
labelconverter = @(x)sprintf('%.2g', x); % http://stackoverflow.com/a/35780915/54964
callback = @(varargin)set(ax2, 'xticklabels', arrayfun(labelconverter, get(ax2, 'xtick'), 'uniform', 0));
set(hFig, 'SizeChangedFcn', callback);
callback(); % necessary for the original small window and its scientific numbering
ax4 = axes('OuterPosition', [0.51 0 0.5 0.5]);
him = imagesc( D_square, 'Parent', ax4 ); % TODO problem here!
% Set the XData and YData of the image
set(him, 'xdata', [1, size(D, 2)], 'ydata', [1, size(D,2)])
set(ax4,'YDir','normal');
colormap('parula');
colorbar;
axis(ax4, 'square');
% Fit the axes to the new XData and YData
axis(ax4, 'tight')
title('Square Corr pdist');
% Link the two together
linkaxes([ax2,ax4], 'x');
% Ensure that the labels ALSO remain the same
linkprop([ax2,ax4], 'XTickLabel')