我想使用平铺布局在图中放置 5 个图,顶部的 2x2 图,然后底部的图跨越两列。应该有两组轴标签:一组用于 2x2 图,另一组用于底部图。我的 MWE 是
x = linspace(-2,2,100);
y1 = sin(x);
y2 = cos(x);
y3 = sin(x).*cos(2*x);
y4 = sin(2*x).*cos(x);
y5 = y3 + y4;
figure('PaperUnits', 'inches', 'PaperSize', [4 6], 'PaperPosition', [0 0 4 6]);
t = tiledlayout(3,2,'TileSpacing','compact','Padding','compact');
nexttile; plot(x,y1); title('y_1');
nexttile; plot(x,y2); title('y_2');
nexttile; plot(x,y3); title('y_3');
nexttile; plot(x,y4); title('y_4');
xlabel(t,'time t_\alpha')
ylabel(t,'amplitude \alpha')
nexttile([1 2]); plot(x,y5); title('y_5');
xlabel('time t_\beta')
ylabel('amplitude \beta')
saveas(gcf,'myfig.jpg')
这给了我下图:
我希望 2x2 绘图的amplitude\alpha
ylabel 和time t_alpha
xlabel 正确对齐(如我的红色注释所示)。有办法做到这一点吗?
我正在使用 MATLAB R2020a。请注意,tiledlayout
函数是在 R2019b 中引入的。
最佳答案
可以通过我在评论中提到的方法(使用“嵌套”tilelayout
)来实现您想要的近似值。使其工作所需的步骤是:
- 创建外部垂直布局。
- 通过询问 2×1
nexttile
保留嵌套tiledlayout
的前两行,隐藏结果轴,并创建uipanel
在它的位置。调用uipanel
是必要的,因为parent
of atiledlayout
不能是另一个tiledlayout
,但它可以是一个Panel
。 - 在适当的面板中绘制所有内容,并相应地应用标签。
x = linspace(-2,2,100);
y1 = sin(x);
y2 = cos(x);
y3 = sin(x).*cos(2*x);
y4 = sin(2*x).*cos(x);
y5 = y3 + y4;
hF = figure('PaperUnits', 'inches', 'PaperSize', [4 6], 'PaperPosition', [0 0 4 6]);
tOut = tiledlayout(hF,3,1);
hAx = nexttile(tOut, [2,1]); hAx.Visible = 'off';
hP = uipanel(hF, 'Position', hAx.OuterPosition, 'BorderWidth', 0);
tIn = tiledlayout(hP,2,2,'TileSpacing','compact','Padding','compact');
nexttile(tIn); plot(x,y1); title('y_1');
nexttile(tIn); plot(x,y2); title('y_2');
nexttile(tIn); plot(x,y3); title('y_3');
nexttile(tIn); plot(x,y4); title('y_4');
xlabel(tIn,'time t_\alpha')
ylabel(tIn,'amplitude \alpha')
hAx = nexttile(tOut); plot(x,y5); title('y_5');
xlabel(hAx, 'time t_\beta')
ylabel(hAx, 'amplitude \beta')
结果:
从这里您可以尝试调整各个 GUI 元素(布局、轴、面板)以获得更接近您想要的结果。
我建议的完全不同的路线是从您的代码开始,并使用 annotation
添加前 4 个图的标签。函数(而不是 xlabel
和 ylabel
)。
关于matlab - 正确对齐平铺布局中子组的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66221891/