24

注釈という名前の関数が矢印または二重矢印をプロットできることを知っています。ただし、注釈は正規化された単位でのみプロットできます。例えば:

annotation('arrows',[x1 x2],[y1 y2])

ここで、[x1、x2]は1未満の比率である必要があります。

だから、私の質問は、正規化された値ではなく真の値で矢印をプロットするにはどうすればよいですか?

これに近づくことができる関数は他にあるのでしょうか、それとも、真の値を正規化された値に調整できるように、図の軸の値を取得できる関数があるのでしょうか。

4

8 に答える 8

13

注釈の配置については、Matlabはdsxy2figxyデータ空間ポイントを正規化された空間座標に変換する機能を提供します。ただし、何らかの理由で、関数はMatlabディストリビューションに含まれていないため、最初に「作成」する必要があります。

次の行をコマンドウィンドウにコピーして実行し、エディターで関数を開きます。

edit(fullfile(docroot,'techdoc','creating_plots','examples','dsxy2figxy.m'))

この関数を使用するdsxy2figxyには、MATLAB検索パスのどこかに保存してください。

関数の完全な手順についてはdsxy2figxy、matlab-centralをご覧ください:http://www.mathworks.de/help/techdoc/creating_plots/bquk5ia-1.html

于 2012-07-16T12:07:22.507 に答える
12

annotationをデフォルトの単位として使用しますがnormalized、これらのオブジェクトを現在の軸(gca)に関連付け、データ単位を設定XYプロパティに使用できます。

これは、単一の矢印をプロットする例です。

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;

ここに画像の説明を入力してください

于 2016-03-29T17:07:59.310 に答える
8

図や軸を基準にした単位ではなく、「データスペース」に矢印を描画しようとしているこのトピックに出くわした人には、ファイル交換のarrow.mを強くお勧めします。

于 2012-07-16T13:59:10.157 に答える
5

正規化された単位に煩わされる必要がないので、この方法を発見したばかりです。ラテックスインタープリターを使用します。

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]')

矢印を長くするには、より大きなフォントサイズを使用します。

長所

  • 正規化された単位を使用するよりも簡単、迅速、迅速
  • 機能をインストールする必要はありません(私たち怠惰な人々に適しています..)
  • LaTeXインタープリターを利用すると、さまざまな矢印(上、下、左、右、その他の角度(記号リストを参照))があります。

短所

  • POIに対する鏃頭の正しい位置を取得するには、試行錯誤/微調整が必​​要です。
  • 矢印の長さの制御には制限があります
  • 一部のラテックスコマンドは、インタプリタ(boo)によって理解されません。
于 2013-06-13T00:43:55.333 に答える
2

私が正しく覚えているなら、あなたは図に対する軸の位置を計算する必要があります。

次のようになります。

%% 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の幅と高さであり、コーナーの位置ではありません

于 2012-07-16T10:17:41.363 に答える
1

注釈オブジェクトを作成したら、プロパティUnitsを絶対値に設定する必要があります。例:

arrowObj = annotation('arrow', [0.1 0.1], [0.5 0.5]);
set(arrowObj, 'Units', 'centimeters');
set(arrowObj, 'Position', [1 1 3 5]);
于 2012-07-16T08:36:03.253 に答える
0

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).

私の特定の状況のた​​めに、私のために働いた。

于 2015-01-23T02:39:55.467 に答える
0

(十分に文書化された) DaVinci Drawツールボックスで「矢印」コンポーネントを使用できます(完全な開示:矢印は無料ですが、ツールボックスを作成/販売しました)。

構文例と出力例を以下に示します。

davinci( 'arrow', 'X', [0 10], 'Y', [0 2], <plus-lots-of-options> )

ここに画像の説明を入力してください

于 2015-10-15T04:34:48.320 に答える