MATLAB:用一个循环在一个轴上绘图:实线和图例

标签 matlab loops plot

我有两个截然不同的问题,但将它们放在一起是因为我相信解决方案是相关的。我正在测试牛顿法和正割法(每个方法都是用循环实现的)并在同一轴上绘制结果与计算时间的关系以进行比较。我希望(离散的)牛顿法结果用蓝线连接,割线法结果用红线连接。这些线条又由相应的图例注释。这并没有发生,因为图上的每个点似乎都被视为单个对象,因为它们是单独创建的。 legend 命令会显示两个蓝色星号,而不是一个蓝色星号和一个红色星号(我希望我可以在这里发布我的情节,但我还没有图像权限。)

这是我的缩写代码:

f = (x) % define function
figure
hold on

%% Newton
tic
while % terminating condition
    % [Newtons method]

    t = toc;
    plot(t,log(abs(f(z)),'b*-')
end

%% Secant
tic
while % terminating condition
    % [secant method]

    t = toc;
    plot(t,log(abs(f(z)),'r*-')
end

legend('Newton''s','Secant')

现在不需要了,linespec 中的 '-' 不会做任何事情,因为只绘制了一个点,而不是一条线。我知道我可以用 plot([t_old t],[log(abs(f(z_old) log(abs(f(z)]) 之类的东西在每次迭代中绘制线图,但是这并不理想,尤其是因为 log(abs(f(z_old))) 每次都必须重新评估。此外,这也无法解决图例的问题。

我认为,如果我能让 MATLAB 理解我正试图在轴上创建两个对象,一条蓝线和一条红线,那么这两个问题都将得到解决。谢谢。

最佳答案

如果您不想将 x/y 数据存储在向量中然后重新绘制整个向量,您可以使用如下代码将其添加到绘图线:

hNewton = [];
while % terminating condition
    % [Newtons method]
    t = toc;    
    if isempty(hNewton)
        hNewton = plot(t,log(abs(f(z))),'b*-');  % First time through plot and save the line handle
    else
        % On all subsequent passes, just add to the lines X/Y data
        set(hNewton,'XData',[get(hNewton,'XData')  t]);
        set(hNewton,'YData',[get(hNewton,'YData')  log(abs(f(z)))]);
    end
end

由于现在只有 2 行,图例按预期工作。

或者,您可以将代码添加到函数中的现有行

function hLineHandle = AddToLine( hLineHandle, xData, yData, lineStyle )
% AddToLine - Add data to a plotted line
    if isempty(hLineHandle)
        hLineHandle = plot(xData,yData, lineStyle);
    else
        set(hLineHandle,'XData',[get(hLineHandle,'XData')  xData]);
        set(hLineHandle,'YData',[get(hLineHandle,'YData')  yData]);
    end
end

这使得主脚本/函数中的代码更加清晰。

hNewton = [];
while % terminating condition
    % [Newtons method]
    t = toc;    
    hNewton = AddToLine(hNewton,t, log(abs(f(z))),'b*-' );
end

关于MATLAB:用一个循环在一个轴上绘图:实线和图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18952649/

相关文章:

R:如何在同一时间序列上绘制多个 ARIMA 预测

r - 计算 R 中的二维样条曲线

合并集合的算法挑战

java - Matlab - Java 接口(interface)

python - 将用户输入附加到循环中的列表

vba - 继续For循环

plot - 使用 Octave 绘图的问题

python - 更改 netCDF 文件中的 chunk block 形状

matlab - 有关 Simulink MDL 和 SLX 格式的信息?

java - 使用适当的变量值编写代码