2010-10-14 18 views
32

Jak uzyskać wszystkie uchwyty osi w uchwycie rysunku?Matlab: Jak uzyskać wszystkie uchwyty osi w uchwycie rysunku?

Biorąc pod uwagę uchwyt liczby hf, stwierdziłem, że get(hf, 'children') może zwrócić uchwyty wszystkich osi. Jednakże, Matlab Pomoc sugeruje, że może wrócić więcej niż tylko osi klamki:

Dzieci rysunku. Wektor zawierający uchwyty wszystkich osi, obiekty interfejsu użytkownika wyświetlane na rysunku. Możesz zmienić kolejność uchwytów, a tym samym zmienić układanie obiektów na wyświetlaczu.

Czy istnieje sposób uzyskania tylko uchwytu osi w uchwycie rysunku? Albo skąd mam wiedzieć, czy uchwyt zwrócony przez get(hf, 'children') jest uchwytem topora?

Dzięki!

Odpowiedz

30

Zastosowanie FINDALL:

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

Jeśli chcesz uzyskać wszystkie osie obsługuje nigdzie w Matlab, można wykonać następujące czynności:

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

EDYCJA

Aby odpowiedzieć na sekundę część twojego pytania: możesz przetestować, czy lista uchwytów to osie, zdobywając uchwyty type nieruchomości:

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

isAxes będzie prawdziwe dla każdego, że uchwyt jest typu axes.

EDIT2

Aby wybrać osie tylko uchwyty, które nie są legendy, trzeba czyszczenia listę osi (ax uchwyty, usuwając wszystkie uchwyty, których tag nie jest 'legend' lub 'Colorbar':

axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),{'legend','Colobar'})) 
+0

Jest to niedostatecznie wykorzystana * kaszel * obejście. –

+0

Proste findall nie zadziała, jeśli twoja postać ma legendy/colorbars/etc .: są to "obiekty interfejsu użytkownika" wymienione w cytowanej dokumentacji, a f∈dallfindall zwróci także uchwyty do nich. Będziesz musiał połączyć f∈dallfindall z testem strcmpstrcmp nie typem, ale klasą, przez strcmp (class (hand≤ (potencjalna ręka))) strcmp (klasa (uchwyt (potencjalny uchwyt))) –

+1

@AhmedFasih: dzięki za heads-up. Aby usunąć legendy i paski kolorów, możesz na szczęście użyć także właściwości "tag". Oczywiście, jeśli chcesz mieć tylko niezapisane topory, możesz po prostu zrobić 'ax (strcmp ('', get (ax, 'Tag'))'. – Jonas

2

Rozwiązanie Jonasa nie zadziałało dla mnie, ponieważ było kilka uchwytów odnoszących się do legend.Najpiewanie, legendy wydają się być implementowane jako osie, przynajmniej w Matlab 2010a. Oto rozwiązanie, jeśli chcesz tylko e osi, żadnych legend i innych rzeczy.

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

Skrypt działa poprzez uporządkowanie uchwyty, które ujawniają się z podtypu osi typu, na przykład scribe.legend.

ostrzeżenie dla tych, którzy próbują poprawić powyższy fragment kodu: using coś

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

może nie działać zgodnie z przeznaczeniem:

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

możesz zawinąć całe wywołanie 'strcmp' wewnątrz cellfun/arrayfun (zobacz moją odpowiedź). –

2

„Jonas” i „TM1” ma odpowiedzi, które pracują dla niektórych. Jednakże, gdy tm1 wskazywało problem, w rodzaju "osi" znajduje się kilka pozycji.

Aby dokładnie odnieść się do samej legendy lub osi (mogą istnieć inne elementy), należy je rozróżnić, korzystając z ich charakterystycznych właściwości.

W moim przykładzie otworzyłem "edytor właściwości" i szukałem różnych właściwości dla osi i legendy (ponieważ obie należą do "typu, osi"). Starałem się skopiować moje osie i jego legendę:

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

zamiast „Tag” mienia, ja też przydałby innego mienia z „Property Inspector”. Chodzi o to, że muszą się różnić. Większość ich właściwości jest taka sama.

2

Rozwiązanie @ tm1 jest doskonałe. Kopalnia jest trochę mniej skomplikowany (jeśli jesteś ok z programowania funkcyjnego):

% 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 będzie zawierać tylko działka osie. Działa to, ponieważ class legendy lub obiektu koloru paska różni się od axes.

Edit @Jonas wskazuje na potencjalną poprawę filtrowania wyników findall, bo przynajmniej legendy i colorbars wydają się mieć niepuste Tag właściwości: zastąpić ostatni wiersz w powyższym fragmencie kodu z

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

Obie te techniki są kludgy i mogą pękać w przyszłości (porównanie z ggplot2 lub Bokeh może być interesujące).

+0

mlint (analizator kodu źródłowego, którego edytor Matlab używa do umieszczenia brzydkich podkreśleń w twoim kodzie) głupio mówi, że powinienem użyć 'isa' zamiast' strcmp (class (...), '...') ' ale oczywiście to nie działa, ponieważ obiekty legenda/colorbar * są * obiektami 'osi' (" osie "to klasa nadrzędna); musimy je odfiltrować, ponieważ oryginalne obiekty 'findall'' zwróciły je! –

Powiązane problemy