【问题标题】:Correctly aligning labels for subgroups within a tiledlayout正确对齐 tiledlayout 中子组的标签
【发布时间】:2021-05-19 03:47:32
【问题描述】:

我想使用 tiledlayout 在图中放置 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')

这给了我下图:

我希望 amplitude \alpha ylabel 和 time t_alpha xlabel 正确对齐 2x2 图(如我的红色注释所示)。有没有办法做到这一点?

我正在使用 MATLAB R2020a。请注意,tiledlayout 函数是在 R2019b 中引入的。

【问题讨论】:

  • 也许你可以有一个嵌套的平铺布局,其中外部布局是 3x1,它的前两个位置由 2x2 平铺布局占据,最后一个位置是一个简单的绘图。我自己从未尝试过,但我认为它可以工作。另请提及您使用的 MATLAB 版本。

标签: matlab layout label alignment subplot


【解决方案1】:

我在评论中提到的方法可以实现您想要的近似值(使用“嵌套”tiledlayout)。使其工作所需的步骤是:

  1. 创建外部垂直布局。
  2. 为嵌套的 tiledlayout 保留前两行,方法是询问 2×1 nexttile,隐藏生成的轴,并在其位置创建 uipanel。调用uipanel 是必要的,因为parent of a tiledlayout 不能是另一个tiledlayout,但它可以Panel
  3. 在适当的面板中绘制所有内容,并相应地应用标签。
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 函数(而不是 xlabelylabel)为前 4 个图添加标签。

【讨论】:

  • 感谢详细的解决方案。我注意到,当使用saveas 将图形导出为 jpg 或 pdf 时,2x2 绘图始终具有灰色背景,而底部绘图则没有。为什么会发生这种情况?
  • 这可能是因为面板的背景颜色。请参阅帖子底部的solution(使用JavaFrame 的代码)。您应该在导出图窗之前运行该代码。
猜你喜欢
  • 1970-01-01
  • 2020-11-11
  • 2021-12-13
  • 2016-07-24
  • 2011-11-28
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多