Поведение свойств оси с помощью yyaxis

Создайте фигуру с двумя осями 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'

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

>> 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' оси содержит список только одного объекта , а именно текущего объекта или объекта, который был нанесен последним.
  • Свойство оси 'YAxisLocation' динамически изменяется между 'left' и 'right' . Опять же, это определяется текущим объектом или объектом, который был нанесен последним.

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

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

Всего 1 ответ


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

Документация говорит, что:

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

и

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


Есть идеи?

10000