如何删除以下代码中子图像之间的空白区域?
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
答案 0 :(得分:2)
我认为这是有道理的。你的问题是下一个问题吗?
简而言之:轴相等,轴紧,使得数字引擎会错过子图,就是这样。
但是你怎么期望解决它?
为了使大数字适合其余部分,需要增加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
答案 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])
您必须手动更改这些数字才能获得良好的效果。