如何在Matlab中绘制箭头?

29

我正尝试在Matlab图形中绘制箭头,但没有成功。

代码示例:

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

Matlab中是否有绘制箭头的函数?谢谢。


当我使用“annotation('arrow',x,y)”时,我得到了错误信息...? - user3668129
你是如何使用它的?你输入了什么?无论如何,下面已经有两个答案了... - user2041376
3
对于出版质量的图形,我的解决方案遗憾的是放弃与Matlab作斗争,将其导出为EPS格式,当我需要箭头和精确文本时使用Adobe Illustrator。虽然这很糟糕,但我感到更加愉快,而且生成的图片看起来更好。 - horchler
5个回答

64

你可以使用 quiver 来避免使用 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)

在此输入图片描述

函数quiver的第5个参数非常重要:0表示禁用默认的缩放,因为该函数实际上是用于绘制向量场的。(或者使用属性-值对'AutoScale','off'

您还可以添加其他功能:

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

在这里输入图像描述

如果您不喜欢箭头,需要返回注释,以下答案可能会有帮助:

如何更改quiver图中的箭头样式?


关于评论的一些说明:

箭头大小可以通过'MaxHeadSize'属性进行调整,但不幸的是它并不一致。坐标轴限制需要在之后设置。

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

enter image description here


使用 sed 的解决方案 似乎是最好的,因为它提供了可调整的箭头头部。

我会把它包装成一个函数:

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

您可以按照以下方式从脚本中调用它:

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
给您相当相似的结果:

enter image description here


谢谢,但是如果我想看到图形的限制(1..100),这是可能的吗? - user3668129
像往常一样添加 xlim([1, 100]); ylim([1, 100]) - Robert Seifert
如果您在drawarrow之后写入xlimylim,它将起作用。唯一的问题是,在我的视图中箭头看起来不够大... - bla
@natan,你可以通过'MaxHeadSize'进行调整,参见编辑。 - Robert Seifert
是的,但关键是您需要针对每个坐标和轴限制的选择进行适当大小的调整。如果您有[1 10]的限制和从[3 8]开始的箭头,您将获得巨大的箭头...因此这很有效,但您还需要向解决方案自动添加一些箭头头估计器...类似于arrowsize=0.15*abs(diff(xlim).^2+dif(Ylim).^2) - bla
@natan 是的,我同意,这只是不是最好的解决方案 ;) - Robert Seifert

9
你可以使用文件交换中的arrowarrow(Start, Stop) 绘制一条从 Start 到 Stop 的带箭头的线段(点应为长度为2或3的向量,或具有2或3列的矩阵),并返回箭头的绘图句柄。

编辑:@Lama 也是正确的,你也可以使用 注释, 但你需要考虑绘图限制。

annotation('arrow',x,y)

创建一个箭头注释对象,从由x(1),y(1)定义的点延伸到由x(2),y(2)定义的点,在标准化图形单位中指定。您可以使用文件交换中的数据空间到图形单位转换函数(ds2nfu.m)来使您的生活更轻松。
[xf yf]=ds2nfu(x,y);
annotation(gcf,'arrow', xf,yf)

enter image description here

请注意,有一些未记录的功能可以将注释固定到图表上,如果需要,请在此处阅读更多信息...

7

除了其他解决方案外,这里介绍一种使用注释的方法,您可以在其中设置箭头属性,包括(x、y、width和height) 在当前坐标轴内,以及头部和线条属性。

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

提供

在此输入图片描述


在我看来,这是最好的非文件交换解决方案。我稍微改进了你的想法,使其更加多功能化。 - Robert Seifert

6
您可以使用(文档齐全的)DaVinci Draw工具箱(完整披露:我编写/销售该工具箱,但箭头是免费的)。以下是示例语法和示例输出。
davinci( 'arrow', 'X', [0 10], 'Y', [0 2], <plus-lots-of-options> )

enter image description here


2

你也可以使用例如

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

查看示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接