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


¿Cómo obtengo todos los mangos de los ejes en un asa de figura?

Dado el asa de la figura hf, Encontre eso get(hf, 'children') puede devolver las asas de todos los ejes. Sin embargo, la Ayuda de Matlab sugiere que puede devolver algo más que los identificadores de los ejes:

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!


32
2017-10-14 23:21


origen


Respuestas:


Utilizar ENCUENTRA TODOS:

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

Si desea obtener todos los controladores de ejes en Matlab, puede hacer lo siguiente:

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

EDITAR

Para responder 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 cada manejador que sea de tipo axes.

EDIT2

Para seleccionar solo manejadores de ejes que no sean leyendas, debe limpiar la lista de ejes (ax se encarga de eliminar todos los identificadores cuya etiqueta no es 'legend' o 'Colorbar':

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

31
2017-10-14 23:32



La solución de Jonas no funcionó para mí, porque había algunos identificadores que se referían a leyendas. Sorprendentemente, las leyendas parecen implementarse como ejes, al menos en Matlab 2010a. Aquí hay una solución si solo quiere los 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 clasificando identificadores que revelan que pertenecen a un subtipo de ejes tipo, por ejemplo scribe.legend.

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

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

podría no funcionar como se esperaba

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

2
2017-08-27 10:05



"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"). Intentaba 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 la propiedad 'Etiqueta', también podría usar otra propiedad del 'Inspector de propiedades'. La cuestión es que deben diferir. La mayoría de sus propiedades son iguales.


2
2017-08-28 13:51



La solución de @ tm1 es excelente. El mío es un poco menos complicado (si está 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á solo los ejes de la gráfica. Esto funciona porque el class de una leyenda o 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 las leyendas y las barras de colores parecen tener un formato no vacío Tag propiedades: reemplace la última línea en el fragmento de código anterior con

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

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


2
2017-09-03 13:17