Как исправить неправильное выравнивание заголовка векторной аннотации в Matlab, если y-Direction установлено на 'reverse' - PullRequest
4 голосов
/ 18 апреля 2019

код

figure
scatter([1,2,3],[1,2,3]);
ax = gca;
ax.YDir = 'reverse'
ah = annotation('arrow','position',[ 2.5 2.5 -1 -1]);
set(ah,'parent',ax);

дает неправильное выравнивание векторной головки:

plot with reverse arrow

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

Ответы [ 3 ]

3 голосов
/ 18 апреля 2019

Один из способов решения этой проблемы - создать стрелку и строку с двумя разделенными аннотациями:

figure
scatter([1,2,3],[1,2,3]);
ax = gca;
ax.YDir = 'reverse'

%Define the variable
xac = 2.5; %x arrow coordinate
yac = 2.5; %y arrow coordinate
xas = -1;   %x arrow shift
yas = -1;   %y arrow shift

if get(ax,'Ydir') == 'reverse':
   %Create the arrow
   ah1 = annotation('arrow','position',[ xac yac+2*yas xas -yas],'linestyle','none');
   set(ah1,'parent',ax);
   %Create the line
   ah2 = annotation('arrow','position',[ xac yac xas yas],'headstyle','none');
   set(ah2,'parent',ax);
else:
   ah = annotation('arrow','position',[ xac yac xas yas]);
   set(ah,'parent',ax);
end

Где координаты стрелки теперь xac yac+2*yas xas -yas,

Результат:

enter image description here

1 голос
/ 18 апреля 2019

Согласно документации , объект annotation должен находиться внутри "фигуры, uipanel или объекта uitab". Помещение его внутрь объекта оси не предназначено для использования.

Вместо этого вычислите местоположение вашей стрелки w.r.t. сама фигура. Вы можете сделать это следующим образом:

figure;
scatter([1,2,3],[1,2,3]);
ax = gca;
ax.YDir = 'reverse';

% Original arrow definition
origin = [2.5,2.5];
direction = [-1,-1];

% Convert coordinates from axes to figure
origin = origin - [ax.XLim(1),ax.YLim(1)];
origin = origin ./ [diff(ax.XLim),-diff(ax.YLim)]; % minus for inverse Y axis
origin(2) = origin(2) + 1; % for inverse Y axis
origin = origin .* ax.Position(3:4) + ax.Position(1:2);

direction = direction ./ [diff(ax.XLim),-diff(ax.YLim)]; % minus for inverse Y axis
direction = direction .* ax.Position(3:4);

% Draw arrow in figure
ah = annotation('arrow','position',[origin,direction]);

Вы могли бы сделать простую функцию, которая делает это вычисление. Биты, необходимые для инвертирования оси Y, могут быть условными на ax.YDir == 'reverse'.

1 голос
/ 18 апреля 2019

Вы можете использовать Annotate из Matlab File Exchange:

fig = figure;
scatter([1,2,3],[1,2,3]);
ax = gca;
ax.YDir = 'reverse';
Annotate(ax, 'arrow',[2.5 1.5],[2.5 1.5])

Таким образом, вы не зависите от Mathworks для исправления ошибки, но вам нужно загрузить дополнительные файлы ...

enter image description here

...