我有3个物体(一张照片和两个地块)放在一个图上的子图中。它应该是这样的:
但是正如人们可以注意到的那样,照片不应该是正方形而是矩形。我试着这样做(在这里找到Matlab: How to align the axes of subplots when one of them contains a colorbar?):
main=subplot(4,4,[5,6,7,9,10,11,13,14,15]) %photo
imagesc(im);
axis('image')
pion=subplot(4,4,[8,12,16]); %right plot (rotated)
view(90, 90)
plot(ypion,Ppion,'.k');
poz=subplot(4,4,1:3); %upper plot
plot(xpoz,Ppoz,'.k');
pos1=get(poz,'Position')
pos2=get(main,'Position')
pos3=get(pion,'Position')
pos1(3) = pos2(3); %width for the upper plot
set(poz,'Position',pos1)
pos3(4) = pos2(4); %height for the right plot
set(pion,'Position',pos3)
我得到的就像这样:
如何强制上图的宽度为照片本身(而不是照片子图)?设置子图的相等宽度不起作用,因为照片没有填充子图区域。
答案 0 :(得分:2)
命令axis image
调整图像轴比率。因此,原则上,如果您将两个地块的地积比率调整为相同的比率,它将按您的要求进行。
有一点需要注意;由于您将图形绘制在3x3子图中,而顶部为1x3,右图为3x1,因此图像本质上比图的宽3倍或更高。因此,您必须将图表的x
或y
比率除以3.
一些示例代码:
clc, clf
% generate some bogus data
ypion = rand(500,1);
Ppion = 450*rand(500,1);
xpoz = rand(500,1);
Ppoz = 450*rand(500,1);
% Load photo
photoSub = subplot(4,4,[5,6,7,9,10,11,13,14,15]);
load mandrill
photo = imagesc([X,X]);
colormap(map)
axis image
photoAxs = gca;
photoAxsRatio = get(photoAxs,'PlotBoxAspectRatio')
% right plot
subplot(4,4,[8,12,16]);
plot(Ppion,ypion,'k.');
rightAxs = gca;
axis tight
% upper plot
subplot(4,4,[1 2 3]);
plot(xpoz,Ppoz,'k.');
topAxs = gca;
axis tight
% adjust ratios
topAxsRatio = photoAxsRatio;
topAxsRatio(2) = photoAxsRatio(2)/3.8; % NOTE: not exactly 3...
set(topAxs,'PlotBoxAspectRatio', topAxsRatio)
rightAxsRatio = photoAxsRatio;
rightAxsRatio(1) = photoAxsRatio(1)/3.6; % NOTE: not exactly 3...
set(rightAxs,'PlotBoxAspectRatio', rightAxsRatio)
这给出了以下结果:
只是为了测试,将photo = imagesc([X,X]);
更改为photo = imagesc([X;X]);
会产生以下结果:
请注意,我没有将比率除以3 正好;如果我使用接近4的因子,它才会出来。我不知道为什么会这样; AFAIK,3倍应该可以解决问题...
哦,好吧,至少你现在可以使用了一些东西:)
答案 1 :(得分:1)
可能是接受答案的更好解决方案。此解决方案改编自原始发布的here。
% adjust ratios
photoAxsratio = photoAxs.PlotBoxAspectRatio(1)/photoAxs.PlotBoxAspectRatio(2);
topAxsratio = photoAxsratio * photoAxs.Position(4)/topAxs.Position(4);
topAxs.PlotBoxAspectRatio = [topAxsratio, 1, 1];
rightAxsratio = rightAxs.Position(3) / (photoAxs.Position(3) / photoAxsratio);
rightAxs.PlotBoxAspectRatio = [rightAxsratio, 1, 1];
预览:
稍作解释
有些解释已在原帖中发布,我不打算在此重复。
想法是计算需要调整大小的数字的正确宽高比。
我们有以下等式:
Photo.width = Photo.height * Photo.ratio
TopAxis.width = TopAxis.height * TopAxis.ratio
RightAxis.width = RightAxis.height * RightAxis.ratio
让
TopAxis.width = Photo.width
RightAxis.height = Photo.height
我们有
TopAxis.height * TopAxis.ratio = Photo.height * Photo.ratio
TopAixs.ratio = Photo.ratio * Photo.height / TopAxis.height
RightAxis.width / RightAxis.ratio = Photo.width / Photo.ratio
RightAxis.ratio = RightAxis.width / (Photo.width / Photo.ratio)
答案 2 :(得分:1)
自 matlab R2019b 发布以来,您现在可以使用:tiledlayout
和 nexttile
。
现在很容易做到:
% Load a random scary image
I = im2gray(imread('https://unwinnable.com/wp-content/uploads/2011/10/The-Ring-well.jpg'));
% Some computation...
Sx = sum(I)/max(sum(I));
Sy = sum(I,2)/max(sum(I,2));
% We create an empty 3x3 tiled layout:
% 1 2 3
% 4 5 6
% 7 8 9
tiledlayout(3, 3);
% Starting from the tile 1, we plot a 1x2 tile:
% 1 2 x
% x x x
% x x x
nexttile(1,[1 2])
plot(Sx,'k.')
% Starting from the tile 4, we plot a 2x2 tile:
% x x x
% 4 5 x
% 7 8 x
nexttile(4,[2 2])
imagesc(I)
colormap(gray(256))
% Starting from the tile 6, we plot a 2x1 tile:
% x x x
% x x 6
% x x 9
nexttile(6,[2 1])
plot(Sy,1:numel(Sy),'k.')
Matlab 自动调整绘图的大小。
我们得到:
在引擎盖下,平铺布局如下所示:
答案 3 :(得分:0)
对于这种特殊情况,我建议直接使用低级axes
而不是高级subplot
。
使用您创建的三个'OuterPosition'
对象的axes
属性,将它们放在适当大小的正确位置。
答案 4 :(得分:0)
如果您希望图像与轴对齐(图像失真):
将axis('image')
更改为axis('tight')
。
如果要保留图像宽高比,并将轴与图像对齐:
这很快又脏,但在应用axis('tight')
后,将数字调整到适当的比例......