2015-08-07 11 views
5

Sto lavorando a un controllo MATLAB di MATLAB (2014a) programma con una finestra trama che mostra un grafico a contour -like su un grafico basato su pcolor.Esegui una funzione quando la colormap cambia

Gli utenti hanno scoperto che è possibile modificare colormap facendo clic con il pulsante destro del mouse sulla barra dei colori. Tuttavia, questa modifica ha effetto solo sul grafico pcolor, a causa delle parti interne delle mie funzioni contour.

Ho già scoperto come ottenere il colormap modificato dall'oggetto dei miei assi e applicarlo alla trama contour, ma devo ancora rifare manualmente la trama.

Esiste una richiamata che viene eseguita dopo la modifica dell'oggetto colormap di un oggetto axes/figure?

Ho letto su PropertyChangeCallback, ma il colormap non sembra essere memorizzato come una proprietà.

risposta

1

Non è necessario ricorrere a senza documenti funzionalità di intercettare un cambiamento colormap in Matlab pre-HG2. Puoi semplicemente collegare un ascoltatore all'evento 'PostSet' della proprietà 'Colormap'.

Come esempio veloce, se il dato è già lì, tipo solo:

lh = addlistener(h.fig , 'Colormap' , 'PostSet' , @(h,e) disp('cmap changed !')) 

nella console, e si otterrà un messaggio ogni volta che si cambia il colormap. Si noti che l'evento viene attivato se:

  • si cambia il colormap interamente ad un altro (jet-hsv per esempio)
  • si modifica la dimensione della mappa di colori (il numero di divisione). (es: colormap(jet(5)))
  • si utilizza lo strumento "Interactive colonnap shift".

Nota che l'evento sarà non grilletto se si utilizza caxis. Questo comando non modifica lo stesso colormap ma il modo in cui alcuni colori vengono mappati su di esso. Quindi se usi questo comando, il tuo pcolor verrà modificato (anche se la mappa colori non lo farà). Il comando caxis modifica la proprietà CLim dell'attuale axes (non figure!). Quindi, se vuoi rilevarlo, devi collegare un listener a questa proprietà sull'asse corretto. Qualcosa di simile:

lh = addlistener(gca , 'CLim' , 'PostSet' , @(h,e) disp('clim changed !')) 

Come esempio più applicata, ecco un piccolo demo che reagisce ogni volta che il colormap è cambiato. Dato che non so cosa hai intenzione di fare sulla tua trama contour ad ogni cambio, modifico solo un paio di proprietà solo per mostrare che sta facendo qualcosa. Regola ciò che devi fare.

function h = cmap_change_event_demo 

%// SAMPLE DATA. create a sample "pcolor" and "contour" plot on a figure 
nContour = 10 ; 
[X,Y,Z] = peaks(32); 
h.fig = figure ; 
h.pcol = pcolor(X,Y,Z) ; 
hold on; 
[~,h.ct] = contour(X,Y,Z,nContour,'k'); 
h.cb = colorbar 
shading interp 
colormap(jet(nContour+1)) %// assign a colormap with only 10+1 colors 

%// add the listener to the "Colormap" property 
h.lh = addlistener(h.fig , 'Colormap' , 'PostSet' , @cmap_changed_callback) 

%// save the handle structure 
guidata(h.fig , h) 

function cmap_changed_callback(~,evt) 
    %// disp('cmap changed !') 

    hf = evt.AffectedObject ; %// this is the handle of the figure 
    cmap = evt.NewValue ;  %// this is the new colormap. Same result than : cmap = get(hf,'Colormap') ; 

    h = guidata(hf) ;   %// to retrieve your contour handles (and all the other handles) 
    nColor = size(cmap,1) ;  %// to know how many colors are in there if you want matching contours 

    %// or just do something useless 
    set(h.ct , 'LineColor' , rand(1,3))  %// change line color 
    set(h.ct , 'LineWidth' , randi([1 5],1)) %// change line thickness 

cmap_event_demo

+0

Esiste una soluzione per il rilascio recente di MATLAB (dopo HG-2)? – oro777

+0

@ oro777. Mi dispiace ma non sono riuscito a trovare un modo rapido per farlo funzionare per l'ultima versione di Matlab. – Hoki