Matlab平方控制中异质矩阵的链接?

时间:2016-03-03 22:32:53

标签: matlab data-visualization

我试图让两个矩阵的链接控制具有不同的xlims和ylims linkaxes(),其中两个矩阵之间存在反函数。 矩阵的轴(信号D /方阵D_square)分别为ax2 / ax4。 轴的尺寸为

enter image description here

ax2的限制与ax4的限制不同,因为linkaxes()只是使所有输入轴具有相同的限制。 选择图ax2(=缩放图中的一个区域)应该在图4中给出适当的选择。 我想你应该告诉Matlab如何做到这一点。 两个数据集之间的唯一区别是ax2的数据是矩阵D,而ax4的数据是矩阵D_square=squareform(D, 'tomatrix'),它具有逆变换{{1}因此可以在两个数字之间进行控制。 代码

D=squareform(D_square, 'tomatrix')

输出

enter image description here

其中图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

Suever的答案中的一些修复

一些变化

  • 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');主动控制方形。 在原始视图中保持平方的输出

enter image description here

其中一个完整的矩阵。

在原始视图中不保持正方形的输出

禁用set(him, 'XData', xrange, 'YData', xrange);

enter image description here

其中Fig.ax4是对的。否

Suever第二次编辑的成功输出

set(him, 'XData', xrange, 'YData', xrange);的x控制中的原始视图以及Suever的答案中描述的有关标签的其他更改

enter image description here

其中媒体图片也是功能性的。

如何告诉Matlab使用linkaxes()的数字之间的关系? 如何在Matlab中的两个数字之间建立链接控制?

1 个答案:

答案 0 :(得分:1)

由于底部轴的图像为513 x 513(xlims = [0.5 513.5])而顶部轴的xlimits为[0 131328],因此您遇到了问题。如果您需要它们相同,则只需将图像的XDataYData更改为与顶部图形的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')