Change GridSize of existing non empty TiledChartLayout object
21 views (last 30 days)
Show older comments
Hello all,
I have a question regarding managing tiles layout.
I would like to change the organization of the layout after the tiles have already been created (for instance, for adding or removing a tile).
I thought I could just modify the GridSize property of the TiledChartLayout object after getting its handle.
However, when I try this approach, I get:
"Unable to set GridSize when TiledChartLayout is not empty"
So, it is unclear to me how to actually manage this situation.
Dummy example:
figure;
tl=tiledlayout(1,1); %first step-just one plot
nexttile(1);
plot([1 2 3],[4 5 6],'-o');
Imagine that now, after creating the figure, I would like to add a second tile, organising tiles in 2 rows and one column.
I was thinking I could simply do:
tl.GridSize=[2 1];
nexttile(2)
plot([1 2 3],-[4 5 6],'-s');
but it is not working. I get an error when trying to change the grid size (tl.GridSize=[2 1])
Unable to set GridSize when TiledChartLayout is not empty
If just try to add a new tile without trying to change the grid size (i.e. using directly nexttile(2)), I get the error:
Error using nexttile
The tile does not fit in the layout.
Any suggestion how to manage this?
Thank you,
Gabriele
0 Comments
Accepted Answer
Adam Danz
on 7 Jun 2021
How to change grid layout of tiledlayout in existing figure?
If the tiledlayout was generated with the flow arrangement then simply call nexttile to add new axes.
If the tiledlayout is fixed and the source code is not available or cannot be changed, then you can copy the tiles to a new figure with your desired layout.
Create base figure with 2x2 layout
fig = figure();
tlo = tiledlayout(fig,2,2);
for i = 1:4
nexttile()
x = linspace(-i*pi,i*pi);
plot(x, sin(x).*rand(size(x)))
title(sprintf('Tile %d',i))
xlabel(sprintf('X%d',i))
ylabel(sprintf('Y%d',i))
end
linkaxes
figure(fig) % show figure
Copy tiles to new figure with 3x2 layout and add 1 tile
originalFig is the figure handle to original figure. Get the handle using gcf or when you open the figure using openfig().
originalFig = gcf();
% Get tile (aka axes) handles
ax = flip(findobj(fig,'type','axes'));
% Create new figure with new tile grid
newfig = figure();
tlo = tiledlayout(newfig, 2,3);
% copy existing axes from original figure to new figure
newax = gobjects(tlo.GridSize);
tempax = gobjects(size(ax));
for i = 1:numel(ax)
tempax(i) = nexttile();
newax(i) = copyobj(ax(i),newfig);
set(newax(i), 'units', tempax(i).Units, 'Position', tempax(i).Position)
tempax(i).Visible = 'off';
end
% add new tile
nexttile()
plot(magic(5),'-')
% This is optional but must come after adding additional tiles.
delete(tempax)
0 Comments
More Answers (2)
Gabriele
on 7 Jun 2021
1 Comment
Adam Danz
on 7 Jun 2021
That approach is fine, too. Just don't accidentally over-write the original figure by saving it (assuming the figure was opened). To reduce the chances of that happening you could close the original figure after the loop or, better yet, use onCleanup to close the figure in the event of an error. You might even want to open the figure in invisible mode using openfig(___,visibility).
Scott MacKenzie
on 6 Jun 2021
Try using flow for the grid size...
tiledlayout('flow');
nexttile;
plot([1 2 3],[4 5 6],'-ob');
pause(2);
nexttile;
plot([2 1 3]',[4 5 6]','-dr');
First plot:
After 2 seconds:
6 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!