我知道有一个名为 annotation 的函数可以绘制箭头或双箭头。但是注释只能以标准化单位绘制。例如:
annotation('arrows',[x1 x2],[y1 y2])
这里,[x1, x2] 应该是小于 1 的比率数。
所以,我的问题是如何绘制具有真实值而不是标准化值的箭头?
我想知道是否有任何其他函数可以接近这个,或者是否有任何函数可以获取图形的轴值,以便我可以将真实值调整为标准化值。
我知道有一个名为 annotation 的函数可以绘制箭头或双箭头。但是注释只能以标准化单位绘制。例如:
annotation('arrows',[x1 x2],[y1 y2])
这里,[x1, x2] 应该是小于 1 的比率数。
所以,我的问题是如何绘制具有真实值而不是标准化值的箭头?
我想知道是否有任何其他函数可以接近这个,或者是否有任何函数可以获取图形的轴值,以便我可以将真实值调整为标准化值。
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
即使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;
对于遇到此主题并希望在“数据空间”而不是相对于图形和/或轴的单位中绘制箭头的任何人,我强烈推荐来自文件交换的arrow.m 。
我刚刚发现了这种方法,因为我不想打扰标准化单位。使用乳胶解释器:
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]')
要使箭头更长,请使用更大的字体。
优点
缺点
如果我没记错的话,您需要计算轴相对于图形的位置。
它应该像:
%% 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 的宽度和高度,而不是角位置
创建注释对象后,您应该将属性Units设置为绝对值。例子:
arrowObj = annotation('arrow', [0.1 0.1], [0.5 0.5]);
set(arrowObj, 'Units', 'centimeters');
set(arrowObj, 'Position', [1 1 3 5]);
一种方法是在轴单位中定义一个箭头:
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).
为我工作,适合我的特殊情况。
您可以在(有据可查的)DaVinci Draw 工具箱中使用“箭头”组件(完全披露:我编写/出售工具箱,尽管箭头是免费的)。
示例语法和示例输出如下。
davinci( 'arrow', 'X', [0 10], 'Y', [0 2], <plus-lots-of-options> )