How to align axes in AppDesigner
Show older comments
Hi Folks,
In AppDesigner, is there a simple way to code up a PlotAll(app) function that can easily align vertically the x-axes for vertically stacked axes that have the same "Position" coordinates? For example, below is an example where I have three aligned UIAxes that have the same pixel horizontal positions and thicknesses, but when I plot, the axes labels and the magnitude of the y-axis data values end up causing the plot internal axes to reposition themselves and be mis-aligned.
Thank you,
Kris

4 Comments
Rik
on 7 Dec 2024
Can you post example code so we can reproduce it here? That will make playing around with the properties a lot easier.
Kristoffer Walker
on 7 Dec 2024
Edited: Kristoffer Walker
on 7 Dec 2024
Kristoffer Walker
on 7 Dec 2024
Kristoffer Walker
on 8 Dec 2024
Edited: Kristoffer Walker
on 8 Dec 2024
Accepted Answer
More Answers (1)
Using a <https://www.mathworks.com/help/matlab/ref/tiledlayout.html tiledlayout> would do this for you without any additional position calculus.
You would only need to specify a uipanel as the parent of your tiled layout. See the example below.
Something to consider when using UI axes is that it is essientially a UIPanel and axes together (I think I read that on a mathworks answer one time). Using something like tiledlayout and regular axes is usually better performance (initial creation, and reactivity) and it can do everything a UIAxes can do.
One difference is you do have to programatically asign callbacks, unlike UIAxes that you can do in the app designer.
clearvars
% data
x1=0:.1:1;
y1=x1;
y2=100*y1;
% tiled layout
% p = some parent like a uipanel
% t = tiledlayout(p,'vertical')
t=tiledlayout('vertical');
% first axis
ax=nexttile(t);
plot(ax, x1, y1)
ylabel(ax,'Label1 left')
hold(ax,'on')
yyaxis right
plot(ax,x1,y2)
ylabel(ax,'Label1 right')
ylim(ax,[0 10]) % just to show both lines
% next axis
ax2=nexttile(t);
plot(ax2, x1, y2)
ylabel(ax2,'Label2 left')
hold(ax2,'on')
yyaxis right
plot(ax2,x1,y1)
ylabel(ax2,'Label2 right')
ylim(ax2,[0 10]) % just to show both lines
% insert push button callback to your app to add / delete axes
9 Comments
Kristoffer Walker
on 8 Dec 2024
Strider
on 8 Dec 2024
I have a strong feeling the answer is yes it will work.
I updated the answer with an example but I guess the code does not execute on a phone. I will amend it later if you do not get to it first.
Strider
on 8 Dec 2024
I updated, let me know what you think.
Kristoffer Walker
on 9 Dec 2024
Edited: Kristoffer Walker
on 9 Dec 2024
"Parent container, specified as a Figure, Panel, Tab, or TiledChartLayout object."
I tried to run your example and it was missing x1 or any of the plotting data.
I did not see an error pasted in your comment, but I tried it by replacing app.UIFigure with a regular figure and it worked for me (see below).
I did notice that uifigure does not appear to be supported in MATLAB online. Is that a source of your error?
clearvars
close all
% data
x1=0:.1:1;
y1=x1;
y2=100*y1;
% tiled layout
% f = uifigure; % this does not run on MATLAB online apaprently
f = figure; % use a regular figure instead
p = uipanel("Parent",f );
%t = tiledlayout(app.UIFigure,'vertical');
t = tiledlayout(p,'vertical');
%t=tiledlayout('vertical');
% first axis
ax=nexttile(t);
plot(ax, x1, y1)
ylabel(ax,'Label1 left')
hold(ax,'on')
yyaxis(ax,"right");
plot(ax,x1,y2)
ylabel(ax,'Label1 right')
% next axis
ax2=nexttile(t);
plot(ax2, x1, y2)
Kristoffer Walker
on 11 Dec 2024
Strider
on 11 Dec 2024
I am suspicious that the UI figure associated with the app would work. Can you try putting a panel on the app and then using the panel as the parent?
Voss
on 11 Dec 2024
@Kristoffer Walker: The syntax "tiledlayout(parent)", i.e., not specifying the tiledlayout arrangement or dimensions, was introduced in R2024b (see the item here under R2024b), so that explains why
t = tiledlayout(app.UIFigure);
doesn't work for you under R2022b.
Similarly, specifying "vertical" or "horizontal" as the arrangement was introduced in R2023a, so those are also unavailable.
In R2022b, looks like your options are:
% use 'flow' arrangement
t = tiledlayout(app.UIFigure,'flow');
% or specify the dimensions
t = tiledlayout(app.UIFigure,3,2);
Kristoffer Walker
on 12 Dec 2024
Categories
Find more on Manage Products 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!
