Как отличить легенды от топоров в Matlab? - PullRequest
6 голосов
/ 31 января 2012

Следующий вопрос переполнения стека:

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

определяет, как получить маркеры для всех осей из фигуры в Matlab. Однако этот список также будет содержать маркеры к легендам, по крайней мере, в R2008a, которые также являются осями. Как я могу сказать (программно) легенды от реальных осей сюжета в векторе маркеров осей?

Ответы [ 3 ]

12 голосов
/ 31 января 2012

С linkaxes, код, который вы хотите:

ax = findobj(gcf,'type','axes','-not','Tag','legend','-not','Tag','Colorbar');

Возвращает дескрипторы всех осей данных на текущем рисунке.

6 голосов
/ 31 января 2012

1) По умолчанию свойство Tag легенды - «Легенда».Конечно, нет никаких обещаний, что это не изменилось.

 get(l)

 ....
 BusyAction: 'queue'
      HandleVisibility: 'on'
               HitTest: 'on'
         Interruptible: 'off'
              Selected: 'off'
    SelectionHighlight: 'on'
                   **Tag: 'legend'**
                  Type: 'axes'
         UIContextMenu: 200.0018
              UserData: [1x1 struct]

 ....

2) Другое отличие (более надежное) состоит в том, что обычные оси не обладают свойством String, но имеют легенды.Я не уверен, есть ли другие типы объектов, которые также имеют свойство String.Например:

  plot(magic(3));legend('a','v','b');
  allAxesInFigure = findall(f,'type','axes')
  b = isprop(allAxesInFigure,'String')

Вы можете проверить это, позвонив по телефону:

get (gca, 'String')
???Ошибка при использовании ==> get
В классе 'axes' нет свойства 'String'.

Но с другой стороны, для легенд есть такое свойство.Вот почему он более надежный.

 plot(magic(3)); l = legend('a','b','c');
 get(l,'String')

ans = 'a' 'b' 'c'

3) Я бы порекомендовал решить эту проблему вболее широкий контекст.Просто следите за легендами и осями, которые вы создаете, храня их ручки.То есть вместо того, чтобы кодировать как:

 plot(magic(3));
 legend('a','v','b');
 plot(magic(5));
 legend('a','v','b','c','d');

Код как этот:

 p(1) = plot(magic(3));
 l(1) = legend('a','v','b');
 p(2) = plot(magic(5));
 l(2) = legend('a','v','b','c','d');
0 голосов
/ 27 августа 2013

Слегка изменив код моего ответа на вопрос stackoverflow, который вы упомянули :

axesHandles = get(fig, 'Children');
classHandles = handle(axesHandles);
count = length(axesHandles);
isLegend = false(1, count);
for i = 1:count
    isLegend(i) = strcmp(class(classHandles(i)), 'scribe.legend') == 1;
end
legendHandles = axesHandles(isLegend);

К сожалению, это решение зависит от деталей реализации.

...