2012-01-30 10 views
6

Il seguente qestion StackOverflow:Come raccontare le leggende dagli assi di Matlab?

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

identifica come arrivare maniglie a tutti gli assi da una figura in Matlab. Tuttavia, questo elenco conterrà anche maniglie per legende, almeno in R2008a, che sembrano essere anche assi. Come posso distinguere (programmaticamente) le legende dagli assi del plot reali in un vettore di handle degli assi?

+1

Si noti inoltre che è necessario prestare attenzione con gli assi 'colorbar'. – Nzbuu

risposta

12

Da linkaxes, il codice che si desidera è:

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

Ciò restituirà le maniglie di tutti gli assi dei dati nella figura attuale.

+0

Ma cosa succede se qualcuno malizioso ha cambiato i tag degli assi? –

+1

@Andrey: Quindi si meritano che il codice fallisca. – Jonas

+0

+1 per l'opzione '-not'. Non ero a conoscenza di questo. – Jonas

6

1) Per impostazione predefinita la proprietà della legenda di Tag è "Legenda". Certo, non c'è alcuna promessa che non è cambiato.

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) Un'altra differenza (che è più robusto) è che gli assi normali non hanno String struttura, ma legende fare. Non sono sicuro se ci sono altri tipi di oggetti che hanno anche la proprietà String. Per esempio:

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

È possibile verificarlo chiamando:

get (GCA, 'String')
??? Errore durante l'utilizzo di ==> get
Non esiste una proprietà 'String' nella classe 'axes'.

Ma d'altra parte, per le leggende là è come una proprietà. Questo è il motivo per cui è più robusto.

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

ans = 'A' 'b' 'c'

3) mi sento di raccomandare a risolvere questo in un contesto più ampio. Tieni traccia delle leggende e degli assi creati memorizzando le loro maniglie. Cioè, invece di codificare come:

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

codice come questo:

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

Grazie Andrey, la tua risposta è eccellente, ma penso che Nzbuu sia più vicino alla risposta che stavo cercando. – crobar

+0

@crobar, va bene, ho capito. In effetti c'è un po 'di eleganza nella soluzione di Nzbuu :) –

0

solo leggermente modificare il codice di 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); 

Sfortunatamente, questa soluzione dipende da dettagli di implementazione.