App Slow With UIAxes
Show older comments
Hi. I'm creating apps on app designer which use components such as sliders to control a plot. When plotting on a UIAxes, there is significant delay. However, when having the app plot on a separate figure, there is no delay. Does anyone know the reason for this and if there's a way to plot on the UIAxes without the delay? Thanks.
I'm going to use an app modelling a cylinder removing a lot of the additional unnecessary stuff, so the type of problem is as clear as possible. The plot consists of surf, patch, and plot3. For all apps, the goal is not plotting data per say, but rather creating shapes, often in 3 dimensions. Therefore, the data is generally arrays of type double which don't generally get over 100 elements.
I'm using MATLAB R2020a.
These are the two methods:
- I drag and drop a UIAxes on to the app and plot on that axis. This takes about 3 seconds to update the plot each time I move the slider. This is a screenshot of the setup:

- I create a separate regular figure (not uifigure) and plot it on that. This has almost no delay:

This is the code used to create the separate figure and have them aligned neatly (I don't think it's that important but it clarifies what I'm doing):
global ax %needed so it can be accessed through component callbacks
divide=.2;%the fraction of the screen filled by the app
set(0,'units','pixels')
pixels=get(0,'screensize');
app.UIFigure.Position=[0,0,divide*pixels(3),pixels(4)];
fig=figure; %new figure
fig.Position=[divide*pixels(3),0,(1-divide)*pixels(3),pixels(4)];
ax=axes(fig); %axis it will be plotted on
Here is the code which I used (I removed much of the code used in the original app to simplify things) (the code is based off of Clay M. Thompson's cylinder function, and I kept the copyright text in the code):
function torsion(ax,ax2,M,G,L,r,display_in)
% Clay M. Thompson 4-24-91, CBM 8-21-92.
% Copyright 1984-2002 The MathWorks, Inc.
cla(ax)
% engineering equations:
J=1/4*r^4;
phi=M*L/(J*G);
% set up cylinder:
n = 50;
r = [r r]';
r = r(:); % Make sure r is a vector.
m = length(r); if m==1, r = [r;r]; m = 2; end
theta = (0:n)/n*2*pi;
sintheta = sin(theta); sintheta(n+1) = 0;
x = r * cos(theta);
y = r * sintheta;
z = (0:m-1)'/(m-1) *L* ones(1,n+1);
hold(ax,'on')
% plot cylinder
surf(ax,x,y,z,'EdgeColor','none','FaceAlpha',1)
patch(ax,x(1,:),y(1,:),z(1,:),[.25 0 .7])
patch(ax,x(1,:),y(1,:),z(2,:),[.25 0 .7])
%plot helices
z_vals=linspace(0,L,n*L/(2*pi*r(1)));
for i=0:n-1
angle0=i*(2*pi)/n;
anglef=angle0+phi;
theta_part=linspace(angle0,anglef,length(z_vals));
x_part=(r*1.01)*cos(theta_part);
y_part=(r*1.01)*sin(theta_part);
z_vals=linspace(0,L,length(x_part));
plot3(ax,x_part,y_part,z_vals,'k','LineWidth',.5)
end
% plot circles
for i=z_vals
plot3(ax,x,y,i*ones(1,n+1),'k','LineWidth',.5)
end
end
14 Comments
J. Alex Lee
on 5 Aug 2020
is the separate figure created using "figure" or "uifigure"? I've also perceived (no hard data) that the new uifigure system is generally slower...
if using uifigure, are you creating a "uiaxes" inside it, or just an "axes"?
Chris Portal
on 5 Aug 2020
Ephraim, can you share a little more info? Specifically:
- What kind of plot you're creating
- Data sizes / datatypes you're trying to display
- Sample code you're using that might illustrate the problem
- What MATLAB release you're working on
Thanks!
Ephraim Bryski
on 5 Aug 2020
Adam Danz
on 5 Aug 2020
Could you attach the app, any data needed to run the app, and instructions on how to use the app to recreate the problem?
There are some suboptimalities in the code you shared that probably aren't causing the timing issues but could potentially cause other problems at some point.
1) Don't use global variables. The correct way to pass variables from within the app is to define public or private properties. Instructions:
2) Rather than using set(0, ___), set the properties to specific objects.
What's up with the last loop? Nothing changes within the loop so you're just plotting the same thing repeatedly.
Ephraim Bryski
on 6 Aug 2020
I'm really confused here. Your question is about a uiaxis but your app doesn't contain a uiaxis.
Also the figure sizes are so large that I cannot work with them and have to manually resize them before I can do anything else. It would be much better to remove the figure possition commands and to let the user resize the app as needed.
Ephraim Bryski
on 6 Aug 2020
Edited: Ephraim Bryski
on 6 Aug 2020
Adam Danz
on 6 Aug 2020
@Ephraim Bryski & @Chris Portal, I timed the startupFcn which does all of the plotting and some other stuff (much of which is suboptimal) and compared the timing when an embedded uiaxis is used within the app and when the external figure and (regular) axis is created. This was repeated 10 times. Results are below. Note that the app-uiaxes are created prior to the tic-toc time but the external figure and axes are created within the tic-toc time. Nevertheless, the independent axis version is ~7x faster (MATLAB Version: 9.7.0.1296695 (R2019b) Update 4).

I ran the profiler on the startup function using the app's uiaxis which shows the greatest Self Time within UIAxis.set.View.

Ephraim Bryski
on 6 Aug 2020
Adam Danz
on 6 Aug 2020
A simply way to time a section of code is by using tic and toc (check out the documentation).
Example
tic
x = linspace(-pi,pi,180);
y = sin(x);
plot(x,y)
toc
The timing report was produced using profile. Again, see documentation.
profile on
% DO STUFF
profile viewer
Most of the stuff in the timing report I shared, including the line I highlighted, is stuff happening behind the scenes. You can't optimize much of that. However, there's a few suboptimalities in your startupFcn. I've shut down Matlab for the day so I can't view the code now but I did highlight two items in my first comment in this thread. I also recall seeing two axes being created but only one was used.
The production of UIFigure/UIAxes and figure/axes was repeated 11 times and timed using tic/toc including the drawnow command so that the figure renders within the clock time. The timing of iterations 2 to 11 are plotted for comparison (the first iteration is ignored since it may consume more time that subsequent repetitions due to JIT compilation).
Script attached (uifigure_uiaxes_timing.m).
Windows 10; 16GB RAM Intel Core i7 CPU

I repeated the r2021a test several times and the variation in timing for UIFigures & UIAxes was persistent in all repetitions.

J. Alex Lee
on 25 Mar 2021
In Adam's test (for 2020b), it appears the time is really spent by the uifigure call, not the uiaxes call. Here's a variation on the test for all 4 combinations.

And I have felt, at least, that it is not necessarily creation, but interaction with uiaxes that has been slow...so here's a simple plotting comparison, though actually it seems to be the opposite...maybe i have perceived lagging on things like resizing...but too lazy to do this now.

Actually, the creation of figures and axes can be completely separated if the tic/toc only surrounds either the figure creation of the axes creation with a drawnow preceeding the creation.
J. Alex Lee
on 25 Mar 2021
thanks @Adam Danz, I think I actually confused everyone with my above posted...the way I separated was to create the figures once and for all, and then keep deleting and creating axes inside them - so the plot I showed only reflects axes creation time, and the conclusion from that should not be "ime is really spent by the uifigure call", but rather that creating uiaxes and axes alike within an existing uifigure is slower than creating them within an existing regular figure.
And the second time test I did shows that actually, plotting might be faster within uiaxes than in regular axes once they are created, whether it be within a uifigure or a regular figure. but either way, plotting is still much faster on uiaxes or axes created in a normal figure.
Accepted Answer
More Answers (3)
Matlab User
on 21 Mar 2021
Edited: Matlab User
on 21 Mar 2021
I just installed Matlab R2021a and this is still not resolved - the jaw dropping UIAxis lag is still there. Maybe it was a mistake to fork Guide into a new thing...
@Chris Portal It seems no-one can reproduce your solution. Are you sure that you did not simply time FIGURE/AXES twice? Could you please share your code if it works for you.
I'm using some code like below (not full):
ax_id = app.UIAxes;
an = animatedline(ax_id, 'MaximumNumPoints',1000);
...
for i=1:1:100000
addpoints(an, x(i), y(i));
if (rem(i,100) == 0)
if i>=1000
xlim (ax_id, [i-1000+1 i]);
else
xlim (ax_id, [1 i]);
end
drawnow limitrate
end
end
Here are some timings:
- No plotting: 60s
- Standard Figure + axes: 63s
- UIaxes only: 84s
I hope this will be resolved in the future - many many threads with complaints, but nothing has been done.
Veronica Taurino
on 2 May 2022
1 vote
Are there any speed-improvements in Matlab 2021b? If so, I still struggle to find it by myself
martin nguyen
on 5 Dec 2023
Edited: martin nguyen
on 5 Dec 2023
0 votes
Hello everybody,
I have found a way to improve the speed of interactions with a uifigure/uiaxe application. This is not optimal but for me, it does the trick. The solution is to open a figure very small at the start of the application. The figure is in the left bottom corner of my application and I can minimize it (it is working minimized or not).
And all you have to do is to make sure that the figure remains while you are on your application. I did a bit of code to make sure the figure cannot be deleted by clicking on the cross and I make sure it is deleted when I close the application. In my application, I display meshes and the interactions with the pointer are now far better with the figure opened.
I guess, when I open the figure, the uifigure inherit some properties of the figure and that could be the reason, this is faster but I'm not sure.
Regards
Martin Nguyen
2 Comments
Eduardo Vicente Wolf Trentini
on 5 Dec 2023
Let me see if I understand correctly. Does your issue improve if you have another figure open? Here's a video of my application, and you can see that even with another figure open, the response time still remains very slow.
martin nguyen
on 7 Dec 2023
Edited: martin nguyen
on 7 Dec 2023
Hello,
Yes but I create my figure in the startup function of my application, I don't know if you did this or you opened a figure from the Matlab console. Because when my app is running and I open a figure from the Matlab console it doesn't work, it has to be launched within the app. I create and open the figure in the startup function of my app then I minimized it and it works, the response time on my uiaxes in my app are far better.
Categories
Find more on Graphics Performance in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!