代码之家  ›  专栏  ›  技术社区  ›  EBH

在非等轴上绘制注释箭头

  •  1
  • EBH  · 技术社区  · 7 年前

    以下是我的问题:

    ax = axes('XLim',[0 20],'YLim',[0 10]);
    arrStart = [5 5];
    arrLength = 3;
    arrDir = pi/4:pi/3:2*pi;
    arrEnd = [cos(arrDir)*arrLength+arrStart(1)
              sin(arrDir)*arrLength+arrStart(2)];
    for k = 1:size(arrEnd,2)
        arr = annotation('arrow',...
            'X',[arrStart(1) arrEnd(1,k)],...
            'Y',[arrStart(2) arrEnd(2,k)]);
        arr.Parent = ax;
    end
    

    上面的代码创建了下图:

    arrows

    你可以很容易地看到,没有一个箭头与它的尾巴正确对齐。在对这个问题进行了一些研究之后,我发现其原因在于轴的长度不同(X是Y的两倍)。因此,如果我将两个轴设置为相同的限制,问题就会消失:

    arrows-2

    但在我正在绘制的图中,比这个例子复杂得多,我需要轴有不同的限制。

    有没有办法解决这个问题?

    p、 s:使用“标准化”单位我看不出这个问题,但为箭头设置正确的位置很麻烦。。。

    我使用的是MatLab R2017a。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Javier Orlandi    7 年前

    注释适用于图形、UIPanel或UITAB,而不是轴。将父对象更改为轴可能不在该功能的预期使用范围内。我会使用注释中建议的文件交换选项之一在轴内创建箭头。

    或者,您可以使用 quiver 功能(但可能也不推荐):

    figure;
    ax = axes('XLim',[0 20],'YLim',[0 10]);
    arrStart = [5 5];
    arrLength = 3;
    arrDir = pi/4:pi/3:2*pi;
    arrEnd = [cos(arrDir)*arrLength+arrStart(1)
              sin(arrDir)*arrLength+arrStart(2)];
    hold on;
    for k = 1:size(arrEnd,2)
      quiver(arrStart(1), arrStart(2), arrEnd(1,k)-arrStart(1), arrEnd(2,k)-arrStart(2), 'Color', 'k', 'MaxHeadSize', 0.5, 'Autoscale', 'off');
    end
    

    arrows plotted using quiver