【问题标题】:Update plot using hold on inside a for loop在 for 循环中使用 hold on 更新绘图
【发布时间】:2018-10-27 12:31:08
【问题描述】:

我正在使用此代码组合两个图

plot(x1,y1,'.','MarkerSize',20,'Color','r');
hold on; grid on;
plot(x2,y2,'x','MarkerSize',10,'Color','b');

xlim([-a a]);
ylim([-a a]);

现在我想更改x1,y1x2,y2 的值,以便在我的图中有多个点和一个十字。我尝试使用 for 循环来计算新值,但每次迭代此代码都会生成另一个图形 - 而我只想要一个包含所有点的图形。

我做了这样的事情:

for i=1:1:8
    % do things that compute x1,x2,y1,y2
    figure; hold on
    plot(x1,y1,'.','MarkerSize',20,'Color','r');
    hold on; grid on;
    plot(x2,y2,'x','MarkerSize',10,'Color','b');
    xlim([-a a]);ylim([-a a]);
    i=i+1;
end

我也尝试将hold on 放在i=i+1 之前,但仍然给我一个新数字。

【问题讨论】:

    标签: matlab for-loop plot window matlab-figure


    【解决方案1】:

    你可以做几件事:

    1. 简单的解决方案是将figure 命令放在循环之外:

      figure(); hold on;
      for ...
        plot(x1, ...);
        plot(x2, ...);
      end
      
    2. 更好的解决方案是首先计算所有值,然后绘制它们:

      [x1,y1,x2,y2] = deal(NaN(8,1));
      for ind1 = 1:8
        % do some computations
        x1(ind1) = ...
        ...
        y2(ind1) = ...
      end
      figure(); plot(x1,y1,'.',x2,y2,'x');
      
    3. 最好的解决方案(在我看来)是用新的数据点更新现有的绘图对象:

      [x1,y1,x2,y2] = deal(NaN(8,1));
      figure(); hP = plot(x1,y1,'.',x2,y2,'x');
      for ind1 = 1:8
        % do some computations
        hP(1).XData(ind1) = <newly-computed x1>
        hP(1).YData(ind1) = <newly-computed y1>
        hP(2).XData(ind1) = <newly-computed x2>
        hP(2).YData(ind1) = <newly-computed y2>
      end
      

    【讨论】:

    • 每次迭代是否可以改变点和十字的颜色?为了在第一次迭代中使用相同颜色的点和十字,下一次使用另一种颜色,依此类推...
    • @Shika93 是的,有可能。但是,changing your question or adding new requirements after it has been answered is frowned-upon on SO。具体来说,让这个工作会使我的第二和第三个建议无效。如果有助于提供上下文,请随意提出新问题并添加指向此问答的链接。如果您决定提出一个新问题,请说明您希望颜色如何随着每次迭代而改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多