Have multiple axes nested within a subplot
26 次查看(过去 30 天)
显示 更早的评论
I am trying to have a loop which adds 16 subplots (4,4) to a figure. Alongside each figure I want two seperate axes to be nested within the plots each plot for a total of 16 subplots and 32 sub-subplots.
I basically want each subplot to look like this:
cpDisplay = figure;
x = linspace(0,30);
x1 = sin(x/2);
x2 = cos(x/3);
x3 = sin(2*x/5);
tmpsub = axes;
plot(tmpsub,x1);
ax2 = axes('Position',[tmpsub.Position(1)*5.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/5,tmpsub.Position(4)/4]);
plot(ax2,x2)
ax3 = axes('Position',[tmpsub.Position(1)*1.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/4,tmpsub.Position(4)/4]);
plot(ax3,x3)
If I try and impliment a tiledlayout with this code it does not run an error; however, the sub-subplots aren't visible and after the second iteration the whole figure resembles the top picture:
cpDisplay = figure;
x = linspace(0,30);
x1 = sin(x/2);
x2 = cos(x/3);
x3 = sin(2*x/5);
tiledlayout(4,4);
for qqq=1:16
tmpsub = nexttile;
plot(tmpsub,x1);
ax2 = axes('Position',[tmpsub.Position(1)*5.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/5,tmpsub.Position(4)/4]);
plot(ax2,x2)
ax3 = axes('Position',[tmpsub.Position(1)*1.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/4,tmpsub.Position(4)/4]);
plot(ax3,x3)
2 个评论
David
2022-1-21
编辑:David
2022-1-21
An important concept is that the axes don't nest -- they are all first level children of the containing figure, and need their positions defined in terms of the figure, not other/parent axes.
Maybe initialize a row of tile handles, and then cycle through them:
cpDisplay = figure(1);
clf
x = linspace(0,30);
x1 = sin(x/2);
x2 = cos(x/3);
x3 = sin(2*x/5);
tiledlayout(4,4);
for qqq=1:16;
th(qqq) = nexttile;
end;
for qqq=1:16;
tmpsub = th(qqq);
ax(qqq)=plot(tmpsub,x1);
end;
for qqq=1:16;
tmpsub = th(qqq);
ax2 = axes('Position',[tmpsub.Position(1)*5.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/5,tmpsub.Position(4)/4]);
plot(ax2,x2)
ax3 = axes('Position',[tmpsub.Position(1)*1.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/4,tmpsub.Position(4)/4]);
plot(ax3,x3)
end;
I didn't do the sub-position offset math, so I think the sub-sub-plots all end up stacking on top of each other:
Here's some matrix sub-plot positioning math:
for qqq=1:16;
tmpsub = th(qqq);
% left bottom width height
p=tmpsub.Position;
%ax2 = axes('Position',[tmpsub.Position(1),tmpsub.Position(2),tmpsub.Position(3)/5,tmpsub.Position(4)/4]);
ax2 = axes('Position',p.*[1 1 .2 .25]+[p(3:4).*[.2 .25] 0 0]);
plot(ax2,x2)
ax3 = axes('Position',p.*[1 1 .2 .25]+[p(3:4).*[1-.2 1-.25] 0 0]);
%ax3 = axes('Position',[tmpsub.Position(1)*1.5,tmpsub.Position(2)*6.5,tmpsub.Position(3)/4,tmpsub.Position(4)/4]);
plot(ax3,x3)
end;
and:
回答(1 个)
Avni Agrawal
2024-2-14
Hi Noah,
I understand that you want to plot multiple axes nested within the subplot. The `tiledlayout` function creates a grid of plots with consistent spacing, but when you add nested axes using the `axes` function, you must specify the position manually.
Here is an example code that creates a figure with 16 subplots, and within each subplot, it adds two nested sub-subplots. The positions of the nested axes are calculated relative to the parent subplot. Note that the factors used to adjust the position of the nested axes may need to be fine-tuned based on your figure's size and desired layout.
cpDisplay = figure;
% Create a 4x4 tiled layout
t = tiledlayout(4, 4);
% Data for plotting
x = linspace(0, 30);
x1 = sin(x/2);
x2 = cos(x/3);
x3 = sin(2*x/5);
% Loop through each tile and create subplots
for qqq = 1:16
% Create main subplot
tmpsub = nexttile(t);
plot(tmpsub, x, x1); % Plot x1 in the main subplot
% Calculate positions for the nested subplots relative to the main subplot
% Adjust these values as needed to avoid overlap and to fit within the main subplot
mainPos = get(tmpsub, 'Position');
ax2Pos = [mainPos(1) + mainPos(3) * 0.5, mainPos(2) + mainPos(4) * 0.5, mainPos(3) * 0.4, mainPos(4) * 0.4];
ax3Pos = [mainPos(1) + mainPos(3) * 0.5, mainPos(2), mainPos(3) * 0.4, mainPos(4) * 0.4];
% Create nested subplots and plot data
ax2 = axes(cpDisplay, 'Position', ax2Pos);
plot(ax2, x, x2); % Plot x2 in the first nested subplot
ax3 = axes(cpDisplay, 'Position', ax3Pos);
plot(ax3, x, x3); % Plot x3 in the second nested subplot
% Format the nested subplots if needed (e.g., remove ticks and labels)
set(ax2, 'XTick', [], 'YTick', [], 'Box', 'on');
set(ax3, 'XTick', [], 'YTick', [], 'Box', 'on');
end
% Adjust the layout to prevent overlap of nested axes with main axes
t.TileSpacing = 'compact';
t.Padding = 'compact';
I hope this helps!
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Axes Appearance 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!