Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to make MATLAB's figure stop 'blinking'

So I have a simple loop in MATLAB that does the following:

for p = 1:100

  x = 4.*randn(1,100);
  y = 7.*randn(1,100);

  figure(1) 
  plot(randn(1,100));

  figure(2);
  plot(randn(1,100));

end

The x and y are made up, but that is the jist of it. Anyway, when I run this code, not surprisingly, MATLAB will make two figures and plot accordingly. The problem is, I get a sort of 'blinking' between figures when I do this, and it makes the quality of seeing x and y evolve over time poorer.

I discovered a way to make one of the plots smoother like this:

figure(1);
for p = 1:100

  x = 4.*randn(1,100);
  y = 7.*randn(1,100);

  plot(randn(1,100));
  drawnow

 end

If I do this, then of course figure(1) will plot very smoothly showing x nicely, without figure(1) 'blinking' between plots, but now I cant show figure(2) or y!

How can I plot both those quantities on different figures (not subplots) smoothly without 'blinking'?

EDIT:

Thanks Geodesic for your answer, the solution works, however there is a subtlety that I did not think would be an issue, however it is.

1) I am unable to use 'imagesc' with this solution.

For example,

figure(1);
aone = axes;
figure(2);
atwo = axes;

for p = 1:100

  x = 4.*randn(1,100);
  y = 7.*rand(10,100);


  plot(aone,x);
  drawnow;
  imagesc(atwo,y);
  drawnow;
end

In this case the part with imagesc(atwo, y) crashes.

like image 706
Spacey Avatar asked Sep 14 '25 22:09

Spacey


2 Answers

Your flicker is because you're generating each figure window again and again through the loop, which is forcing the window to come to the foreground each time. Generate the figures first, attach some axes to them, and plot your data to each axis like so:

figure(1);
aone = axes;
figure(2);
atwo = axes;
for p = 1:100

  x = 4.*randn(1,100);
  y = 7.*randn(1,100);


  plot(aone,randn(1,100));
  drawnow;
  imagesc(y,'Parent',atwo);
  drawnow;
end

Edit: functions like plot take an axis argument directly, but imagesc does not. In this particular case you'll need to send a Property Name/Value pair in as an argument. The 'Parent' of the image generated will be our axis atwo (see above).

like image 52
Geodesic Avatar answered Sep 16 '25 13:09

Geodesic


For p = 1, create the plots you need, using the plot command or the imagesc command. Keep the handle of the resulting graphics object by getting an output argument: for example h = plot(.... or h = imagesc(..... This will be a Handle Graphics lineseries or image object, or something else, depending on the particular plot type you create.

For p = 2:100, don't use the plotting commands directly, but instead update the relevant Data properties of the original Handle Graphics object h. For example, for a lineseries object resulting from a plot command, set its XData and YData properties to the new data. For an image object resulting from an imagesc command, set its CData property to the new image.

If necessary, call drawnow after updating to force a flush of the graphics queue.

like image 42
Sam Roberts Avatar answered Sep 16 '25 11:09

Sam Roberts