軸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
:あなたの最近の編集前に、私が得ましたあなたがイメージの散布図を作成しようとしていたという印象(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')
質問:ここでは、このことは、単一の軸が必要であり、かつリサイズの問題に対処することに悩まされない...
の美しさは、そのためのサンプル実装でありますあまり明確ではありません、あなたはどのように正確に上記の数字を生産していますか?それぞれの小さな画像に 'axes'を追加し、' position'プロパティを設定していますか?また、 'axis image'についての部分は混乱しています、それは小さな軸のそれぞれに適用されているのですか、それとも他の軸を含む大きな軸ですか? – Amro
@amro - :)私は実際に提供されたコードであなたの質問に明示的に答えます。 'image'関数は、ほとんどの人がよく知っているより複雑です。私はあなたに同意します、しかし、この質問はあまり書かれていません。私はそれを完全に書き直すつもりです。 – eykanal
@amro - 私はものを束に変えました。それをもう一度チェックして、それ以上の説明が必要かどうか教えてください。 – eykanal