24

我知道有一个名为 annotation 的函数可以绘制箭头或双箭头。但是注释只能以标准化单位绘制。例如:

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

这里,[x1, x2] 应该是小于 1 的比率数。

所以,我的问题是如何绘制具有真实值而不是标准化值的箭头?

我想知道是否有任何其他函数可以接近这个,或者是否有任何函数可以获取图形的轴值,以便我可以将真实值调整为标准化值。

4

8 回答 8

13

For the positioning of annotations, Matlab offers the function dsxy2figxy to convert data space points to normalized space coordinates. However, for whatever reasons, the function is not included in the Matlab distribution and has to be "created" first.

Copy the following line into the command window and execute it to open the function in your editor.

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

To use the function dsxy2figxy save it somewhere in your matlab search path.

Please find the full instructions for the function dsxy2figxy at 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

一种方法是在轴单位中定义一个箭头:

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 回答