Matlab: Как получить все ручки осей в ручке фигуры? - PullRequest
35 голосов
/ 15 октября 2010

Как получить все маркеры осей в дескрипторе фигуры?

Учитывая дескриптор фигуры hf, я обнаружил, что get(hf, 'children') может возвращать маркеры всех осей.Однако справка Matlab предполагает, что она может возвращать больше, чем просто ручки осей:

Дочерние элементы фигуры .Вектор, содержащий дескрипторы всех осей, объекты пользовательского интерфейса, отображаемые на рисунке.Вы можете изменить порядок маркеров и, таким образом, изменить расположение объектов на дисплее.

Можно ли получить только дескриптор осей в дескрипторе фигуры?Или как мне узнать, является ли дескриптор, возвращаемый get(hf, 'children'), дескриптором топора?

Спасибо!

Ответы [ 4 ]

37 голосов
/ 15 октября 2010

Использование FINDALL :

allAxesInFigure = findall(figureHandle,'type','axes');

Если вы хотите получить все ручки осей в любом месте Matlab, вы можете сделать следующее:

allAxes = findall(0,'type','axes');

EDIT

Чтобы ответить на вторую часть вашего вопроса: Вы можете проверить, является ли список дескрипторов осями, получив свойство type:

isAxes = strcmp('axes',get(listOfHandles,'type'));

isAxes будет верно для каждого дескриптора типа axes.

EDIT2

Чтобы выбрать только дескрипторы осей, которые не являются легендами, необходимо очиститьсписок осей (ax маркеры, удалив все маркеры, чей тег не 'legend' или 'Colorbar':

axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),{'legend','Colobar'}))
2 голосов
/ 03 сентября 2013

Решение от @ tm1 превосходно.Мой немного менее сложен (если вы в порядке с функциональным программированием):

% initialize `fig` somehow, i.e., "fig=gcf()" for the current figure or
% "fig=get(0,'children')" for all open figures; can be vector or scalar.

ax = findall(fig, 'type', 'axes');
ax = ax(arrayfun(@(i) strcmp(class(handle(i)), 'axes'), ax));

ax будет содержать только оси графика.Это работает, потому что class объекта легенды или цветовой панели отличается от axes.

Edit @Jonas указывает на потенциальное улучшение для фильтрации результатов findall, потому чтоПо крайней мере, легенды и цветные полосы имеют непустые свойства Tag: замените последнюю строку в приведенном фрагменте кода на

ax = ax(strcmp('', get(ax, 'Tag')))

Оба эти метода неэффективны и могут в будущем сломаться (сравнение сggplot2 или Bokeh могут быть интересны).

2 голосов
/ 28 августа 2013

«Jonas» и «tm1» имеют ответы, которые работают для некоторых.Однако, как указывает tm1, в типе «оси» есть несколько элементов.

Чтобы точно ссылаться на легенду или на оси (могут существовать другие элементы), вам необходимо различать их, используя их характеристикуproperties.

В моем примере я открыл «Редактор свойств» и искал разные свойства для осей и легенды (так как они оба принадлежат «type, axes»).Я пытался скопировать свои оси и его легенду:

copied_axes = findobj(temp_fig,'type','axes','Tag','');
copied_legend = findobj(temp_fig,'type','axes','Tag','legend');

Вместо свойства 'Tag' я также мог использовать другое свойство из "Инспектора свойств".Дело в том, что они должны отличаться.Большинство их свойств одинаковы.

2 голосов
/ 27 августа 2013

Решение Джонаса у меня не сработало, потому что было несколько ручек, относящихся к легендам. Удивительно, но легенды кажутся реализованными в виде осей, по крайней мере, в Matlab 2010a. Вот решение, если вам нужны только топоры, а не легенды или другие вещи.

axesHandles = get(fig, 'Children');
classHandles = handle(axesHandles);
count = length(axesHandles);
isNotInstanceOfSubtype = false(1, count);
for i = 1:count
    isNotInstanceOfSubtype(i) = strcmp(class(classHandles(i)), 'axes') == 1;
end
axesHandles = axesHandles(isNotInstanceOfSubtype);

Сценарий работает путем сортировки дескрипторов, которые указывают на подтип осей типа, например scribe.legend.

Предупреждение для тех, кто пытается улучшить приведенный выше фрагмент кода: используйте что-то вроде

classHandles = cellfun(@(x) handle(x), axesHandles)

может не работать должным образом:

??? Error using ==> cellfun
scribe.legend type is not currently implemented.
...