2011-08-18 4 views
8

하는 axis equal를 입력 MATLAB에 그림을 배치 할 때하는 것은 상관없이 어떤 그림 차원의 항상 정사각형 것을 보장 :그림에서 축을 다른 축을 기준으로 배치하는 방법은 무엇입니까?

enter image description here

내 현재의 문제는 내가 추가 할 것입니다 이 플롯의 두 번째 축. 대개 문제는 없습니다. 그저 axes([x1 y1 x2 y2])을 입력하면의 고정 위치 인 새 정사각형이 추가됩니다 ((x1, y1), (x2, y2)). 문제는이 새 축을 고정 축 위치 에 첫 번째 축인에 배치하려고합니다.

그래서, 내 질문은 :

  1. 사람이 내가 다른 축으로 한 위치를 지정하여 그림의 축 위치를 수있는 방법을 알고 있나요?
  2. 내가 1을 할 수 있다고 가정하면 그림의 크기를 조정하더라도이 새 축을 어떻게 같은 위치에 둘 수 있습니까?
+1

질문 매우 명확하지 않습니다. 정확히 위의 그림을 어떻게 생산하고 있습니까? 각 작은 이미지에 대해'axes'를 추가하고'position' 속성을 설정하고 있습니까? 또한 '축 이미지'에 관한 부분은 혼란스럽고, 작은 축마다 적용 되는가, 아니면 다른 모든 축을 포함하는 큰 축을위한 것입니까? 당신은 확실히 더 나은 도움을 얻으려면 코드를 게시해야합니다 .. – Amro

+0

@ amro - :) 나는 명시 적으로 제공된 코드를 사용하여 질문에 대답합니다. 'image' 함수는 대부분의 사람들이 잘 알고있는 것보다 더 복잡합니다. 나는이 질문이 잘못 쓰여졌다는 것에 동의한다. 나는 그것을 완전히 다시 쓰려고합니다. – eykanal

+0

@amro - 일들을 바꿔 놓았습니다. 다시 확인하고 추가 설명이 필요하면 알려주세요. – eykanal

답변

12

position property은 해당 상위 컨테이너를 기준으로합니다. 따라서 첫 번째 축과 동일한 크기의 투명 panel을 만든 다음 내부에서 두 번째 축을 만들고 필요에 따라 위치와 크기를 설정하는 것이 좋습니다. 지정된 위치는 마치 첫 번째 축과 관련된 것입니다.

이제 패널을 항상 첫 번째 축과 동일한 크기/위치로 유지해야합니다. 일반적으로 LINKPROP을 사용하면 복수 그래픽 객체 (패널 및 축)의 속성을 동일한 것으로 연결하는 'Position' 속성을 사용할 수 있습니다.

을 호출 할 때 'PlotBoxAspectRatio''DataAspectRatio'과 같은 종횡비 속성을 설정하여 데이터 단위를 모든 방향으로 동일하게 고정합니다. 슬픈 소식은 'Position' 속성이 크기 변경을 반영하지 않으므로 위의 해결 방법을 위반한다는 것입니다. 여기에 문제를 설명하는 예입니다 : 당신이 axis image 호출을 실행 한 후/전 위치 속성을 쿼리하는 경우, 그것은 동일합니다 : 우리를 위해 다행히도

figure, plot(1:10,1:10) 
get(gca,'Position') 
pause(1) 
axis image 
get(gca,'Position') 

, FEX에 제출 (plotboxpos는)이 그 이 정확한 문제를 해결하고 축의 플롯 영역의 실제 위치를 반환합니다. 일단 패널 위치를 축 위치와 동기화해야합니다. 하나의 트릭은 축이 크기가 변할 때 이벤트 리스너를 만드는 것입니다 (it appears'TightInset' 속성이 'Position' 속성과 달리 변경되어 우리의 경우 트리거가 될 수 있음).

위의 코드는 편의상 편의를 위해 AXESRELATIVE에 포장했습니다. 사용자는 내장형 AXES처럼 함수를 호출합니다. 유일한 차이점은 새로 생성 된 축을 상대적으로 상대적으로 배치하려는 축에 대한 핸들을 첫 번째 인수로 제공한다는 것입니다. 새 축과 포함 된 패널 모두에 핸들을 반환합니다.

%# automatic resize only works for normalized units 
figure 
hParentAx = axes('Units','normalized'); 
axis(hParentAx, 'image') 

%# create a new axis positioned at normalized units with w.r.t the previous axis 
%# the axis should maintain its relative position on resizing the figure 
[hAx hPan] = axesRelative(hParentAx, ... 
    'Units','normalized', 'Position',[0.7 0.1 0.1 0.1]); 
set(hAx, 'Color','r') 

그리고 기능 구현 : 완전히 다른 노트에

function [hAx hPan] = axesRelative(hParentAx, varargin) 
    %# create panel exactly on top of parent axis 
    s = warning('off', 'MATLAB:hg:ColorSpec_None'); 
    hPan = uipanel('Parent',get(hParentAx, 'Parent'), ... 
     'BorderType','none', 'BackgroundColor','none', ... 
     'Units',get(hParentAx,'Units'), 'Position',plotboxpos(hParentAx)); 
    warning(s) 

    %# sync panel to always match parent axis position 
    addlistener(handle(hParentAx), ... 
     {'TightInset' 'Position' 'PlotBoxAspectRatio' 'DataAspectRatio'}, ... 
     'PostSet',@(src,ev) set(hPan, 'Position',plotboxpos(hParentAx))); 

    %# create new axis under the newly created panel 
    hAx = axes('Parent',hPan, varargin{:}); 
end 

axesRelative


: 여기

는 예를 들어 사용 당신 최근 편집하기 전에 내가 가지고 당신이 이미지의 산점도를 만들기 위해 노력하고 있었다는 인상 (즉, usu 알 산란 음모가 있지만 점 대신에 전체 이미지가 표시됨).

내가 알기에 당신이 제안한 것은 각 이미지에 대해 하나의 축을 만들고 점의 x/y 좌표에 해당하는 위치를 설정하는 것입니다.

내 솔루션은 IMAGE/IMAGESC 함수를 사용하고 'XData''YData' 속성을 명시 적으로 이동하고 크기를 조정하여 작은 이미지를 그립니다. 이것의 장점은 하나의 축이 필요하고, 크기 조정 문제를 처리 할 필요가 고통을하지 않습니다 .. 여기

가에 대한 샘플 구현 :

%# create fan-shaped coordinates 
[R,PHI] = meshgrid(linspace(1,2,5), linspace(0,pi/2,10)); 
X = R.*cos(PHI); Y = R.*sin(PHI); 
X = X(:); Y = Y(:); 
num = numel(X); 

%# images at each point (they don't have to be the same) 
img = imread('coins.png'); 
img = repmat({img}, [num 1]); 

%# plot scatter of images 
SCALE = 0.2;    %# image size along the biggest dimension 
figure 
for i=1:num 
    %# compute XData/YData vectors of each image 
    [h w] = size(img{i}); 
    if h>w 
     scaleY = SCALE; 
     scaleX = SCALE * w/h; 
    else 
     scaleX = SCALE; 
     scaleY = SCALE * h/w; 
    end 
    xx = linspace(-scaleX/2, scaleX/2, h) + X(i); 
    yy = linspace(-scaleY/2, scaleY/2, w) + Y(i); 

    %# note: we are using the low-level syntax of the function 
    image('XData',xx, 'YData',yy, 'CData',img{i}, 'CDataMapping','scaled') 
end 
axis image, axis ij 
colormap gray, colorbar 
set(gca, 'CLimMode','auto') 

image_scatter

+0

FEx에서 파일을 지적 해 주셔서 감사합니다. 다시 : 두 번째 요점, 우리는 실제로 당신이 올린 것을하고 있습니다; 하나의 축 상에 다수의 이미지를 플로팅한다. 그러나 주축을 사용하지 않는 하나의 플롯이 필요하며 이것이이 질문에서 언급 한 것입니다. 감사! – eykanal

4

이 일반적으로는 큰 관련하여 작은 축의 위치와 크기를 조정합니다 당신의 그림에 대한 사용자 정의 'ResizeFcn'으로 돌볼 수있는 물건의 일종이다.

function resizeFcn(src,event,hAxes,hSubAxes) 

    figurePosition = get(get(hAxes,'Parent'),'Position'); 
    axesPosition = get(hAxes,'Position').*figurePosition([3 4 3 4]); 
    width = axesPosition(3); 
    height = axesPosition(4); 
    minExtent = min(width,height); 
    newPosition = [axesPosition(1)+(width-minExtent)/2+0.8*minExtent ... 
       axesPosition(2)+(height-minExtent)/2+0.05*minExtent ... 
       0.15*minExtent ... 
       0.15*minExtent]; 
    set(hSubAxes,'Units','pixels','Position',newPosition); 

end 

을 그리고 여기에 그 사용의 예 : 항상 15 % 더 큰 사각형 축의 크기와 오른쪽 아래 모서리에있는 있도록 여기 subaxes의 크기를 유지하는 크기 조정 기능의 예 :

hFigure = figure('Units','pixels'); %# Use pixel units for figure 
hAxes = axes('Units','normalized'); %# Normalized axes units so it auto-resizes 
axis(hAxes,'image');     %# Make the axes square 
hSubAxes = axes('Units','pixels'); %# Use pixel units for subaxes 
set(hFigure,'ResizeFcn',{@resizeFcn,hAxes,hSubAxes}); %# Set resize function 
관련 문제