如何在Matlab中绘制好看的箭头?

时间:2013-08-13 16:53:11

标签: matlab graph drawing matlab-figure figures

我一直试图在Matlab中绘制箭头但是它们看起来都很糟糕。 另外,我希望我的箭头是一个实心三角形,而不是V。

我尝试使用Matlab文件交换中提供的软件包:箭头,箭头,箭头3,可能至少还有一个。

我甚至尝试在Matlab图形编辑器中手动创建一个箭头,但是当我调整线宽时,箭头看起来像这样:

enter image description here

我使用 注释 命令创建上面的箭头:

annotation(gcf,'arrow',[0.621875 0.457916666666667],...
                       [0.205421152030217 0.40755429650614],...
                       'HeadLength',4,'LineWidth',5);

以下是尝试使用此处提供的 箭头 包的结果:Arrow.m(注意底部箭头不垂直于线:

enter image description here

我甚至尝试过以下操作,下面是结果(注意可怕的箭头):

 figure
 plot(1:10, 1:10)
 annotation(gcf,'arrow',[0.621875 0.457916666666667],...
                        [0.205421152030217 0.40755429650614],...
                        'HeadLength',4,'LineWidth',5);

enter image description here

7 个答案:

答案 0 :(得分:4)

矢量图形很难。虽然Matlab的排版也同样糟糕,但这里是一个简单的基于文本的解决方案(我不再在Matlab中做这种注释):

figure
plot(1:10, 1:10)
text(5,4,'\rightarrow','FontSize',54,'Rotation',135,...
         'HorizontalAlignment','center');

产生这样的数字

enter image description here

请注意,我使用了'\leftarrow',因为它指向零度方向,这使得我的脑中数学变得更容易。这不是固定解决方案,您仍然需要摆弄位置以克服Matlab将其作为文本对齐的事实(请参阅'Extent''Margin'属性)。毫不奇怪,你可能会看到小故障。 LaTeX解释器可用于获取不同的样式箭头:

    text(5,4,'$\rightarrow$','FontSize',54,'Rotation',135,...
             'HorizontalAlignment','center','Interpreter','latex');

我没有使用此选项获得小故障,但箭头看起来不同(可能有其他可替代的LaTeX箭头样式)。更改字体也可能有效,并且肯定可以使用其他基于文本的箭头。有关添加箭头的更多详细信息,请参阅this article from The MathWorks

答案 1 :(得分:3)

另一个解决方案是使用开源Waterloo graphics - 一个通过提供可以轻松集成到Matlab中的纯Java二维图形函数库来解决这个问题的库。查看一些示例here ...

例如,尝试此代码(正确安装滑铁卢后)

f = GXFigure();
x = -5:0.1:5;
gr1 = gxgca();
a1 = line(gr1, x, cos(x), 'LineSpec','-ob');
b1 = line(gr1, x, sin(x), 'LineSpec','-sg');
annotation(gr1,'arrow',[0.1 0.1],[0.4 0.4],'HeadLength',0.2,'HeadWidth', 0.5, 'LineWidth',2);
gr1.getObject().getView().autoScale();

enter image description here

答案 2 :(得分:2)

与Matlab合作超过10年,并且看到图表的质量几乎没有进展(抗锯齿输出到位图,看起来很好看的eps文件......),我决定我的长期解决方案将会是here。一些体面的箭头here的例子,更漂亮的图here。不幸的是,一些工具箱阻止我完全转向numpy / scipy / matplotlib。我知道这更像是一个咆哮而不是答案,但那是我的解决方案......

答案 3 :(得分:1)

使用quiver或quiver3进行三维绘图肯定会比使用注释创建的最后一个箭头更好。我不确定它看起来会比你使用Arrow.m软件包做得好多少。如果你愿意,也可以改变箭袋上的stlyes。

答案 4 :(得分:1)

我在那里安装InkScape并绘制箭头。没有什么比简单和质量更好了。

InkScape Website

答案 5 :(得分:0)

当基于行的箭头失败时,您可以随时尝试patch-based个:

xArrow = [0 1 1 1.2 1 1 0];               % X-coords of arrow edge points
yArrow = [-0.1 -0.1 -0.2 0 0.2 0.1 0.1];  % Y-coords of arrow edge points
hArrow = fill(xArrow,yArrow, [1 0 0]);    % Plot a red arrow
axis equal                                % Set axis tick marks to be equal

enter image description here

虽然功能更多,但您可以将上述内容参数化为一个函数,该函数需要许多参数来调整箭头的缩放比例,宽高比,旋转和位置。您甚至可以调整颜色,边线颜色和Alpha透明度。

这种想法似乎已由François Beauducel在其文件交换提交ARROWS: generalized 2-D arrows plot中实施。

答案 6 :(得分:0)

现在有date(完全披露:我编写/出售工具箱),它使用低级别的Matlab命令,如plot()patch()来绘制中级形状,如箭头。语法示例:

davinci( 'arrow', 'X',           [0 10],      ...
                  'Y',           [0 2],       ...
                  'Shaft.Width', 1,           ...
                  'Head.Length', 2.5,         ...
                  'Color',       'w',         ...
                  'EdgeColor',   'k',         ...
                  'LineWidth',   2.5 )

来自文档:

DaVinci Draw toolbox