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

Esiste una soluzione per il rilascio recente di MATLAB (dopo HG-2)? – oro777
@ oro777. Mi dispiace ma non sono riuscito a trovare un modo rapido per farlo funzionare per l'ultima versione di Matlab. – Hoki