How to draw an arrow in Matlab?

眉间皱痕 提交于 2019-11-26 17:45:27

问题


I'm trying to draw an arrow in matlab graph, without any success.

Code example:

function [ output_args ] = example( input_args )

figure ('Name', 'example');
x = [10 30]
y = [10 30]
xlim([1, 100])
ylim([1, 100])
arrow (x, y) ???
end

Is there any function in matlab that can draw arrow ? Thanks


回答1:


You can use the (well-documented) DaVinci Draw toolbox (full disclosure: I wrote/sell the toolbox, though arrows are free). Example syntax and example output are below.

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




回答2:


You could abuse quiver, this way you don't have to deal with unhandy normalized figure units by use of annotation

drawArrow = @(x,y) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0 )    

x1 = [10 30];
y1 = [10 30];

drawArrow(x1,y1); hold on

x2 = [25 15];
y2 = [15 25];

drawArrow(x2,y2)

Important is the 5th argument of quiver: 0 which disables an otherwise default scaling, as this function is actually used to plot vector fields. (or use the poperty value pair 'AutoScale','off')

You can also add additional features:

drawArrow = @(x,y,varargin) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0, varargin{:} )       
drawArrow(x1,y1); hold on
drawArrow(x2,y2,'linewidth',3,'color','r')

If you don't like the arrowheads, you need to go back to annotations and this answer is may helpful:

How do I change the arrow head style in quiver plot?


Some remarks regarding the comments:

The arrow head size can be adjust with the 'MaxHeadSize' property, it's not consistent unfortunately. The axes limits need to be set afterwards

x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1,{'MaxHeadSize',0.8,'Color','b','LineWidth',3}); hold on

x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2,{'MaxHeadSize',10,'Color','r','LineWidth',3}); hold on

xlim([1, 100])
ylim([1, 100])


The solution by sed seems to be the best, because it offers adjustable arrow heads.

I'd just would wrap it into a function:

function [ h ] = drawArrow( x,y,xlimits,ylimits,props )

xlim(xlimits)
ylim(ylimits)

h = annotation('arrow');
set(h,'parent', gca, ...
    'position', [x(1),y(1),x(2)-x(1),y(2)-y(1)], ...
    'HeadLength', 10, 'HeadWidth', 10, 'HeadStyle', 'cback1', ...
    props{:} );

end

which you can call from your script as follows:

drawArrow(x1,y1,[1, 100],[1, 100],{'Color','b','LineWidth',3}); hold on
drawArrow(x2,y2,[1, 100],[1, 100],{'Color','r','LineWidth',3}); hold on

giving you quite similar results:




回答3:


You can use arrow from the file exchange. arrow(Start,Stop) draws a line with an arrow from Start to Stop (points should be vectors of length 2 or 3, or matrices with 2 or 3 columns), and returns the graphics handle of the arrow(s).

Edit: @Lama is also right, you can use annotation but you need to take into account the plot limits.

annotation('arrow',x,y)

creates an arrow annotation object that extends from the point defined by x(1),y(1) to the point defined by x(2),y(2), specified in normalized figure units. You can use the Data space to figure units conversion function (ds2nfu.m) from the file exchange to make your life easier.

[xf yf]=ds2nfu(x,y);
annotation(gcf,'arrow', xf,yf)

Note that there are some undocumented features that allow pinning annotations to graphs if that is needed, read more about it here...




回答4:


Amongst other solutions, here is one using annotation where you can set the arrow properties including (x,y,width,height) within the current axes, the head and line properties.

h=annotation('arrow');
set(h,'parent', gca, ...
    'position', [50 5 20 2], ...
    'HeadLength', 1000, 'HeadWidth', 100, 'HeadStyle', 'hypocycloid', ...
    'Color', [0.4 0.1 0.8], 'LineWidth', 3);

gives




回答5:


You can also use for example

text(x,y,'\leftarrow t_1','FontSize',12,'FontWeight','bold')

See illustration



来源:https://stackoverflow.com/questions/25729784/how-to-draw-an-arrow-in-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!