How can I draw a line with arrow head between 2 data points in a plot
    966 views (last 30 days)
  
       Show older comments
    
Hi,
If there are 2 points in XY plane [x1, y1] and [x2, y2] then how can I draw a line with an arrowhead starting from [x1, y1] and ending at [x2, y2]. Basically, I want the plot to look like this:
[x1, y1]--------->[x2, y2]
Preferably, I like the arrow-line to bend (arc) towards the second point.
AK
0 Comments
Accepted Answer
  Star Strider
      
      
 on 29 Oct 2014
        
      Edited: MathWorks Support Team
    
 on 17 Mar 2021
  
      p1 = [2 3];                         % First Point
p2 = [9 8];                         % Second Point
dp = p2-p1;                         % Difference
figure
quiver(p1(1),p1(2),dp(1),dp(2),0)
grid
axis([0  10    0  10])
text(p1(1),p1(2), sprintf('(%.0f,%.0f)',p1))
text(p2(1),p2(2), sprintf('(%.0f,%.0f)',p2))
The final zero in the quiver call turns off the automatic scaling.
The arc would be a bit more challenging, depending on what you intend by arc. I would just use the quiver result.
8 Comments
  Star Strider
      
      
 on 22 Oct 2024
				Another option — 
p1 = [2 3];                         % First Point
p2 = [9 8];                         % Second Point
dp = p2-p1;                         % Difference
figure
% quiver(p1(1),p1(2),dp(1),dp(2),0)
scatter([p1(1) p2(1)], [p1(2) p2(2)], 125, 'r', 's', 'filled')
grid
axis([0  10    0  10])
text(p1(1),p1(2), sprintf('  (%.0f,%.0f)',p1), 'Horiz','left')
text(p2(1),p2(2), sprintf('  (%.0f,%.0f)',p2), 'Horiz','left')
xapf = @(x,pos,xl) pos(3)*(x-min(xl))/diff(xl)+pos(1);                % 'x' Annotation Position Function
yapf = @(y,pos,yl) pos(4)*(y-min(yl))/diff(yl)+pos(2);                % 'y' Annotation Position Function
xl = xlim;
yl = ylim;
pos = gca().Position;
annotation('arrow', xapf([p1(1) p2(1)],pos,xl), yapf([p1(2) p2(2)],pos,xl))
The ‘xapf’ and ‘yapf’ anonymous functions make annotation objects easier to work with.  (I devised them a few months ago.)  
Their entire code requires all these assignments: 
xapf = @(x,pos,xl) pos(3)*(x-min(xl))/diff(xl)+pos(1);                % 'x' Annotation Position Function
yapf = @(y,pos,yl) pos(4)*(y-min(yl))/diff(yl)+pos(2);                % 'y' Annotation Position Function
xl = xlim;
yl = ylim;
pos = gca().Position;
They need all those variables.  This example works as documentation for their use.  
.
More Answers (4)
  Sajeer Modavan
      
 on 14 Mar 2019
        
      Edited: Sajeer Modavan
      
 on 14 Mar 2019
  
      t = 1:0.1:10;   wo = 1;
x = 2*exp(t*wo).*sin(t*wo);
plot(t,x),hold on
plot([6 6],[-1e5 1e5],'--k','Linewidth',1.4)
plot([8.7 8.7],[-1e5 1e5],'--k','Linewidth',1.4)
ylim([-0.3e5 1e4])
% One arrow from left to right with text on left side
x = [0.74 0.79];    % adjust length and location of arrow 
y = [0.3 0.3];      % adjust hieght and width of arrow
annotation('textarrow',x,y,'String',' Growth ','FontSize',13,'Linewidth',2)
% Arrow with two head at both end and text between
y = [0.4 0.4];    
Xadj = 1.35;      % adjust location of left arrow starting point (the sum of this with 'x' should not be negative)
annotation('textarrow',x,y,'String',' Growth  ','FontSize',13,'Linewidth',2)
annotation('textarrow',-x+Xadj,y,'String','','FontSize',14,'Linewidth',2)
% One arrow from left to right with text over it
x = [0.56 0.79];   % adjust length and location of arrow 
y = [0.5 0.5];
annotation('textarrow',x,y,'FontSize',13,'Linewidth',2)
annotation('textbox',[.6 .3 .7 .27],'EdgeColor','none','String','Growth','FontSize',13,'Linewidth',2)

1 Comment
  Marius Hammer
 on 26 Apr 2019
				Could you give an describtion of how the arrow coordinates are set exactly? x and y need to be between 0 and 1 within annotation, so if I want the arrow to go from e.g. (x1,y1) = (3,0.5) and (x2,y2) = (6,0.5) how is x and y adjusted for exact location?
  Image Analyst
      
      
 on 29 Oct 2014
        The "Official solution" from the folks at the Mathworks: http://www.mathworks.com/matlabcentral/answers/92988-how-do-i-plot-a-line-that-has-an-arrow-on-the-end-of-it-in-2-d-and-3-d
I use arrow3 from the File Exchange.
0 Comments
  Vitaly Fedoseev
 on 26 May 2021
        
      Edited: Vitaly Fedoseev
 on 22 Oct 2024
  
      The following code (Matlab R2019a) draws an arrow in the plot coordinates from point P1 to point P2 using standard Matlab code. Zoom in/out shifts position of the arrow.
P1=[10, -1];   % from point 
P2=[70, 2];
figure;hold on
plot(P1(1), P1(2), 'o')
plot(P2(1), P2(2), 'o')
%xlim([5 80])
%ylim([-5 5])     % must be set before the conversion below
ax=gca;
Pos=ax.Position;
Xlim=xlim;
Ylim=ylim;
X_conv(1)=Pos(1)+Pos(3)/(Xlim(2)-Xlim(1))*(P1(1)-Xlim(1));
X_conv(2)=Pos(1)+Pos(3)/(Xlim(2)-Xlim(1))*(P2(1)-Xlim(1));
Y_conv(1)=Pos(2)+Pos(4)/(Ylim(2)-Ylim(1))*(P1(2)-Ylim(1));
Y_conv(2)=Pos(2)+Pos(4)/(Ylim(2)-Ylim(1))*(P2(2)-Ylim(1));
annotation('arrow', X_conv, Y_conv)
2 Comments
See Also
Categories
				Find more on Vector Fields in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!










