2011-02-09 8 views
15

In Matlab, vorrei aggiornare i dati tracciati in un insieme di assi quando l'utente zooma nella finestra del grafico. Ad esempio, supponiamo di voler tracciare una funzione particolare definita analiticamente. Vorrei aggiornare la finestra di stampa con dati aggiuntivi quando l'utente ingrandisce le tracce, in modo che possano esaminare la funzione con una risoluzione arbitraria.Matlab esegue una richiamata quando un grafico viene ingrandito/ridimensionato/ridisegnato?

Matlab fornisce ganci per aggiornare i dati quando la vista cambia? (O semplicemente quando viene ridisegnato?)

risposta

9

Sì, lo fa. Il modo oggetto ZOOM ha le seguenti callback:

ButtonDownFilter 
ActionPreCallback 
ActionPostCallback 

Gli ultimi due sono eseguiti poco prima o poco dopo la funzione di zoom. È possibile impostare la funzione di aggiornamento in ActionPostCallback, in cui si aggiorna il grafico in base ai nuovi limiti degli assi (la maniglia per gli assi viene passata come secondo argomento di input per il callback).

+0

Grazie, questo è esattamente quello che stavo cercando! C'è anche un callback di ridisegno generico? – nibot

+0

@nibot: vuoi dire, come ['refresh'] (http://www.mathworks.com/help/techdoc/ref/refresh.html)? In alternativa, 'drawnow' svuota la coda. – Jonas

+1

Intendevo, c'è un modo per far chiamare a Matlab una funzione che specifichi ogni volta che ridisegna la figura? – nibot

16

Mentre devo ancora trovare un callback "ridisegna" generico per risolvere questa domanda, sono riuscito a mettere insieme un gruppo di quattro callback * che sembrano raggiungere questo obiettivo in (quasi?) Tutte le situazioni. Per un dato oggetto assi ax = gca(),

1. Configurazione della zoom callback function come indicato by @Jonas:
set(zoom(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

2. Imposta pan callback function: Configurazione
set(pan(ax),'ActionPostCallback',@(x,y) myCallbackFcn(ax));

3. un figure resize callback function:
set(getParentFigure(ax),'ResizeFcn',@(x,y) myCallbackFcn(ax));

4. Modifica: questo non funziona più in R2014b, ma è necessario solo se si aggiunge, ad esempio, una barra di colore alla figura (che modifica la posizione dell'asse senza modificare le dimensioni della figura o l'asse zoom/panoramica). Non ho cercato un sostituto. Infine, impostare uno undocumented property listener per la proprietà posizione degli assi. C'è un trucco importante qui: dobbiamo tenere il manico sull'oggetto handle.listener come una volta eliminato (o lascia l'ambito), rimuove la callback. La proprietà UserData dell'oggetto stesso è un bel posto in cui nasconderlo in molti casi.

hax = handle(ax); 
hprop = findprop(hax,'Position'); 
h = handle.listener(hax,hprop,'PropertyPostSet',@(x,y) myCallbackFcn(ax)); 
set(ax,'UserData',h); 

In tutti questi casi ho scelto di scartare gli argomenti dell'evento di default richiamata e invece cogliere l'asse in questione all'interno di una funzione anonima. Ho trovato che questo è molto più utile di provare a far fronte a tutte le diverse forme di argomenti che si propagano attraverso questi scenari di callback disparati.

* Inoltre, con così tante fonti di callback diversi volano intorno, trovo prezioso per avere un recursion check all'inizio del myCallbackFcn per assicurare che io non finire in un ciclo infinito.

+2

A partire da R2014b in base ai [documenti ufficiali] (http://de.mathworks.com/help/matlab/graphics_transition/why-does-handle-listener-return-an-error-1.html) 'handle.listener 'non funzionerà più. – embert

Problemi correlati