代码
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);
给出错误的矢量头对齐:
任何想法如何解决?
解决此问题的一种方法是使用两个分隔的注释创建箭头和线:
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
,
结果:
您可以使用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来修复错误,但是您需要下载其他文件......
根据the documentation,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'
为条件。