2012-01-30 14 views
6

Poniższy stackoverflow qestion:Jak odróżnić legendy od osi w programie Matlab?

Matlab: How to obtain all the axes handles in a figure handle?

identyfikuje jak dostać uchwyty na wszystkie osie z rysunku w programie MATLAB. Jednak lista ta będzie zawierała także uchwyty do legend, przynajmniej w R2008a, które wydają się być także osiami. Jak mogę (programowo) opowiedzieć legendy z rzeczywistych osi wykresów w wektorze uchwytów osi?

+1

Należy również zwrócić uwagę na osie 'colorbar'. – Nzbuu

Odpowiedz

12

Od linkaxes kod chcesz to:

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

ten powróci uchwyty wszystko osie danych na bieżącej ilustracji.

+0

Ale co, jeśli ktoś złośliwy zmienił tagi osi? –

+1

@Andrey: Zasługują na to, że kod zawodzi. – Jonas

+0

+1 dla opcji "-nie". Nie wiedziałem o tym. – Jonas

6

1) Domyślnie właściwość legendy o nazwie Tag to "Legenda". Oczywiście nie ma obietnicy, że się nie zmieni.

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) Inna różnica (która jest bardziej wytrzymała) jest to, że regularne osie nie mają String nieruchomość, ale legendy zrobić. Nie jestem pewien, czy istnieją inne typy obiektów, które również mają właściwość String. Na przykład:

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

Można go zweryfikować dzwoniąc:

get (GCA, 'String')
??? Błąd przy użyciu ==> get
Nie ma właściwości "String" w klasie "osi".

Ale z drugiej strony, dla legendy tam jest taka nieruchomość. Dlatego jest bardziej wytrzymały.

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

ans = 'A' 'B' 'C'

3) będę zalecane rozwiązanie to w szerokim zakresie. Po prostu śledź tworzone legendy i osie, przechowując ich uchwyty. Oznacza to, że zamiast kodowania jak:

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

kod tak:

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

Dzięki Andrey, twoja odpowiedź jest doskonała, ale myślę, że Nzbuu jest bliżej odpowiedzi, której szukałem. – crobar

+0

@crobar, to jest ok, rozumiem. Rzeczywiście jest trochę elegancji w rozwiązaniu Nzbuu :) –

0

tylko nieznacznie modyfikując kod my answer at the stackoverflow question you mentioned:

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); 

Niestety, rozwiązanie to zależy od szczegółów implementacji.

Powiązane problemy