矢印または二重矢印をプロットできるアノテーションという名前の関数があることを知っています。ただし、注釈は正規化された単位でのみプロットできます。例えば:
annotation('arrows',[x1 x2],[y1 y2])
ここで、[x1、x2]は1未満の比率番号でなければなりません。
だから、私の質問は、正規化された値ではなく真の値で矢印をプロットするにはどうすればよいですか?
他の関数がこれに近づくことができるのか、または真の値を正規化された値に調整できるように図の軸値を取得できる関数があるのだろうかと思います。
正規化された単位に煩わされる必要がないため、この方法を発見しました。ラテックスインタープリターを使用します。
figure
plot([1:5],[1:5]*3,'.-')
%// Say I want to put an arrow pointing to the location, [3 9]
text(2.94,8.3,'\uparrow','fontsize',20)
text(2.8,7.8,'point [3,9]')
矢印を長くするには、より大きなフォントサイズを使用します。
長所
短所
注釈の配置のために、Matlabは関数dsxy2figxy
を提供して、データ空間ポイントを正規化された空間座標に変換します。ただし、何らかの理由で、関数はMatlabディストリビューションに含まれていないため、最初に「作成」する必要があります。
次の行をコマンドウィンドウにコピーして実行し、エディターで関数を開きます。
edit(fullfile(docroot,'techdoc','creating_plots','examples','dsxy2figxy.m'))
関数dsxy2figxy
を使用するには、Matlab検索パスのどこかに保存します。
Matlab-centralで関数dsxy2figxy
の完全な指示を見つけてください: http://www.mathworks.de/help/techdoc/creating_plots/bquk5ia-1.html
annotation
はデフォルトの単位としてnormalized
を使用しますが、これらのオブジェクトを現在の軸(gca
)に関連付け、X
およびY
の設定にデータ単位を使用できますプロパティ。
以下は、単一の矢印をプロットする例です。
plot(1:10);
ha = annotation('arrow'); % store the arrow information in ha
ha.Parent = gca; % associate the arrow the the current axes
ha.X = [5.5 5.5]; % the location in data units
ha.Y = [2 8];
ha.LineWidth = 3; % make the arrow bolder for the picture
ha.HeadWidth = 30;
ha.HeadLength = 30;
FigureやAxesに関連する単位ではなく、「データ空間」に矢印を描くことを探しているこのトピックに出くわした人には、ファイル交換から arrow.m を強くお勧めします。
私の記憶が正しければ、図に対する軸の位置を計算する必要があります。
次のようになります:
%% example plot
clf
plot(Rand(5,2)*5)
%% get info specific to the axes you plan to plot into
set(gcf,'Units','normalized')
set(gca,'Units','normalized')
ax = axis;
ap = get(gca,'Position')
%% annotation from 1,2 to 3,4
xo = [1,3];
yo = [2,4];
xp = (xo-ax(1))/(ax(2)-ax(1))*ap(3)+ap(1);
yp = (yo-ax(3))/(ax(4)-ax(3))*ap(4)+ap(2);
ah=annotation('arrow',xp,yp,'Color','r');
注元の計算の固定オフセット-ap(3)、ap(4)は、角の位置ではなく、gcaの幅と高さです
注釈オブジェクトを作成したら、プロパティnitsを絶対値に設定する必要があります。例:
arrowObj = annotation('arrow', [0.1 0.1], [0.5 0.5]);
set(arrowObj, 'Units', 'centimeters');
set(arrowObj, 'Position', [1 1 3 5]);
(よく文書化されている) DaVinci Drawツールボックス (完全な開示:矢印は無料ですが、ツールボックスを作成/販売)で「矢印」コンポーネントを使用できます。
構文例と出力例は次のとおりです。
davinci( 'arrow', 'X', [0 10], 'Y', [0 2], <plus-lots-of-options> )
1つのアプローチは、軸単位に矢じりを定義することです。
Ax=[0 -0.003 0.003 0]; % (Ax,Ay) form an upward pointing arrowhead.
Ay=[0.01 0.0060 0.0060 0.01];
Ax=Ax-mean(Ax); % center it on zero
Ay=Ay-mean(Ay);
次に、曲線vvの目的の矢印インデックスで、計算します
x1=vv(in,1); y1=vv(in,2);
x2=vv(in+1,1); y2=vv(in+1,2);
u=x2-x1;
v=y2-y1;
th=-pi/2+atan2(v,u);
R=[cos(th) -sin(th); sin(th) cos(th)]; % Rotation matrix for local slope of vv.
A=R*[Ax;Ay]; % Rotate the arrowhead.
patch(x1+A(1,:),y1+A(2,:),'r','LineWidth',0.01) % plot rotated arrowhead at (x1,y1).
plot(x1+A(1,:),y1+A(2,:),'r','LineWidth',0.01) % Kludge to make boundary red too (I'm sure there is a more elegant way).
私の特定の状況のために、私のために働いた。