2011-08-18 4 views
8

MATLABに図形を配置するときに、axis equalと入力すると、図形の寸法に関係なく、は常に正方形になります。他の軸を基準に図形の軸を配置する方法は?

enter image description here

現在の問題は、 2番目の軸をこのプロットに追加します。通常、問題ありません。私はちょうどaxes([x1 y1 x2 y2])と打ち込み、新しい正方形の図形は(x1, y1), (x2, y2)の角で追加されます。これはFigureに対する固定位置です。問題は、この新しい軸をの相対的な固定位置に最初の軸に配置したいと思うことです。

だから、私の質問は次のとおりです:

  1. 他の軸に相対的な相対的な位置を指定することで、
  2. 私は1をすることができると仮定して、私は図をサイズ変更しても、この新しい軸を同じ場所に残すことができますか?
+1

質問:ここでは、このことは、単一の軸が必要であり、かつリサイズの問題に対処することに悩まされない...

の美しさは、そのためのサンプル実装でありますあまり明確ではありません、あなたはどのように正確に上記の数字を生産していますか?それぞれの小さな画像に 'axes'を追加し、' position'プロパティを設定していますか?また、 'axis image'についての部分は混乱しています、それは小さな軸のそれぞれに適用されているのですか、それとも他の軸を含む大きな軸ですか? – Amro

+0

@amro - :)私は実際に提供されたコードであなたの質問に明示的に答えます。 'image'関数は、ほとんどの人がよく知っているより複雑です。私はあなたに同意します、しかし、この質問はあまり書かれていません。私はそれを完全に書き直すつもりです。 – eykanal

+0

@amro - 私はものを束に変えました。それをもう一度チェックして、それ以上の説明が必要かどうか教えてください。 – eykanal

答えて

12

position propertyは、その親コン​​テナを基準にしています。したがって、最初の軸と同じサイズの透明なpanelを作成し、内部で2番目の軸を作成し、必要に応じてその位置とサイズを設定することも可能です。指定された位置は、あたかも最初の軸を基準にしているかのようになります。

ここでは、パネルを常に最初の軸と同じサイズ/位置に維持する必要があります。通常は、LINKPROPを使用して複数のグラフィックオブジェクト(パネルと軸)のプロパティを同一にする、つまり'Position'プロパティを使用して行うことができます。

axis imageを呼び出すと、'PlotBoxAspectRatio''DataAspectRatio'のようなアスペクト比のプロパティを設定することで、データユニットがすべての方向で同じになるように修正されます。悲しいことに、'Position'プロパティはサイズの変更を反映しないため、上記の解決策を破るということです。ここでは、問題を説明するための例です:あなたはaxis imageコールを発行した後/前に、positionプロパティを照会すると、それは同じになります。

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

幸いにも私たちのために、FEX(plotboxpos)の提出があることをこの正確な問題を解決し、軸の描画領域の実際の位置を返します。いったんそれができたら、それはパネルの位置を軸の位置に同期させることです。 1つのトリックは、軸がサイズを変更するとき('Position'プロパティとは異なり、'TightInset'プロパティが変更された場合のit appearsというイベントリスナーを作成することです)、このケースではトリガになる可能性があります。

便宜上、私は上記の関数を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しかし、点の代わりに完全な画像を使用しています)。

あなたが示唆したことは、各画像の1つの軸を作成し、ポイントの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のファイルを指摘してくれてありがとう。 Re:2番目のポイントは、実際にあなたが投稿したことです。 1つの軸上に多数の画像をプロットする。しかし、主軸を使わない1つのプロットが必要であり、それは私がこの質問で言及しているプロットです。ありがとう! – eykanal

4

これは通常、図形にカスタム'ResizeFcn'を使用して処理することができます。これは、より小さい軸の位置とサイズを大きくするよう調整します。ここでは、それは常に大きな四角軸の15%のサイズで、右下隅にあるように、subaxesの大きさを維持してサイズ変更機能の例です:

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 

そして、ここではその使用例です:

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 
関連する問題