2010-10-14 12 views
32

¿Cómo obtengo todos los mangos de los ejes en un asa de figura?Matlab: ¿Cómo obtener todos los tiradores de los ejes en un asa de figura?

Dado el asa de la figura hf, encontré que get(hf, 'children') pueden devolver las asas de todos los ejes. Sin embargo, la ayuda de Matlab sugiere que puede volver algo más que los ejes se encarga de:

niños de la figura. Un vector que contiene las asas de todos los ejes, objetos de interfaz de usuario que se muestran en la figura. Puede cambiar el orden de los controladores y, por lo tanto, cambiar el apilamiento de los objetos en la pantalla.

¿Hay alguna manera de obtener solo el mango de los ejes en el asa de la figura? ¿O cómo sé si el mango devuelto por get(hf, 'children') es un mango de hacha?

Gracias!

Respuesta

30

Uso FINDALL:

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

Si desea obtener todos los ejes se encarga de cualquier parte del Matlab, podría hacer lo siguiente:

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

EDITAR

Para responder a la segunda parte de su pregunta: Puede probar si una lista de identificadores son ejes al obtener los identificadores type propiedad:

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

isAxes será cierto para todos los que manejan es de tipo axes.

Edit2

para seleccionar sólo los ejes mangos que no son leyendas, es necesario limpiar la lista de ejes (ax mangos mediante la eliminación de todos los mangos cuya etiqueta no es 'legend' o 'Colorbar':

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

Esta es una característica subutilizada * tos * solución alternativa. –

+0

El final simple no funcionará si su figura tiene leyendas/barras de color/etc .: esos son los "objetos de interfaz de usuario" mencionados en el fragmento de la documentación que citó, y f∈dallfindall también devolverá identificadores a esos. Necesitarás combinar f∈dallfindall con una prueba strcmpstrcmp no del tipo tipo sino de la clase, a través de strcmp (clase (hand≤ (potentialhand≤))) strcmp (clase (handle (posible handle))) –

+1

@AhmedFasih: gracias por el heads-up. Para eliminar leyendas y barras de color, afortunadamente puede usar la propiedad 'etiqueta' también. Por supuesto, si solo quiere ejes no etiquetados, simplemente puede hacer 'ax (strcmp ('', get (ax, 'Tag'))'. – Jonas

2

La solución de Jonas no funcionó para mí, porque había algunos identificadores que se referían a las leyendas. Sorprendentemente, las leyendas parecen implementarse como ejes, al menos en Matlab 2010a. Aquí hay una solución si solo desea th e ejes, no leyendas u otras cosas.

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

El script funciona mediante la clasificación de las manijas que revelan ser de un subtipo de ejes tipo, por ejemplo scribe.legend.

Una advertencia para aquellos que tratan de mejorar el código anterior fragmento: usando algo como

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

podría no funcionar según lo previsto:

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

puede envolver toda la llamada 'strcmp' dentro de cellfun/arrayfun (ver mi respuesta). –

2

"Jonas" y "TM1" tienen respuestas que funcionan para algunos. Sin embargo, como tm1 señaló el problema, hay varios elementos dentro del tipo 'ejes'.

Para referirse exactamente a la leyenda o los ejes en sí (pueden existir otros elementos), debe diferenciarlos, utilizando sus propiedades características.

En mi ejemplo, abrí "editor de propiedades" y busqué propiedades diferentes para los ejes y la leyenda (ya que ambos pertenecen a "tipo, ejes"). Yo estaba tratando de copiar mis ejes y su leyenda:

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

En lugar de propiedad 'Tag', que también se podría utilizar otro propiedad del "Inspector de propiedades". La cuestión es que deben diferir. La mayoría de sus propiedades son iguales.

2

La solución de @ tm1 es excelente. El mío es un poco menos complicado (si estás bien con la programación funcional):

% 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 contendrá solamente ejes de los gráficos. Esto funciona porque el class de una leyenda o un objeto de barra de colores es diferente de axes.

Editar @Jonas señala una mejora potencial para filtrar los resultados de findall, porque al menos leyendas y colorbars parecen tener no vacíos Tag propiedades: sustituir la última línea en el fragmento de código anterior con

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

Ambas técnicas son dudosas y pueden romperse en el futuro (una comparación con ggplot2 o Bokeh podría ser interesante).

+0

mlint (el analizador de código fuente que el editor de Matlab usa para poner subrayados de colores desagradables en tu código) dice estúpidamente que debería usar 'isa' en lugar de' strcmp (clase (...), '...') ' pero, por supuesto, eso no funciona aquí porque los objetos legend/colorbar * son * objetos 'axes' (' axes' es una clase padre); ¡tenemos que filtrarlos porque los objetos originales 'findall'' axes' los devolvieron! –

Cuestiones relacionadas