如何使用Matlab中的位置子图+图像c?

时间:2016-08-03 20:30:10

标签: matlab image-processing matlab-figure subplot

情况:使用imagesc更改单个子图的位置

%% Matlab recommends this structure if axes(); in loop
a1 = subplot(1,2,1); 
a2 = subplot(1,2,2); 
while 1    
    plot(a1, rand(3))    
    plot(a2, rand(3))    
    drawnow 
end

%% Test code
unitsPerInches=[0 0 15 15];
figure('Units', 'inches');
a1 = subplot(1,2,1); 
a2 = subplot(1,2,2); 
while 1    
    set(a1, 'Position', unitsPerInches); % TODO how to affect a1's Position here only? 
    imagesc(a1, rand(3))    
    imagesc(a2, rand(3))    
    drawnow 
end

打开

  1. imagesc对应的plot(a1,rand(3))结构是什么?
  2. 如何在循环中更改Position的{​​{1}}?
  3. 在Q1中前进 - 差不多完成了

    figure

    图。 1文档输出示例,图2图像输出c,图3关于Q2其中位置影响两个子图

    enter image description here enter image description here enter image description here

    Q1差不多完成了;我刚刚忘记了如何在imagesc中获得相应的情节; x值应该放在那里,但伪代码%% Extension to imagesc figure a1=subplot(1,2,1); a2=subplot(1,2,2); for counter=1:2; imagesc(a1,rand(3)) imagesc(a2,rand(3)) drawnow end 是不成功的。

    在第二季度落后

    代码

    imagesc(a1,XDATA,rand(3))

    输出:位置影响图3中的两个图像。

    我认为我误解了这里位置的含义,因为输出很奇怪。

    测试EBH' proposal为Q2

    当两个数字包含子图

    时,隐式赋值会导致问题
    %% Extension to imagesc
    unitsPerInches=[0 0 15 15];
    figure
    a1=subplot(1,2,1);
    a2=subplot(1,2,2);
    for counter=1:2;
        set(a1, 'Position', unitsPerInches); % TODO how to affect a1's Position here only?
        imagesc(a1,rand(3))
        imagesc(a1,rand(3))
        drawnow    
    end
    

    输出:子图的第二个数字失败。

    系统:Linux Ubuntu 16.04 64位
    Linux内核4.6
    Matlab:2016a
    相关主题:Matlab7 'bug' when using "subplot" + "imagesc"?

2 个答案:

答案 0 :(得分:3)

我并不是100%确定你要问的是什么,但我认为它是关于在循环中组合多个imagesc语句的。我会做更直接的事情 - 使用gca并将子图放在循环中。通常,如果您想以编程方式处理多个图像,除了创建许多不同命名的变量之外,将它们置于某种结构中是有意义的。还要注意while 1可能不是你想要的 - 它会锤击你的图形设备驱动程序 - 并且pause可以接受一个参数作为等待函数,在几分之一秒内如果需要。

testImages{1}=double(imread('coins.png')); 
testImages{2}=double(imread('cameraman.tif')); 

h=figure; 
set(h,'color','w'); %This handle refers to the background window 


for ix=1:2 
     subplot(1,2,ix); 
     imagesc(testImages{ix}); 
     axis equal;
     colormap gray; 

     %Change, for example, axis position
     curPoss=get(gca,'Position'); %gca stands for 'get current axis'
     set(gca,'Position',curPoss+1e-2*ix^2); %Move one image up a bit
end

这有帮助吗?

enter image description here

答案 1 :(得分:1)

如果你想在数字之间跳转,做一个数组,并在循环中使用它:

unitsPerInches = [0.1 0.1 0.15 0.15];
figs = [figure(1) figure(2)];

for f = 1:numel(figs)
    figure(figs(f));
    for counter = 1:2;
        subplot(1,2,counter);
        imagesc(rand(3));
        drawnow
    end
    figs(f).Children(1).Position = unitsPerInches;
    figs(f).Children(2).Position = unitsPerInches+0.3;
end

unitsPerInches的原始值错误,因为axes的{​​{3}}属性默认值介于0到1之间。您可以使用'Position'属性更改此设置,例如:

figs(f).Children(1).Units = 'inches';

此示例的输出是两个如下所示的数字:

'Units'

左下方有一个小轴,右上方有一个大轴。

所以,回到原来的问题:

  
      
  1. imagesc对应的plot(a1,rand(3))结构是什么?
  2.   

不是将轴传递给imagesc,而是将焦点设置在相关图上,并将子图设置为:

figure(h)
subplot(x,y,c)
imagesc(data)

其中h是相关数字的句柄,c是要在h内绘制图像的子图的位置(1到{{1之间的数字) }}),在这两行之后你调用x*y

  
      
  1. 如何在循环中更改图中的imagesc
  2.   

在这个问题中,您不清楚是否要更改fig_1figure的“位置”,它们具有不同的单位和含义,但两者都可以通过相同的方式访问:

'Position'

其中h.Position = [left bottom width height]; % for the position of the figure h.Children(c).Position = [left bottom width height]; % for the position of the axes 与之前相同,但h的编号可能不同,因此c可能与subplot(x,y,c)不同。但是,您始终可以使用h.Children(c)来获取当前轴:

gca

希望现在一切都清楚,如果还有其他问题,请告诉我们;)