web-dev-qa-db-fra.com

Matlab: Comment obtenir toutes les poignées des axes dans une poignée de figure?

Comment obtenir toutes les poignées d'axes d'une poignée de figure?

Étant donné la poignée de figure hf, j'ai trouvé que get(hf, 'children') peut renvoyer les poignées de tous les axes. Cependant, l'aide de Matlab suggère qu'il peut renvoyer plus que les poignées des axes:

Enfants de la figure. Vecteur contenant les poignées de tous les axes, objets d'interface utilisateur affichés dans la figure. Vous pouvez modifier l'ordre des poignées et ainsi modifier l'empilement des objets sur l'affichage.

Existe-t-il un moyen d'obtenir uniquement la poignée des axes dans la poignée de la figure? Ou comment savoir si la poignée retournée par get(hf, 'children') est une poignée de hache?

Merci!

35
YYC

Utilisez FINDALL :

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

Si vous souhaitez obtenir toutes les poignées des axes n'importe où dans Matlab, vous pouvez effectuer les opérations suivantes:

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

[~ # ~] modifier [~ # ~]

Pour répondre à la deuxième partie de votre question: Vous pouvez tester si une liste de poignées sont des axes en obtenant la propriété poignées type:

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

isAxes sera vrai pour chaque descripteur de type axes.

EDIT2

Pour sélectionner uniquement les poignées des axes qui ne sont pas des légendes, vous devez nettoyer la liste des axes (ax poignées en supprimant toutes les poignées dont la balise n'est pas 'legend' ou 'Colorbar':

axNoLegendsOrColorbars= ax(~ismember(get(ax,'Tag'),{'legend','Colobar'}))
37
Jonas

"Jonas" et "tm1" ont des réponses qui fonctionnent pour certains. Cependant, comme tm1 a souligné le problème, il existe plusieurs éléments à l'intérieur du type 'axes'.

Pour faire exactement référence à la légende ou aux axes eux-mêmes (il peut exister d'autres éléments), vous devez les différencier en utilisant leurs propriétés caractéristiques.

Dans mon exemple, j'ai ouvert "l'éditeur de propriétés" et recherché des propriétés différentes pour les axes et la légende (car elles appartiennent toutes les deux à "type, axes"). J'essayais de copier mes axes et sa légende:

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

Au lieu de la propriété "Tag", je pourrais également utiliser une autre propriété de "Property Inspector". Le fait est qu'ils doivent différer. La plupart de leurs propriétés sont les mêmes.

2
Ozan Oğuz HAKTANIR

La solution de Jonas n'a pas fonctionné pour moi, car il y avait des poignées faisant référence aux légendes. Étonnamment, les légendes semblent être mises en œuvre comme des axes, du moins dans Matlab 2010a. Voici une solution si vous ne voulez que les axes, pas des légendes ou d'autres trucs.

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

Le script fonctionne en triant les poignées qui révèlent être d'un sous-type d'axes de type, par exemple scribe.legend.

Un avertissement pour ceux qui essaient d'améliorer l'extrait de code ci-dessus: en utilisant quelque chose comme

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

pourrait ne pas fonctionner comme prévu:

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

La solution de @ tm1 est excellente. Le mien est un peu moins compliqué (si vous êtes d'accord avec la programmation fonctionnelle):

% 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 ne contiendra que des axes de tracé. Cela fonctionne car le class d'un objet de légende ou de barre de couleur est différent de axes.

Edit @Jonas souligne une amélioration potentielle pour filtrer les résultats de findall, car au moins les légendes et les barres de couleurs semblent avoir des propriétés Tag non vides: remplacer la dernière ligne dans l'extrait de code ci-dessus avec

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

Ces deux techniques sont délicates et peuvent se casser à l'avenir (une comparaison avec ggplot2 ou Bokeh pourrait être intéressante).

2
Ahmed Fasih