您好我在matlab中遇到了问题 我想创建一个包含10个子图的图。在2X5方向。但问题是我想减少它们之间的死区空间。我还需要保留标题,xlabel为第一行图像&第二行图像的xlabel(仅)。不需要ylabels。
直到现在我已经完成了这个代码(第一行):一旦我想到第一行,第二行应该是小菜一碟。
close all
figure,set(gca,'Color','none')
subplot(2,5,1);subplot('Position',[0.02 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,1)), [0 0], 'r','LineWidth',2);
hold off;title('1st curve','FontSize',12);xlabel('(a)','FontSize',12)
subplot(2,5,2);subplot('Position',[0.215 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,2)), [0 0], 'r','LineWidth',2);
hold off;title('2nd curve','FontSize',12);xlabel('(b)','FontSize',12)
subplot(2,5,3);subplot('Position',[0.410 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,3)), [0 0], 'r','LineWidth',2);
hold off;title('3rd curve','FontSize',12);xlabel('(c)','FontSize',12)
subplot(2,5,4);subplot('Position',[0.605 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,4)), [0 0], 'r','LineWidth',2);
hold off;title('4th curve','FontSize',12);xlabel('(d)','FontSize',12)
subplot(2,5,5);subplot('Position',[0.8 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,5)), [0 0], 'r','LineWidth',2);
hold off;title('5th curve','FontSize',12);xlabel('(e)','FontSize',12)
这给了我这样的输出:
如您所见,第四张图片不存在。代码有什么问题?我已经多次重新检查了我的代码和计算但是找不到任何错误。
有趣的是,当我运行此代码[仅具有第4个子图]
时subplot(2,5,4);subplot('Position',[0.605 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,4)), [0 0], 'r','LineWidth',2);
hold off;title('4th curve','FontSize',12);xlabel('(d)','FontSize',12)
我得到了这个答案!!
请有人能告诉我我哪里错了吗?注意我确实需要xlabel和第一行图像的标题。
编辑:然后我去做了这件事。现在我得到了五张图片。然而,在所有情况下图像之间的间隔不均匀,特别是第一和第二之间的间隔。第二张图片与其他图片不同。我的代码:
close all
figure,set(gca,'Color','none')
subplot(2,5,1);subplot('Position',[0.02 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,1)), [0 0], 'r','LineWidth',2);
hold off;title('1st curve','FontSize',12);xlabel('(a)','FontSize',12)
subplot(2,5,2);subplot('Position',[0.210 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,2)), [0 0], 'r','LineWidth',2);
hold off;title('2nd curve','FontSize',12);xlabel('(b)','FontSize',12)
subplot(2,5,3);subplot('Position',[0.405 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,3)), [0 0], 'r','LineWidth',2);
hold off;title('3rd curve','FontSize',12);xlabel('(c)','FontSize',12)
subplot(2,5,4);subplot('Position',[0.600 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,4)), [0 0], 'r','LineWidth',2);
hold off;title('4th curve','FontSize',12);xlabel('(d)','FontSize',12)
subplot(2,5,5);subplot('Position',[0.795 0.51 0.18 0.45]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,5)), [0 0], 'r','LineWidth',2);
hold off;title('5th curve','FontSize',12);xlabel('(e)','FontSize',12)
现在我得到了这个答案:
我该如何纠正?请帮助!在此先感谢!!
编辑:我似乎已经解决了这个问题。请看下面的答案。不过我确实有查询。 我想让代码在循环中运行,因此实现了这段代码。I = imread('coins.png');
I = imresize(I,[128 128]);
for no = 1:5
subplot('Position',[0.025+0.19*(no-1) 0.51 0.19 0.48]);
imshow(I);
get(gca,'Position');set(gca, 'XTick', []);set(gca, 'YTick', []);
title({'Image' num2str(no)});
subplot('Position',[0.025+0.19*(no-1) 0.03 0.19 0.48]);
imshow(I);
get(gca,'Position');set(gca, 'XTick', []);set(gca, 'YTick', []);
title({'Image' num2str(no)});
end
答案就是这样
这段代码可以被矢量化吗?
答案 0 :(得分:3)
内置的subplot
函数非常强大而且很棒。我认为最好坚持使用subplot
,而不是使用自定义计算位置。问题当然是subplot
坚持“额外”的空间。这个空间受两个因素控制。第一个是数字应用程序数据的用户控制的SubplotDefaultAxesLocation
属性。第二个是inset
函数中的硬编码subplot
。 SubplotDefaultAxesLocation
属性控制图形边缘周围的空白,而inset
控制面板之间的空间。您可以使用
hfig = figure;
setappdata(hfig, 'SubplotDefaultAxesLocation', [0, 0, 1, 1])
要删除需要编辑(或复制编辑)subplot.m
的面板之间的空间,在R2013a中,有问题的行是129和130
% This is the percent offset from the subplot grid of the plotbox.
inset = [.2, .18, .04, .1]; % [left bottom right top]
如果您将第130行更改为
inset = [0.0, 0.0, 0.0, 0.0]; % [left bottom right top]
然后面板之间没有任何空间。更好的是像
% This is the percent offset from the subplot grid of the plotbox.
if ~isappdata(ancestorFigure, 'SubplotDefaultInset')
inset = [.2, .18, .04, .1]; % [left bottom right top]
else
inset = getappdata(ancestorFigure, 'SubplotDefaultInset');
end
因此您可以控制inset
。使用这个稍微修改过的subplot
函数
I = imread('coins.png');
I = imresize(I,[128 128]);
voffset = 0.3;
hfig = figure;
setappdata(hfig, 'SubplotDefaultAxesLocation', [0, voffset/2, 1, 1-voffset]);
setappdata(hfig, 'SubplotDefaultInset', [0, 0, 0, 0]);
nrow = 2;
ncol = 5;
hax = nan(nrow, ncol);
for irow = 1:nrow
for icol = 1:ncol
hax(irow, icol) = mysubplot(nrow, ncol, icol+(irow-1)*ncol, 'align');
imshow(I);
if irow == 1
title(hax(irow, icol), ['Curve #', num2str(icol)], 'FontSize',12);
end
if irow == nrow
xlabel(hax(irow, icol), ['(', char(96+icol), ')'], 'FontSize',12);
end
end
end
set(hax, 'XTick', [], 'YTick', []);
pos = get(hfig, 'Position');
set(hfig, 'Position', [pos(1:2), (1-voffset)*pos(3), nrow/ncol*pos(3)]);
您需要voffset
以允许标题和xlabel适合图形。您需要缩放图形,使其具有正确的宽高比来处理面板。结果是
曲线1和2以及曲线3和4之间的小间隙似乎是渲染假象。
如果您想要行之间的标签,则需要添加一些额外的空间。例如,只需在x轴上添加标签即可
voffset = 0.35;
setappdata(hfig, 'SubplotDefaultAxesLocation', [0, voffset/4, 1, 1-voffset/2]);
setappdata(hfig, 'SubplotDefaultInset', [0, voffset/2, 0, 0]);
答案 1 :(得分:2)
Aslak Grinsted在Matlab File Exchange: subaxis找到的subaxis
功能为您提供了一个非常方便的解决方案。
答案 2 :(得分:2)
当子图重叠时,隐藏较早的图。
尝试稍微降低“位置”宽度。
他们应该再次出现
另外,可能存在一些“对齐网格”问题, 当您调整窗口大小时,这会如何表现?
答案 3 :(得分:1)
close all
figure,set(gca,'Color','none')
subplot('Position',[0.025 0.51 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,1)), [0 0], 'r','LineWidth',2);
hold off;title('1st curve','FontSize',12);h=xlabel('(a)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*1 0.51 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,2)), [0 0], 'r','LineWidth',2);
hold off;title('2nd curve','FontSize',12);h=xlabel('(b)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*2 0.51 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,3)), [0 0], 'r','LineWidth',2);
hold off;title('3rd curve','FontSize',12);h=xlabel('(c)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*3 0.51 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,4)), [0 0], 'r','LineWidth',2);
hold off;title('4th curve','FontSize',12);h=xlabel('(d)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*4 0.51 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
imshow(I);hold on; axis off;
contour((BW(:,:,5)), [0 0], 'r','LineWidth',2);
hold off;title('5th curve','FontSize',12);h=xlabel('(e)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025 0.03 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
seg = phi0(:,:,1)<=0;imshow(seg);
h=xlabel('(f)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*1 0.03 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
seg = phi0(:,:,2)<=0;imshow(seg);
h=xlabel('(g)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*2 0.03 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
seg = phi0(:,:,3)<=0;imshow(seg);
h=xlabel('(h)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*3 0.03 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
seg = phi0(:,:,4)<=0;imshow(seg);
h=xlabel('(i)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
subplot('Position',[0.025+0.19*4 0.03 0.19 0.48]);get(gca,'position');set(gca, 'XTick', []);set(gca, 'YTick', []);
seg = phi0(:,:,5)<=0;imshow(seg);
h=xlabel('(j)','FontSize',12);
s=get(h,'Position');
s(2)=s(2)-28;
set(h,'Position',s);
谢谢大家,我得到了正确答案。我改变了我的代码。
这是我得到的答案:
答案 4 :(得分:1)
当然可以用一个循环来完成 (为变量使用单元格数组,为绘图函数使用一个单元格数组) 但为了简单起见 我会把它当成两个循环。
labels = {'(a)' , '(n)' , '(etc)' , 'asdf','asddf'}
jay=1
for aye =1:5
subplot('Position',[0.025+0.19*(aye-1) 0.51-0.48*(jay-1) 0.19 0.48]);
...
h=xlabel(labelsabc{aye},'FontSize',12);
....
end