Рисование стрелки аннотации в неравных осях - PullRequest
0 голосов
/ 01 января 2019

Вот MCVE моей проблемы:

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

Но на рисунке, который я делаю, это гораздо сложнее, чемВ этом примере мне нужно, чтобы оси имели разные пределы.

Есть идеи, как это решить?

ps: используя «нормализованные» единицы, я не вижу этой проблемы, но задаюправильное расположение стрелок громоздко ...

Я использую MatLab R2017a.

1 Ответ

0 голосов
/ 01 января 2019

Аннотация работает на фигурах, uipanels или uitabs, а не на осях.Смена родителя по осям, вероятно, не соответствует ожидаемому использованию функции.Я бы использовал одну из альтернатив в File Exchange, как предложено в комментариях, для создания стрелок в осях.

В качестве альтернативы, вы можете использовать функцию 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

...