如果y-Direction设置为'reverse',如何在Matlab中修复矢量注释头的错误对齐

问题描述 投票:4回答:3

代码

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

任何想法如何解决?

matlab plot matlab-figure
3个回答
3
投票

解决此问题的一种方法是使用两个分隔的注释创建箭头和线:

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
投票

您可以使用Matlab文件交换中的Annotate

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


1
投票

根据the documentationannotation对象应该在“一个人物,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'为条件。

© www.soinside.com 2019 - 2024. All rights reserved.