【问题标题】:No Gap Next to Axis Label in Matlab?Matlab中轴标签旁边没有间隙?
【发布时间】:2016-03-03 15:33:37
【问题描述】:

Matlab 2015b 或 Matlab 2016a。

我想让网格线穿过图之间的子图间距,以便更好地水平评估两张图片。 但是,我在右下角的两个数字之间有一个小间隙,因为这导致数字不对齐

差距是因为右下角的10^4。 我也想让水平线穿过两个数字之间的间距,但在解决间隙问题之前我不能这样做。

按照关于线程的答案here 中的描述完成相对对齐的代码Matlab 中带有颜色条和子图第三个参数的紧子图?

data=randi(513,513);
D=mat2gray(pdist(data, 'correlation'));

% Set normalized outer position (x,y,width,height)
ax1=axes('OuterPosition', [0 0.5 0.5 0.5]);
plot(D, 'Parent', ax1);
xlim([0 size(D,2)]);
set(cbar1, 'Visible', 'off')
title('Signal');

ax2=axes('OuterPosition', [0.51 0.5 0.5 0.5]);
plot(D, 'Parent', ax2);
set(ax2, 'XLim', [0, size(D,1)])
axis(ax2, 'square');
title('Corr pdist');

Suever 的answer 的输出

我尝试将sprintf('%.2g', x) 中的两(2)个变大变小,但未成功

ax2 = axes('OuterPosition', [0.51 0.5 0.5 0.5]);
plot(D, 'Parent', ax2);
set(ax2, 'XLim', [0, size(D,1)])
axis(ax2, 'square');
title('Corr pdist');
cbar2 = colorbar(); % ax2 not needed here in brackets
set(ax2, 'XLim', [0 size(D,2)]);
set(cbar2, 'Visible', 'off')
grid minor;
% https://stackoverflow.com/a/35776785/54964
xticks = get(ax2, 'xtick');
labels = arrayfun(@(x)sprintf('%.2g', x), xticks, 'uniform', 0);
set(ax2, 'xticklabels', labels);

它给了

这些刻度不是 XMinorTicks 而是简单的刻度(在图片中标记错误)。 它们是 x 轴上某些点的零点。当 x 轴变大时,MATLAB 会自动添加新的 xtick 标记,但没有完整的标签。 我认为那里有另一个符号比零更好。对于不完整的 xticks 标签,你怎么能有其他标记而不是零?


如何将 10^4 与第二个图中的最后一个数字对齐?

【问题讨论】:

  • 你可能做不到。您可以考虑使用自定义轴刻度标签,这样 x10^4 就不会出现。
  • 哪个版本的 Matlab?这听起来很傻,但我认为 Mathworks 在 14a 版中更改了显示引擎。对我来说(15a 版)子图自对齐
  • 不使用axes('OuterPosition'... 可以只使用子图吗?
  • @Matt 去看看他的其他帖子。这就像一个连续的问题...stackoverflow.com/questions/35770961/…

标签: matlab


【解决方案1】:

我会获取当前的 xtick 位置,将其转​​换为字符串,然后设置坐标区的 xticklabels 属性。

xticks = get(ax2, 'xtick');
labels = arrayfun(@(x)sprintf('%.2g', x), xticks, 'uniform', 0);
set(ax2, 'xtick', xticks, 'xticklabels', labels);

如果您希望在图形改变大小时动态计算它们(并且 xticks 被重新计算),您可以将此代码链接到图形的 SizeChangedFcn

func = @(varargin)set(ax2,'xticklabels',arrayfun(@(x)sprintf('%.2g',x),get(ax2, 'xtick'),'uni',0));
set(gcf, 'SizeChangedFcn', func)

【讨论】:

  • @masi 看起来您指定了错误的轴来获取 xticks。您想在代码中从 ax2 获取 xticks!我已经更新了我的答案。
  • @Masi 哦好的。您需要将 xtickmode 设置为手动,这样它就不会尝试重新计算刻度位置。在我的回答中,我已将其更改为手动将 xticks 设置为更改标签之前的状态。
  • 是的,你是对的。 set(gca, 'XTickMode', 'manual'); 有效,但它忽略了 xminorticks。我认为最好的解决方案是动态调整 xMinorTicks set(gca,'XMinorTick', '[somethingDynamic]');
  • @Masi 为什么不直接关闭xminorticks?
  • 我已更新我的答案以提供动态解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多