我如何修改我的子图位置以阻止它们相互覆盖?
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
我正在尝试创建一个世界地图的子图(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