Обновление графика с использованием удержания внутри цикла for - PullRequest
0 голосов
/ 17 мая 2018

Я комбинирую два графика, используя этот код

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, y1 и x2, 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, но все равно дал мне новую цифру.

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете сделать несколько вещей:

  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. Лучшим решением (на мой взгляд) было бы update существующих объектов графика с новыми точками данных по мере их появления:

    [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
    
...