我如何修改我的子图位置以阻止它们相互覆盖?

How can I modify my subplot positions to stop them overwriting each other?

我正在尝试创建一个世界地图的子图(6 个图),我正在将选定的 shapefile 写入其中。我的问题是我放置的子图:它们互相覆盖。我从 Whosebug 上的其他类似问题了解到,这是因为轴以某种方式重叠。但我认为我已经创建了他们只是 'side-by-side' 的职位(见下面的代码)。我试图使轴透明,但似乎无济于事。我的问题是:如何修改绘图位置,以免它们相互覆盖?

我正在使用的代码(删除了 shapefile 内容)是:

clc;
clear all;
%First create the positions for the subplots
handle1=subplot(3,2,1);
H1=get(handle1,'position');
h1pos=H1+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h1pos)
hold all

handle2=subplot(3,2,2);
H2=get(handle2,'position');
h2pos=H2+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h2pos)

handle3=subplot(3,2,3);
H3=get(handle3,'position');
h3pos=H3+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h3pos)

handle4=subplot(3,2,4);
H4=get(handle4,'position');
h4pos=H4+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h4pos)

handle5=subplot(3,2,5);
H5=get(handle5,'position');
h5pos=H5+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h5pos)

handle6=subplot(3,2,6);
H6=get(handle6,'position');
h6pos=H6+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h6pos)

subplot(3,2,1,'Position',h1pos)
text(0.02,0.98,'(a)','Units', 'Normalized', 'VerticalAlignment', 'Top');
%handle1=subplot(2,2,1);
%H1=get(handle1,'position');
%h1pos=H1+[-0.1,-0.1,0.1,0.1]; subplot(2,2,1,'Position',h1pos)
h=worldmap('world')
%     borders('countries', 'Color', 'black')

subplot(3,2,2,'Position',h2pos)
text(0.02,0.98,'(b)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 

subplot(3,2,3,'Position',h3pos)
text(0.02,0.98,'(c)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 

subplot(3,2,4,'Position',h4pos)
text(0.02,0.98,'(d)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 

subplot(3,2,5,'Position',h5pos)
text(0.02,0.98,'(e)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')

subplot(3,2,6,'Position',h6pos)
text(0.02,0.98,'(f)','Units', 'Normalized', 'VerticalAlignment', 'Top')
h=worldmap('world')
%     borders('countries', 'Color', 'black') 
%     borders('countries', 'Color', 'black') 

subplot 本身会创建不重叠的轴,但会删除任何重叠的现有轴。所以把6个subplot调用放在最前面,最后换个位置。使用 set(handle1,'Position',h1pos),而不是 subplot(...) 来更改位置。您还可以使用 axes 创建坐标区对象而不删除任何现有的重叠坐标区。由于无论如何您都是手动设置位置,因此 subplot 命令对您没有任何优势。

您也可以考虑使用新的 tiledlayout 功能。

MATLAB 的 position 向量定义为 [left bottom width height],在你的情况下,如果你查看 h1pos 和 h3pos,它们是

h1pos = [0.0300    0.6093    0.4347    0.3157]
h3pos = [0.0300    0.3096    0.4347    0.3157]

h1pos(2) - h3pos(2) = 0.2996 < 0.3157,即轴之间的距离小于你的 h1 的高度,结果有重叠,导致 "subplot" 删除你的轴。

要解决这个问题,您可以更仔细地计算您的位置,要么保留更多 space 要么降低高度(将高度降低到 0.05 即可)。您可以通过执行 handle6.Position = [0.0300 0.3096 0.4347 0.3157];

之类的操作来修改位置 属性

P.S。您可以考虑通过减少一些冗余来改进您的编码风格。这是一个可以完成这项工作的代码片段

offset = [-0.05,-0.05,0.1,0.05];
pos = zeros(6, 4);

for ii = 1:6
    h = subplot(3,2,ii);
    pos(ii, :) = h.Position;
end

for ii = 1:6
    subplot('Position',pos(ii,:) + offset);
    text(0.02,0.98,['(' char('a'+ii-1) ')'],'Units', 'Normalized', 'VerticalAlignment', 'Top');
    h=worldmap('world');
end