2010-10-14 13 views
32

Come si ottengono tutte le maniglie degli assi in una maniglia di figura?Matlab: come ottenere tutte le maniglie degli assi in una maniglia figura?

Data la figura handle hf, ho trovato che get(hf, 'children') può restituire le maniglie di tutti gli assi. Tuttavia, la Guida in Matlab suggerisce che possa restituire più di solo gli assi gestisce:

bambini della figura. Un vettore contenente le maniglie di tutti gli assi, oggetti dell'interfaccia utente visualizzati all'interno della figura. È possibile modificare l'ordine delle maniglie e quindi modificare l'impilamento degli oggetti sul display.

C'è un modo per ottenere solo la maniglia degli assi nell'impugnatura di figura? O come faccio a sapere se l'handle restituito da get(hf, 'children') è un handle di ascia?

Grazie!

risposta

30

Uso FINDALL:

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

Se si desidera ottenere tutti gli assi maniglie ovunque in Matlab, si potrebbe procedere come segue:

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

EDIT

Per rispondere alla seconda parte della tua domanda: puoi verificare se un elenco di handle sono assi acquisendo le maniglie type Proprietà:

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

isAxes sarà vero per ogni maniglia che è di tipo axes.

EDIT2

Per selezionare gli assi solo maniglie che non sono leggende, è necessario per ripulire la lista degli assi (ax maniglie allontanando tutte le impugnature la cui etichetta non è 'legend' o 'Colorbar':

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

Questa è una funzionalità sottoutilizzata * tosse * soluzione alternativa. –

+0

Il semplice findall non funzionerà se la tua figura ha legende/colorbar/etc .: questi sono gli "oggetti dell'interfaccia utente" menzionati nel bit della documentazione che hai citato, e f∈dallfindall restituirà gli handle anche a quelli. Dovrai combinare f∈dallfindall con un test strcmpstrcmp non il typetype ma la classe, tramite strcmp (class (hand≤ (potenzialehand≤))) strcmp (class (handle (potenziale handle))) –

+1

@AhmedFasih: grazie per l'heads-up. Per rimuovere legende e barre dei colori, puoi usare fortunatamente anche la proprietà 'tag'. Naturalmente, se si vogliono solo assi senza tag, si può semplicemente fare ax (strcmp ('', get (ax, 'Tag')) '. – Jonas

2

La soluzione di Jonas non ha funzionato per me, perché c'erano alcune maniglie che si riferiscono alle leggende. Sorprendentemente, le leggende sembrano essere implementate come assi, almeno in Matlab 2010a. Ecco una soluzione se vuoi solo e assi, non leggende o altre cose.

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

Lo script opera smistamento maniglie che rivelano essere di un sottotipo di assi tipo, ad esempio scribe.legend.

Un avvertimento per coloro che cercano di migliorare il codice precedente frammento di codice: utilizzando qualcosa di simile

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

potrebbe non funzionare come previsto:

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

puoi racchiudere l'intera chiamata 'strcmp' all'interno di cellfun/arrayfun (vedi la mia risposta). –

2

"Jonas" e "TM1" avere risposte che funzionano per alcuni. Tuttavia, poiché tm1 ha indicato il problema, ci sono diversi elementi all'interno del tipo "assi".

Per fare esattamente riferimento alla legenda o agli assi stessi (potrebbero esistere altri elementi), è necessario differenziarli utilizzando le loro proprietà caratteristiche.

Nel mio esempio, ho aperto "editor di proprietà" e ho cercato le proprietà differenti per assi e legenda (poiché entrambi appartengono a "tipo, assi"). Stavo cercando di copiare i miei assi e la sua leggenda:

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

Invece di proprieta 'Tag', ho anche potuto usare un altro proprietà dalla "finestra di ispezione Proprietà". Il fatto è che devono differire. La maggior parte delle loro proprietà è la stessa.

2

La soluzione di @ tm1 è eccellente. Il mio è un po 'meno complicato (se sei ok con la programmazione funzionale):

% 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 conterrà assi solo trama. Funziona perché lo class di un oggetto legend o colorbar è diverso da axes.

Modifica @Jonas rileva un potenziale miglioramento per filtrare i risultati di findall, perché almeno legenda e colorbars sembrano avere non vuoti Tag proprietà: sostituire l'ultima linea nel frammento codice precedente con

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

Entrambe queste tecniche sono kludgy e potrebbero rompersi in futuro (un confronto con ggplot2 o Bokeh potrebbe essere interessante).

+0

mlint (l'analizzatore di codice sorgente utilizzato dall'editor Matlab per inserire sottotribuzioni colorate nel codice) stupidamente dice che dovrei usare 'isa' invece di' strcmp (class (...), '...') ' ma naturalmente non funziona qui perché gli oggetti legend/colorbar * sono oggetti * 'axes' (' axes' è una classe genitore); dobbiamo filtrarli perché gli oggetti originali 'findall'' axes' li hanno restituiti! –

Problemi correlati