Matlab中带有colorbars和subplot第3个参数的紧密子图?

时间:2016-03-03 11:29:07

标签: matlab matlab-figure subplot colorbar

我希望有一个紧密的子图,即子图中的数字之间的最小间距

  • 你有子图的第三个参数,即你可以决定图片的位置,即在subplotnew_tight_subplot之间移动,以及
  • 您可以将它与彩条一起使用。

我在Matlab的FileExchange中描述了最流行的紧密子图。 无(等最流行的here Pekka的版本)可以传递以下代码

data=randi(513,513); 

ax1=subplot(2,1,1); 
plot(mat2gray(pdist(data, 'correlation')));
cbar1=colorbar(ax1);
axis(ax1, 'square');
xlim([0 size(mat2gray(pdist(data, 'correlation')),2)]);
set(cbar1, 'Visible', 'off')

ax2=subplot(2,1,2); 
imshow(squareform( mat2gray(pdist(data, 'correlation')), 'tomatrix') ); 
colormap('parula'); colorbar;
axis(ax2, 'square');  

Pekka的tight_subplot需要没有第三个参数的语法。 它也会像示例中的颜色栏一样失败。我不懂为什么。

关于色条的第二个问题的假设

我认为问题可能是这样一个事实,即colorbar对象是图形的子元素,而不是轴,它们的位置是用标准化的图形单位定义的;喜欢所讨论的注释对象here。 但是,我不确定如何为此调整紧密的子图。

在FileExchange 3.3.2016中的tight_subplot中编辑作者后的测试输出

代码

data = randi(513, 513); 

ax1=tight_subplot(2,1,[.01 .03],[.1 .01],[.01 .01]); 
plot(mat2gray(pdist(data, 'correlation')));

ax2=tight_subplot(2,1,[.01 .03],[.1 .01],[.01 .01]); 
imshow(squareform( mat2gray(pdist(data, 'correlation')), 'tomatrix') ); 

你得到了

enter image description here

plot失败,第二个图中由于某种原因有嘈杂的部分。为什么呢?

将Suever的答案扩展为2x2数字

ax1=axes('OuterPosition', [0 0.5 0.5 0.5]);
plot(u, 'Parent', ax1);
set(ax1, 'XLim', [0, size(u,1)]);
cbar1 = colorbar(); % not needed to assign ax1
set(cbar1, 'Visible', 'off')

ax3 = axes('OuterPosition', [0 0 0.5 0.5]);
image(data, 'Parent', ax3);

D=mat2gray(pdist(pTFD, 'correlation'));

ax2 = axes('OuterPosition', [0.51 0.5 0.5 0.5]);
plot(D, 'Parent', ax2);
set(ax2, 'XLim', [0, size(D,1)])
axis(ax2, 'square');
xlim([0 size(D,2)]);
set(cbar2, 'Visible', 'off')

ax4 = axes('OuterPosition', [0.51 0 0.5 0.5]);
imshow( D_square ); 
axis(ax4, 'square');  

其中2x2数字系统和我认为相当的地方

  • xlim([0 size(D,2)]);set(ax1, 'XLim', [0, size(D,2)]);相同。正确?
  • ...

如何使用带有颜色条和第三个参数的Matlab紧密子图?

2 个答案:

答案 0 :(得分:2)

tight_subplot的第三个参数定义了轴对象之间的间隙。对于内置subplot命令,第三个参数定义将哪个轴设置为图的CurrentAxes。此选项在tight_subplot中不可用,因为我个人认为它没有用。通常,我使用返回的轴手柄来指定添加图形的位置。

添加colorbar时会重新定位现有轴对象。

我已经为tight_subplot添加了第二个输出参数,它提供了轴的输出位置,以便您可以在添加颜色条后“重置”轴位置。

[hax, position] = tight_subplot();

% Add a colorbar which alters the positions
colorbar();

% Now reset the positions back to where they were
set(hax, {'Position'}, pos);

答案 1 :(得分:1)

我可能只是手动设置我的轴​​对象的位置以获得您想要的效果,而不是尝试在文件交换上处理subplot和不同的版本。您可以使用标准化单位,以便在父图形的大小发生变化时缩放位置。

此外,您可以设置轴的OuterPosition属性,其中考虑了正确显示轴的所有文本标签所需的空间。

figure

data=randi(513,513);

set(0, 'defaultaxeslooseinset', [0 0 0 0])

D = mat2gray(pdist(data, 'correlation'));
square = squareform(D, 'tomatrix');

% Set normalized outer position (x,y,width,height)
ax1 = axes('OuterPosition', [0, 0.5, 1, 0.5]);
plot(D, 'Parent', ax1);
set(ax1, 'XLim', [0, size(square, 1)])
axis(ax1, 'square');

cbar1 = colorbar();
set(cbar1, 'Visible', 'off')

% Set normalized outer position (x,y,width,height)
ax2 = axes('OuterPosition', [0 0 1 0.5]);
imshow(square);
colormap('parula'); colorbar;
axis(ax2, 'square');

enter image description here

如果你删除轴上的x和y刻度

set([ax1,ax2], 'xtick', [], 'ytick', []);

enter image description here

这可以很容易地适应任何尺寸,类似于以下

figure;
% [Rows, Columns]
axdim = [3, 3];

width = 1 ./ axdim(2);
height = 1./ axdim(1);

[x,y] = meshgrid(linspace(0,1,axdim(2)+1), ...
                 linspace(0,1, axdim(1)+1));

for k = 1:numel(x)
    ax = axes('OuterPosition', [x(k), y(k), width, height]);
    set(ax, 'xtick', [], 'ytick', []);
end