2012-01-30 11 views
6
siguiente

El qestion stackoverflow:¿Cómo distinguir las leyendas de los ejes en Matlab?

Matlab: How to obtain all the axes handles in a figure handle?

identifica cómo conseguir mangos a todos los ejes de una figura en Matlab. Sin embargo, esta lista también contendrá identificadores a leyendas, al menos en R2008a, que también parecen ser ejes. ¿Cómo puedo distinguir (programáticamente) las leyendas de los ejes reales de la trama en un vector de manejadores de ejes?

+1

Tenga en cuenta que también debe tener cuidado con los ejes 'colorbar'. – Nzbuu

Respuesta

12

De linkaxes, el código que desea es:

ax = findobj(gcf,'type','axes','-not','Tag','legend','-not','Tag','Colorbar'); 

Esto devolverá los mangos de todos los ejes de datos en la figura actual.

+0

Pero, ¿y si alguien malicioso cambia las etiquetas de los ejes? –

+1

@Andrey: Entonces se merecen que el código falle. – Jonas

+0

+1 para la opción '-not'. No estaba enterado de esto. – Jonas

6

1) Por defecto, la propiedad Tag de la leyenda es 'Leyenda'. Por supuesto, no hay promesa de que no haya cambiado.

get(l) 

.... 
BusyAction: 'queue' 
     HandleVisibility: 'on' 
       HitTest: 'on' 
     Interruptible: 'off' 
       Selected: 'off' 
    SelectionHighlight: 'on' 
        **Tag: 'legend'** 
        Type: 'axes' 
     UIContextMenu: 200.0018 
       UserData: [1x1 struct] 

.... 

2) Otra diferencia (que es más robusta) es que los ejes regulares no tienen String propiedad, pero las leyendas hacer. No estoy seguro de si hay otros tipos de objetos que también tienen la propiedad String. Por ejemplo:

plot(magic(3));legend('a','v','b'); 
    allAxesInFigure = findall(f,'type','axes') 
    b = isprop(allAxesInFigure,'String') 

puede verificar llamando:

get (GCA, 'Cadena')
??? Error al utilizar ==> obtener
No hay propiedad 'Cadena' en la clase 'ejes'.

Pero, por otro lado, para las leyendas allí es tal propiedad. Por eso es más robusto.

plot(magic(3)); l = legend('a','b','c'); 
get(l,'String') 

ans = 'a' 'B' 'C'

3) que recomendaría a resolver esto en un contexto más amplio. Simplemente haga un seguimiento de las leyendas y los ejes que crea almacenando sus mangos. Es decir, en lugar de codificar como:

plot(magic(3)); 
legend('a','v','b'); 
plot(magic(5)); 
legend('a','v','b','c','d'); 

código como este:

p(1) = plot(magic(3)); 
l(1) = legend('a','v','b'); 
p(2) = plot(magic(5)); 
l(2) = legend('a','v','b','c','d'); 
+0

Gracias Andrey, tu respuesta es excelente, pero creo que Nzbuu está más cerca de la respuesta que estaba buscando. – crobar

+0

@crobar, eso está bien, lo entiendo. De hecho, hay algo de elegancia en la solución de Nzbuu :) –

0

Simplemente modificando ligeramente el código de my answer at the stackoverflow question you mentioned:

axesHandles = get(fig, 'Children'); 
classHandles = handle(axesHandles); 
count = length(axesHandles); 
isLegend = false(1, count); 
for i = 1:count 
    isLegend(i) = strcmp(class(classHandles(i)), 'scribe.legend') == 1; 
end 
legendHandles = axesHandles(isLegend); 

Desafortunadamente, esta solución depende de los detalles de implementación.

Cuestiones relacionadas