Matlab:多个图像未正确对齐'轴相等'

时间:2014-11-03 10:49:32

标签: matlab axis figure

如何删除以下代码中子图像之间的空白区域?

    fig = figure ;
set(fig, 'units', 'centimeter', 'position', [1 1 20 10])

a(1) = subplot(1,2,1) ;
imagesc(rand(4)), colormap gray

a(2) = subplot(2,2,2) ;
imagesc(rand(2,4))

a(3) = subplot(2,4,7) ;
imagesc(rand (2,2))

a(4) = subplot(2,4,8) ;
imagesc(rand (2,2))

axis(a, 'equal', 'tight')
set(a, 'xticklabel', [], 'yticklabel', [])

保存并播放此功能,以查看绘图的实际位置,以及Matlab认为的位置。

function showAxesBoundaries(fig)

if nargin==0
fig = figure ;
set(fig, 'units', 'centimeter', 'position', [1 1 30 10])

a(1) = subplot(1,2,1) ;
imagesc(rand(4)), colormap gray

a(2) = subplot(2,2,2) ;
imagesc(rand(2,4))

a(3) = subplot(2,4,7) ;
imagesc(rand (2,2))

a(4) = subplot(2,4,8) ;
imagesc(rand (2,2))

axis(a, 'equal', 'tight')

end

h = findobj(fig, 'tag', 'axesboundary');
if ~isempty(h)
delete(h);
end

handles.axes = findobj(fig, 'type', 'axes', '-not', 'tag', 'globalaxes');

if isempty(handles.axes)
error('TODO');
end

ax = axes('units', 'normalized', 'position', [0 0 1 1], ...
'visible', 'off', 'tag', 'globalaxes');

for n = 1:numel(handles.axes)

outerposition = get(handles.axes(n), 'outerposition');
position = get(handles.axes(n), 'position');
tightinset = get(handles.axes(n), 'tightinset');

axes(ax);

handles.r(1,n) = rectangle('position', outerposition, 'linestyle', '--', ...
'edgecolor', 'y', 'tag', 'axesboundary', 'linewidth', 2);
handles.r(2,n) = rectangle('position', position, 'linestyle', '--', ...
'edgecolor', 'g', 'tag', 'axesboundary', 'linewidth', 2);
handles.r(3,n) = rectangle('position', position+[-1 -1 1 1].*tightinset+[0 0 tightinset(1:2)], 'linestyle', '--', ...
'edgecolor', 'r', 'tag', 'axesboundary', 'linewidth', 2);
end

set(fig, 'resizefcn', {@rzfcn handles});

function rzfcn(hObject, event, handles)

for n = 1:numel(handles.axes)

outerposition = get(handles.axes(n), 'outerposition');
position = get(handles.axes(n), 'position');
tightinset = get(handles.axes(n), 'tightinset');

set(handles.r(1,n), 'position', outerposition);
set(handles.r(2,n), 'position', position);
set(handles.r(3,n), 'position', position+[-1 -1 1 1].*tightinset+[0 0 tightinset(1:2)]);
end

drawnow
refresh

2 个答案:

答案 0 :(得分:2)

我认为这是有道理的。你的问题是下一个问题吗?

enter image description here

简而言之:轴相等,轴紧,使得数字引擎会错过子图,就是这样。

但是你怎么期望解决它?

为了使大数字适合其余部分,需要增加x和Y.你可以尝试手动增加窗口的大小,你会看到第一个子图变大。您可以使其大小相同,避免错位。但是第二个(长)子图怎么样?如果你横向增加数字的大小,所有其余的也被迫增长!

你可以想象很多不同的景点,不同大小的子图和数据,其中axis equal axis tight不可能对齐所有子图。所以逻辑上Matlab决定(我猜)不要尝试。

更容易看到的另一个不可能的案例:

fig = figure(1);
set(fig, 'units', 'centimeter', 'position', [1 1 20 10])

a(1) = subplot(2,4,[1 2 5 6]) ;
imagesc(rand(100)), colormap gray
axis equal
axis tight
a(2) = subplot(2,4,3:4) ;
imagesc(rand(2,400))
axis equal;axis tight
a(3) = subplot(2,4,7) ;
imagesc(rand (2,2))
axis equal;axis tight
a(4) = subplot(2,4,8) ;
imagesc(rand (2,25))
axis equal;axis tight

enter image description here

答案 1 :(得分:1)

更改每个轴' 'Position'财产。例如,

set(a(1), 'Position', get(a(1),'Position') + [-.03 -.03 .06 .06])
set(a(2), 'Position', get(a(2),'Position') + [-.03 -.03 .06 .06])
set(a(3), 'Position', get(a(3),'Position') + [-.03 -.03 .06 .06])
set(a(4), 'Position', get(a(4),'Position') + [-.03 -.03 .06 .06])

您必须手动更改这些数字才能获得良好的效果。