Поведение свойств оси с помощью yyaxis - PullRequest
2 голосов
/ 16 января 2020

Создайте фигуру с двумя осями Y, используя yyaxis:

figure
yyaxis left
hl = plot([0 10],[0 10],'-');
yyaxis right
hr = plot([0 10],[10 0],'--');

Было найдено следующее любопытное поведение. Это было проверено в R2017b и в R2019a на Windows 10.

Объекты hl и hr, кажется, принадлежат к той же оси (то есть yyaxis не создает новую ось):

>> get(hr, 'parent')==get(hl, 'parent')
ans =
  logical
   1

Однако свойство 'children' оси отражает только один объект :

>> get(get(get(hl, 'parent'), 'children'), 'LineStyle')
ans =
    '--'
>> get(get(get(hr, 'parent'), 'children'), 'LineStyle')
ans =
    '--'

Кроме того, YAxisLocation' свойство родительской оси имеет одинаковое значение для обоих объектов:

>> get(get(hl, 'parent'), 'YAxisLocation')
ans =
    'right'
>> get(get(hr, 'parent'), 'YAxisLocation')
ans =
    'right'

Если теперь мы щелкнем по строке solid, чтобы сделать ее текущим объектом,

>> get(get(get(gco, 'parent'), 'children'), 'LineStyle')
ans =
    '-'
>> get(get(get(hl, 'parent'), 'children'), 'LineStyle')
ans =
    '-'
>> get(get(get(hr, 'parent'), 'children'), 'LineStyle')
ans =
    '-'
>> get(get(gco, 'parent'), 'YAxisLocation')
ans =
    'left'

Точно так же, если теперь мы щелкнем пунктирной линией,

>> get(get(get(gco, 'parent'), 'children'), 'LineStyle')
ans =
    '--'
>> get(get(get(hl, 'parent'), 'children'), 'LineStyle')
ans =
    '--'
>> get(get(get(hr, 'parent'), 'children'), 'LineStyle')
ans =
    '--'
>> get(get(gco, 'parent'), 'YAxisLocation')
ans =
    'right'

В качестве проверки

>> get(gcf, 'children')

также выдаст только одну ось, а

>> get(get(gcf, 'children'), 'children')

ведет себя аналогично: в списке указывается только тот объект, который был нанесен последним или был сделан текущим.

Вышеуказанное поведение может быть суммировано следующим образом:

  • Существует только одна ось (и свойство 'parent' всех объектов относится к этой оси, как и ожидалось).
  • Свойство 'children' ось l ists только один объект , а именно текущий объект или объект, который был нанесен последним.
  • Свойство 'YAxisLocation' оси динамически меняет между 'left' и 'right'. Опять же, это определяется текущим объектом или объектом, который был нанесен последним.

Не ясно, как понять это поведение. Следующие вопросы естественным образом возникают:

  • Это где-то задокументировано?
  • Как два объекта могут иметь ту же ось, что и 'parent', но эта ось имеет только текущий объект как 'children'?
  • Почему 'YAxisLocation' также изменяется в зависимости от текущего объекта?

1 Ответ

1 голос
/ 16 января 2020

Мне кажется, yyaxis делает какие-то неприятные закулисные вещи, и есть много скрытых данных, к которым мы не можем получить доступ.

Документация действительно говорит, что :

yyaxis left активирует сторону текущих осей, связанных с левой осью Y. Последующие графические команды предназначены для левой стороны.

и

Свойство Children объекта Axes содержит только дочерние элементы для активной стороны. Чтобы получить доступ ко всем дочерним элементам для обеих сторон, используйте функцию allchild.

Изменение "стороны" с помощью yyaxis, следовательно, изменяет содержимое объекта Axes, я предполагаю, что содержимое другая сторона хранится в каком-то скрытом месте, которое мне не удалось найти. yyaxis - это P-код, поэтому мы не сможем понять, что именно он делает.

Это интересно:

figure
yyaxis left
hl = plot([0 10],[0 1],'-');
yyaxis right
hr = plot([0 10],[100 0],'--');

h = gca;

yyaxis left
h.YLim

yyaxis right
h.YLim

Код создает левую и правую оси с разными ограничениями. Мы получаем дескриптор к осям, меняем его влево, считываем пределы из дескриптора, затем меняем вправо и снова читаем то же свойство. Первый раз он возвращает [0,1], второй раз [0,100]. То есть объект Axes с дескриптором h изменяется, когда мы вызываем yyaxis.

Единственное обнаруженное мной указание на то, что h указывает на оси с двух сторон, это то, что h.YAxis возвращает две ручки для NumericRuler объектов, по одной на каждую сторону.


Я не могу не чувствовать, что это неловкое поведение. Я ожидал, что там будет два Axes объекта, оба с тем же свойством Position, и, возможно, со слушателями, которые поддерживают синхронизацию этих двух c.

...