36 votes

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

Comment puis-je obtenir tous les axes de poignées en figure poignée?

Compte tenu de la figure poignée hf, j'ai trouvé qu' get(hf, 'children') peut retourner les poignées de tous les axes. Cependant, l'Matlab Aider à penser qu'il peut revenir plus que les axes des poignées:

Les enfants de la figure. Un vecteur contenant les poignées de tous les axes, objets d'interface utilisateur affichée à l'intérieur de la figure. Vous pouvez modifier l'ordre des poignées et changer ainsi l'empilement des objets sur l'écran.

Est-il possible d'obtenir uniquement les axes de la poignée dans la figure de la poignée? Ou comment puis-je savoir si le handle retourné par get(hf, 'children') est un manche de hache?

Merci!

41voto

Jonas Points 54073

Utilisation FINDALL:

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

Si vous souhaitez obtenir tous les axes poignées de 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 par l'obtention de l'poignées type de la propriété:

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

isAxes sera vrai pour chaque poignée qui est de type axes.

EDIT2

Afin de sélectionner uniquement les axes des poignées qui ne sont pas des légendes, vous avez besoin pour le nettoyage de 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'}))

2voto

tm1 Points 132

Jonas solution ne fonctionne pas pour moi, parce qu'il y avait quelques poignées en se référant à des légendes. Étonnamment, les légendes semblent être mis en œuvre que des axes, au moins dans Matlab, 2010a. Voici une solution si vous ne souhaitez que des axes, pas tout de légendes ou d'autres choses.

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 par le tri des poignées révéler être un sous-type de type axes, par exemple scribe.legend.

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

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

peut ne pas fonctionner comme prévu:

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

2voto

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

Exactement reportez-vous à la légende ou les axes de lui-même (il peut exister d'autres éléments), vous avez besoin de les différencier, à l'aide de leurs propriétés caractéristiques.

Dans mon exemple, j'ai ouvert "la propriété de l'éditeur" et ont cherché des propriétés différentes pour les axes et la légende (car ils appartiennent tous les deux à "type, les axes"). Je cherche à 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 " Tag " ou bien, je pourrais aussi utiliser une autre propriété de la Propriété de "l'Inspecteur". La chose est, ils doivent être différents. La plupart de leurs propriétés sont les mêmes.

2voto

Ahmed Fasih Points 457

La solution par @tm1 est excellent. Le mien est un peu moins compliqué (si vous êtes ok 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 contiennent uniquement du tracé des axes. Cela fonctionne parce que l' class d'une légende ou une barre de couleur de l'objet est différente de axes.

Edit @Jonas souligne une amélioration possible de filtrer les résultats d' findall, car, au moins, des légendes et des colorbars semblent avoir non-vide Tag propriétés: remplacer la dernière phrase de l'extrait de code ci-dessus avec

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

Ces deux techniques sont encombrants et peuvent se briser dans l'avenir (en les comparant avec ggplot2 ou Bokeh pourrait être intéressant).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X