Почему MATLAB создает несовместимые оси Y при генерации нескольких подзаголовков? - PullRequest
0 голосов
/ 05 мая 2020

Недавно я наткнулся на странное поведение при попытке создать несколько подзаголовков с логарифмической шкалой c y. Подзаголовки построены в al oop, так что каждый подзаголовок генерируется точно таким же образом, тем не менее, шкала 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

Вывод:

Inconsistent y-scale

1 Ответ

4 голосов
/ 05 мая 2020

Вы устанавливаете нижний ylim() на ноль , что не определено для логарифмической оси c. Я предполагаю, что есть некоторые внутренние маги c сброса пределов, когда они несовместимы с выбранным представлением оси. Вероятно, MATLAB внутренне выясняет, что нижний предел не работает, и автоматически сбрасывает его на c перед построением графика. Об этом свидетельствует тот факт, что все ваши графики имеют нижний предел точно для самой низкой точки данных на указанном графике, то есть с использованием нижнего предела 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

enter image description here


Боковые примечания:

  • Я бы не рекомендовал использовать i и j в качестве переменных , поскольку они обозначают мнимую единицу и могут привести к трудным для отладки ошибкам.

  • Квадратные скобки при создании массива с использованием синтаксиса двоеточия, например, в вашем yticks(), не нужны . При создании массива путем перечисления значений, разделенных запятыми / пробелами, например, в ylim([]), необходимо использовать квадратные скобки.

  • Рисунок / линия / ось ручки в настоящее время объектно-ориентированы по стилю и могут быть установлены с помощью точечной индексации, как и структуры. Это может упростить ваш код, опуская аргументы set и get.

...