为什么 MATLAB 在生成多个子图时会产生不一致的 Y 轴?

Why does MATLAB produce inconsistent Y-axes when generating multiple subplots?

我最近在尝试生成多个具有对数 y 尺度的子图时偶然发现了一些奇怪的行为。子图是在一个循环中构建的,因此每个子图的生成方式完全相同,尽管它们都有相同的限制和刻度定义,但各个子图之间的 Y 尺度仍然不同,这对我来说没有任何意义。如何确保所有子图中的 Y 尺度和刻度都相等?下面是一个说明问题的示例 (MATLAB R2019a)。

figure;
    for i=1:9
        ax = subplot(3,3,i);
        plot(rand(5));
        yticks([0:0.2:1]);
        ylim([0, 1]);
       set(ax, "YScale", "log");
    end

输出:

您正在将较低的 ylim() 设置为 ,这对于对数轴是未定义的。我认为当与所选轴表示不兼容时,有一些重置限制的内部魔法。可能 MATLAB 内部发现下限不起作用,并在绘图前将其重置为自动。事实证明,您的所有绘图都恰好在所述绘图的最低数据点上有下限,即使用 MATLAB 的默认下限 min(data(:)).

当使用 0.001 或任何其他非零正数时,作为轴限制它确实有效:

figure;
for ii=1:9 % don't use i
    ax = subplot(3,3,ii);
    plot(rand(5));
    yticks(0:0.2:1); % square brackets are superfluous
    ylim([1e-3, 1]); % Lower limit to 0.001, not 0
    % set(ax, "YScale", "log");
    ax.YScale = 'log';  % Object oriented handling of properties is preferred nowadays
end


旁注:

  • 我不建议使用 using i and j as variables,因为它们表示虚数单位并且会导致难以调试的错误。

  • 使用冒号语法创建数组时的方括号,例如在您的 yticks() 中,是 。当通过列出 comma/space 分隔值创建数组时,例如在 ylim([]) 中,它 必须使用方括号。

  • Figure/line/axis 句柄现在是面向对象的风格,可以使用点索引设置,类似于结构。这可以通过省略 setget 参数来简化您的代码。