축 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
: 여기
는 예를 들어 사용 당신 최근 편집하기 전에 내가 가지고 당신이 이미지의 산점도를 만들기 위해 노력하고 있었다는 인상 (즉, 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')
질문 매우 명확하지 않습니다. 정확히 위의 그림을 어떻게 생산하고 있습니까? 각 작은 이미지에 대해'axes'를 추가하고'position' 속성을 설정하고 있습니까? 또한 '축 이미지'에 관한 부분은 혼란스럽고, 작은 축마다 적용 되는가, 아니면 다른 모든 축을 포함하는 큰 축을위한 것입니까? 당신은 확실히 더 나은 도움을 얻으려면 코드를 게시해야합니다 .. – Amro
@ amro - :) 나는 명시 적으로 제공된 코드를 사용하여 질문에 대답합니다. 'image' 함수는 대부분의 사람들이 잘 알고있는 것보다 더 복잡합니다. 나는이 질문이 잘못 쓰여졌다는 것에 동의한다. 나는 그것을 완전히 다시 쓰려고합니다. – eykanal
@amro - 일들을 바꿔 놓았습니다. 다시 확인하고 추가 설명이 필요하면 알려주세요. – eykanal