сделать все правые и левые пределы по оси Y одинаковыми, соответственно, для нескольких участков на рисунке - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть сюжет, который выглядит следующим образом:

enter image description here

Это создается следующим образом:

fig = figure;
nPlots = 3;
for p = 1:nPlots
  ax(p) = subplot(1, nPlots, p);
  x  = 0:10*p;
  y1 = max(x)-x.^1.1;
  y2 = p*max(x)-2*x;
  yyaxis left;
  plot(x, y1);
  yyaxis right;
  plot(x, y2);
end

Я хочу, чтобы оси на каждой стороне были одинаковыми, т.е. я хочу, чтобы все графики имели:

ylim_left  = [0 30];
ylim_right = [0 90];

Но если я использую linkaxes(ax), я получу только правую сторону для изменения:

enter image description here

Если я попытаюсь yyaxis left; linkaxes(ax);, тогда он получит самое высокое значение для левых сторон и применяет его к правым сторонам первых двух подзаговоров.

enter image description here

Когда я проверяю ax, я замечаю, что все его компоненты ax (1), ax (2) ... имеют свойство YAxisLocation:, установленное в 'right', которое, как мне кажется, является корнем этой проблемы. Я не уверен, как получить ручку непосредственно к левой и правой боковым осям вспомогательных участков, чтобы напрямую связать их вместе. Любые идеи будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Извлечение NumericRuler дочерних элементов ваших осей Y предоставляет вам доступ к левому и правому пределам:

>> [ax.YAxis]

ans = 

  2×3 NumericRuler array:

    NumericRuler    NumericRuler    NumericRuler
    NumericRuler    NumericRuler    NumericRuler

Где строка 1 - левая сторона, а строка 2 - правая.

Определите вспомогательную функцию для синхронизации:

function matchyyaxes(ax, ylim_L, ylim_R)
yaxes = [ax.YAxis];

set(yaxes(1,:), 'Limits', ylim_L);
set(yaxes(2,:), 'Limits', ylim_R);
end

Который вы можете использовать с вашими пределами выборки:

matchyyaxes(ax, [0 30], [0 90]);

yay


Вы также можете создать свой собственный слушатель свойства , чтобы имитировать функциональность linkaxes

0 голосов
/ 27 апреля 2018

Просто вставьте функции 'ylim' после графиков. Это сработало для меня:

fig = figure;
nPlots = 3;
ylim_left  = [0 30];
ylim_right = [0 90];
for p = 1:nPlots
  ax(p) = subplot(1, nPlots, p);
  x  = 0:10*p;
  y1 = max(x)-x.^1.1;
  y2 = p*max(x)-2*x;
  yyaxis left;
  plot(x, y1);
  ylim(ylim_left);
  yyaxis right;
  plot(x, y2);
  ylim(ylim_right);
end

enter image description here

...