guide - plot matlab
Matlab: ¿Cómo obtener todos los mangos de los ejes en un asa de figura? (4)
¿Cómo obtengo todos los mangos de los ejes en un asa de figura?
Dado el manejador de figura hf
, encontré que 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 identificador devuelto por get(hf, ''children'')
es un identificador de hacha?
¡Gracias!
"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.
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
solo contendrá ejes de trama. Esto funciona porque la class
de una leyenda o un objeto de barra de colores es diferente de los axes
.
Edit @Jonas señala una mejora potencial para filtrar los resultados de findall
, porque al menos las leyendas y las barras de colores parecen tener propiedades de Tag
no vacías: 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).
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 son de un subtipo de tipos de ejes, 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.
Use FINDALL :
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 la propiedad type
identificadores:
isAxes = strcmp(''axes'',get(listOfHandles,''type''));
isAxes
será verdadero para todos los identificadores que sean de tipo axes
.
EDIT2
Para seleccionar solo manejadores de ejes que no sean leyendas, debe limpiar la lista de ejes (tiradores de ejes quitando todos los controladores cuya etiqueta no sea ''legend''
o ''Colorbar''
:
axNoLegendsOrColorbars= ax(~ismember(get(ax,''Tag''),{''legend'',''Colobar''}))