答案 0 :(得分:10)
MATLAB有一个内置的annotation
函数,可以用来生成箭头并将它们放在你的图上。但是,MATLAB无助于编写此函数,使xy
输入被标准化为包含轴的图形窗口,而不是映射到轴中的数据点。这意味着我们需要转换它们,这是一个烦人的任务,但不是一个非常具有挑战性的任务。
我创建了一个带有一个箭头的小功能示例来说明该过程。这应与任何xy
轨迹兼容:
function testcode
h.myfig = figure();
h.myaxes = axes('Parent', h.myfig);
x = -10:10;
y = x.^2;
h.myplot = plot(h.myaxes, x, y);
for ii = 1:(length(x) - 1)
[newx, newy] = coordinate2normalized(h.myaxes, [x(ii) x(ii + 1)], [y(ii) y(ii + 1)]);
if exist('temp', 'var')
% No need to create another object if we have one, update existing one instead
set(temp, 'Units', 'Normalized');
temppos = get(temp, 'Position');
set(temp, 'X', newx);
set(temp, 'Y', newy);
else
temp = annotation('arrow', newx, newy);
end
pause(0.05)
end
end
function [xnorm, ynorm] = coordinate2normalized(axishandle, x, y)
set(axishandle, 'Units', 'Normalized');
axisposition = get(axishandle, 'Position'); % Get position in figure window
axislimits = axis(axishandle);
axisdatawidth = axislimits(2) - axislimits(1);
axisdataheight = axislimits(4) - axislimits(3);
% Normalize x position
xnorm = (x - axislimits(1))*(axisposition(3)/axisdatawidth) + axisposition(1);
% Normalize y position
ynorm = (y - axislimits(3))*(axisposition(4)/axisdataheight) + axisposition(2);
end
产生以下内容:
当我有时间时,我打算至少稍微充实帮助函数,它将保留在GitHub上。
答案 1 :(得分:-1)
假设您已经知道通过相空间的轨迹是否正确?换句话说,假设您已经知道要绘制的每个箭头的x-y位置和方向是否正确,您需要的只是绘制箭头的函数?
如果可以使用商业第三方软件,那么(详细记录)DaVinci Draw toolbox(完全披露:我编写/出售工具箱)提供了解决方案。
基本语法是:
davinci( 'arrow', 'X', [0 10], 'Y', [0 0] )
听起来你只想画箭头,没有轴。实现此目的的一种方法是将Head.Length
设置为箭头长度(上例中为10):
davinci( 'arrow', 'X', [0 10], 'Y', [0 0], 'Head.Length', 10 )
工具箱有很多关于如何塑造和设计箭头样式的选项。例如,为了使箭头的宽度和长度彼此更接近,而不是在上面的示例中选择默认值时,您可以添加Head.Width
的规范:
davinci( 'arrow', 'X', [0 10], 'Y', [0 0], 'Head.Length', 10, 'Head.Width', 8 )
您可能希望将轴纵横比设置为1:1,使箭头按预期显示:
daspect([1 1 1])
以下是文档中的一些示例(有轴和无轴):