【问题标题】:Add arrows in phase space portrait matlab在相空间肖像matlab中添加箭头
【发布时间】:2015-11-22 07:46:46
【问题描述】:

MATLAB - 如何添加具有恒定幅度的箭头,这些箭头遵循相空间中的轨迹(附图)

【问题讨论】:

标签: matlab plot


【解决方案1】:

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 上维护。

【讨论】:

  • 做得很好。完全可选,但只是为了完整起见,您应该在存储库中的原始函数旁边保留一个反向函数(如 normalized2coordinate)。
  • @Hoki 绝对!在我忘记之前抛出一些待办事项和增强功能:)
  • @excaza,看起来不错,我会尝试实现它并告诉你它是怎么回事
  • @excaze,一个小问题,你如何删除箭头线并只保留箭头,或者让箭头线具有不同的颜色
  • @jarhead 参见property documentation。 LineStyle 属性可能是您想要调整的。
【解决方案2】:

假设您已经知道相空间中的轨迹是否正确?换句话说,假设您已经知道要绘制的每个箭头的 x-y 位置和方向,并且您只需要一个绘制箭头的函数是正确的吗?

如果可以使用商业 3rd 方软件,(有据可查的)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])

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

【讨论】:

  • 虽然这确实显示了如何绘制箭头,但它并没有回答问题的困难部分,即相位图的以下部分。
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2016-08-05
  • 2017-02-27
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多