Fast updating of live figures using sliders

46 Ansichten (letzte 30 Tage)
Laurent Lessard
Laurent Lessard am 4 Jun. 2021
Kommentiert: Mario Malic am 6 Jun. 2021
I created a simple live script where sliders are used to select two parameters, and then a step response is plotted, which depends on the two parameters. Here is my simple code
wn = 2; % in live script, this is a slider for picking wn
zeta = 0.2; % in live script, this is a slider for picking zeta
s = tf('s');
step(wn^2/(s^2+2*zeta*wn*s+wn^2),5)
The plot is sluggish to update as I move the sliders, and I want it to be more responsive. I used the "Run on: Value changing" option, but there is still a visible lag. I think the bottleneck is due to the figure being re-drawn every time I change the parameters. Is it possible for the live script to modify an existing figure every time a slider is changed? This might involve having one chunk of code that is only run once per section (e.g. create base figure, axes, labels, initial plot) and then every time the slider is moved, only certain components of the plot are modified, thus speeding up rendering.
If it turns out that "step" is actually the bottleneck here, then I'm open to other suggestions --- e.g. pre-computing all the step responses for all possible parameter values and not doing any live computations. I don't really care how long it takes to pre-compute or pre-compile, I just want the end product to be a truly interactive (and instantly updating) figure.
  3 Kommentare
Laurent Lessard
Laurent Lessard am 5 Jun. 2021
My point is that even if I precompute a grid, simply plotting the data I've already computed in a livescript is too slow. It redraws the figure every time I change the slider. You can change figure properties directly in Matlab e.g. by using something like:
p = plot(x,y)
p.YData = ynew;
this is orders of magnitude faster than redrawing the plot. I want to be able to do this in a live script, but I can't seem to prevent the live script from redrawing everything all the time.
Mario Malic
Mario Malic am 5 Jun. 2021
Oh, now I see this, sorry, I don't know about livescript behaviour of figures.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Mario Malic
Mario Malic am 5 Jun. 2021
Bearbeitet: Mario Malic am 5 Jun. 2021
Hi,
This will return the handle to the curve on the plot. You can use its XData and YData property to update the values quickly.
curve = findall(groot, 'type', 'line', 'Tag', 'Curves')
However, the issue with the Slider is that it can obtain values that are unnecessarry to calculate. While you move your slider, it may obtain a lot of different values between i.e. zeta 1e-7 and 2e-7 which probably won't make a notable difference to the plot. So you should come up with a way how to do it. Maybe you could make wn and zeta vector
zeta = 0:1e-2:5;
wn = 0:1e-2:10;
and when the corresponding slider value is within some tolerance of element, calculate and plot the values .
>> clear
>> tic
wn = 2; % in live script, this is a slider for picking wn
zeta = 0.2; % in live script, this is a slider for picking zeta
s = tf('s');
for ii = 1 : 10
step(wn^2/(s^2+2*zeta*wn*s+wn^2),5);
end
toc
Elapsed time is 2.944663 seconds.
This is interesting
>> tic
wn = 2; % in live script, this is a slider for picking wn
zeta = 0.2; % in live script, this is a slider for picking zeta
s = tf('s');
for ii = 1:10
result = step(wn^2/(s^2+2*zeta*wn*s+wn^2),5);
end
toc
Elapsed time is 0.222970 seconds.
Save the output of step into variable, it makes it a lot faster.
Also, this doesn't account the time into updating the plots which might also be significant.
  8 Kommentare
Laurent Lessard
Laurent Lessard am 6 Jun. 2021
I think you're on to something --- I think your example does what I want. The only issue is that it creates a second copy of the figure when I run the whole script (first cell makes the figure, second cell makes a copy and modifies it dynamically). Can you think of a way to create the first figure "silently" so it doesn't display, and then only reveal it when the second cell is run?
also re: your comment "you didn't save the handle". I thought p = plot(...) would save the handle as p? How then should I save p if not this way?
Thanks!
Mario Malic
Mario Malic am 6 Jun. 2021
The livescript behavior is weird, in the example, two plots are shown, but in fact, there is only a single plot handle. When the properties of the graphic object change, output will be captured, resulting in another plot being shown. I have tried hiding the visibility of the figure, but then no output will be shown when the slider value is changed. I don't know how to do it, or if if it's possible.
In this comment plot handle wasn't saved, so I thought it didn't work because of that.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Specifying Target for Graphics Output finden Sie in Help Center und File Exchange

Produkte


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by