2010-10-14 8 views
32

Wie bekomme ich alle Achsengriffe in einem Zahlenpunkt?Matlab: Wie erhält man alle Achsengriffe in einem Zahlenpunkt?

Angesichts der Abbildung Griff hf, fand ich, dass get(hf, 'children') die Griffe aller Achsen zurückgeben können. Allerdings schlägt die Matlab-Hilfe, dass es mehr als nur die Achsen zurückkehren Griffe:

Kinder der Figur. Ein Vektor mit den Handles aller Achsen, Benutzeroberflächenobjekte, die in der Abbildung angezeigt werden. Sie können die Reihenfolge der Griffe ändern und dadurch die Stapelung der Objekte auf dem Display ändern.

Gibt es eine Möglichkeit, nur die Achsen Griff in der Abbildung Griff zu erhalten? Oder woher weiß ich, ob der von get(hf, 'children') zurückgegebene Griff ein Axtgriff ist?

Danke!

Antwort

30

Verwendung FINDALL:

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

Wenn Sie alle Achsen bekommen Griffe überall in Matlab, könnten Sie wie folgt vorgehen:

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

EDIT

die zweite zu beantworten Teil Ihrer Frage: Sie können testen, ob eine Liste von Handles Achsen sind, indem Sie die HandleserhaltenEigenschaft:

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

isAxes wird wahr sein, für jeden Griff, dass der Typ ist axes.

EDIT2

Um nur Griffe Achsen, die nicht Legenden sind, müssen Sie die Liste der Achsen Bereinigung (ax Griffe durch alle Griffe zu entfernen, deren Tag ist nicht 'legend' oder 'Colorbar':

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

Dies ist eine nicht verwendete Funktion * hust * Workaround. –

+0

Der einfache findall funktioniert nicht, wenn Ihre Figur Legenden/Farbbalken/etc hat: das sind die "Benutzeroberflächenobjekte", die in dem Teil der von Ihnen zitierten Dokumentation erwähnt werden, und f∈dallfindall gibt auch diese an. Sie müssen f∈dallfindall mit einem strcmpstrcmp-Test kombinieren, nicht den Typtyp, sondern die Klasse, über strcmp (Klasse (hand≤ (potentialhand≤))) strcmp (Klasse (handle (potential handle))) –

+1

@AhmedFasih: thanks for Die Köpfe hoch. Um Legenden und Farbbalken zu entfernen, können Sie glücklicherweise auch die Eigenschaft 'tag' verwenden. Natürlich, wenn Sie nur nicht getaggte Achsen wollen, können Sie einfach 'axe (strcmp ('', get (ax, 'Tag'))'. – Jonas

2

Jonas 'Lösung hat bei mir nicht funktioniert, da es einige Handles gab, die auf Legenden verweisen.Überraschenderweise scheinen Legenden zumindest in Matlab 2010a als Achsen implementiert zu sein. Hier ist eine Lösung, wenn Sie nur wollen Die Achsen, keine Legenden oder andere Sachen.

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

Das Skript funktioniert durch Griffe Aussortieren, die aus einem Untertyp der Typ Achsen zeigen sein, zum Beispiel scribe.legend.

Eine Warnung für diejenigen, die versuchen, die oben genannten Code-Schnipsel zu verbessern: mit so etwas wie

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

möglicherweise nicht wie beabsichtigt:

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

Sie können den gesamten Anruf "strcmp" in cellfun/arrayfun wickeln (siehe meine Antwort). –

2

„Jonas“ und „TM1“ Antworten haben, die funktionieren für einige. Da tm1 jedoch auf das Problem hingewiesen hat, gibt es mehrere Elemente innerhalb des Typs "Achsen".

Um genau auf die Legende oder die Achsen selbst zu verweisen (es können andere Elemente existieren), müssen Sie sie anhand ihrer charakteristischen Eigenschaften unterscheiden.

In meinem Beispiel habe ich "Eigenschafteneditor" geöffnet und nach verschiedenen Eigenschaften für Achsen und Legende gesucht (da beide zu "Typ, Achsen" gehören). Ich habe versucht, meine Achsen und seine Legende zu kopieren:

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

Statt ‚Tag‘ Eigentum, ich könnte auch eine andere Eigenschaft aus dem „Eigenschafteninspektoren“ verwenden. Die Sache ist, sie müssen sich unterscheiden. Die meisten ihrer Eigenschaften sind gleich.

2

Die Lösung von @ tm1 ist ausgezeichnet. Mir ist ein bisschen weniger kompliziert (wenn Sie in Ordnung mit der funktionalen Programmierung sind):

% 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 enthält nur Plot-Achsen. Dies funktioniert, weil die class eines Legenden- oder Colorbar-Objekts sich von axes unterscheidet.

bearbeiten @Jonas weist auf eine mögliche Verbesserung aus, die Ergebnisse von findall, zu filtern, weil zumindest Legenden und Farbbalken scheinen nicht leer Tag Eigenschaften zu haben: mit

ax = ax(strcmp('', get(ax, 'Tag'))) 
die letzte Zeile in dem obigen Codeausschnitt ersetzen

Beide Techniken sind kludgy und können in der Zukunft brechen (ein Vergleich gegen ggplot2 oder Bokeh könnte interessant sein).

+0

mlint (der Quellcode-Analysator, den der Matlab-Editor verwendet, um hässliche Unterstriche in den Code einzufügen), sagt dumm, dass ich 'isa' anstelle von' strcmp (Klasse (...), '...') 'verwenden soll aber das funktioniert natürlich hier nicht, da Legenden-/Farbbalken-Objekte * Achsenobjekte sind ("Achsen" ist eine Elternklasse); wir müssen sie herausfiltern, weil die ursprünglichen "findall" -Achsenobjekte sie zurückgaben! –