Доступ к свойствам графического объекта с использованием записи через точку в версиях Matlab, предшествующих R2014b

Попытка изменить цвета оси на графике Matlab здесь.


Ссылка на документацию Matlab: документы Matlab по настройке свойств осей

Фрагмент кода:

    subplot( 'Position', [ left bottom (1/(cols*2)) (1/rows) ] );
    ax = gca;
    ax.Color = 'y';

Это все, кроме копирования и вставки из примера в документации (показано здесь):

введите здесь описание изображения

Но Matlab выдает предупреждение и не меняет цвета оси для меня:

Предупреждение: назначение поля структуры перезаписывает значение с классом "двойной". См. Примечания к выпуску MATLAB R14SP2, Назначение переменных, не являющихся структурами, в качестве предупреждений о отображениях структур, для подробностей.

Я попытался назначить двойное значение, например, 42.0, но это не понравилось.


person David Parks    schedule 09.12.2014    source источник
comment
Я получаю ту же ошибку на моей машине.   -  person Cape Code    schedule 10.12.2014
comment
попробуйте сначала ax = handle(gca);, затем ax.Color = 'y';   -  person Hoki    schedule 10.12.2014
comment
Вы используете R2014b или более раннюю версию?   -  person am304    schedule 10.12.2014


Ответы (1)


Ваше предупреждающее сообщение, по-видимому, указывает на то, что вы используете версию, предшествующую Matlab R2014b.

Если это так, у вас нет прямого доступа к точечной нотации, потому что когда вы делаете ax=gca;, вы получаете возвращаемое значение ax класса double. Значением является идентификатор дескриптора объекта (в данном случае это текущая ось), но не самого дескриптора.

Когда вы пробуете ax.Color = 'y';, Matlab думает, что вы хотите перезаписать ax [double] новой переменной ax, которая будет структурой, с полем color, и выдаст предупреждение.

Вы по-прежнему можете получить доступ к точечной нотации для графических объектов и свойств, но вы должны сначала получить реальный дескриптор объекта, используя функцию handle. Например:

ax = handle( gca) ; %// the value "ax" returned is an `object`, not a `double`

или даже по существующей ссылке на дескриптор графического объекта:

ax = gca ; %// retrieve the `double` reference to the handle
... 
ax = handle(ax) ; %// the value "ax" returned is an `object`, not a `double`

после этого вы сможете использовать запись через точку для всех общедоступных свойств графического объекта. ax.Color = 'y'; теперь должно быть действительным

person Hoki    schedule 09.12.2014
comment
Хороший ответ! Я не знал о функции handle. Кажется... удобным :-P - person Luis Mendo; 10.12.2014
comment
Ах! r2014a, это странно, я только что установил это несколько дней назад, я предположил, что это самая последняя и лучшая версия. - person David Parks; 10.12.2014
comment
@LuisMendo, в некоторых случаях довольно удобно, а также быстрее, если вам нужно очень часто обновлять объект. Если вам это нравится, попробуйте ax = java(handle(gca)). он открывает целый набор возможностей... хотя и недокументированных. - person Hoki; 10.12.2014
comment
@LuisMendo, дополнительную информацию (и, насколько я могу судить, всю существующую информацию) о команде handle можно найти по адресу Недокументированный MATLAB. Я использую его постоянно. - person craigim; 10.12.2014