在相空间肖像matlab中添加箭头

时间:2015-11-22 07:46:46

标签: matlab plot

MATLAB - 如何在相空间中添加跟随轨迹的恒定大小的箭头(附图像)

enter image description here

2 个答案:

答案 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

产生以下内容:

yay

当我有时间时,我打算至少稍微充实帮助函数,它将保留在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])

以下是文档中的一些示例(有轴和无轴):

Arrow examples