You do not need to resort to undocumented functionalities to intercept a colormap
change in Matlab pre-HG2. You can simply attach a listener to the 'PostSet'
event of the property 'Colormap'
.
As a quick example, if your figure is already there, just type:
lh = addlistener( h.fig , 'Colormap' , 'PostSet' , @(h,e) disp('cmap changed !') )
in the console, and you will get a message every time you change the colormap
. Note that the event is triggered whether:
- you change the
colormap
entirely to another one (from jet
to hsv
for example)
- you change the size of the colormap (the number of division). (ex:
colormap(jet(5))
)
- you use the "Interactive colormap shift" gui tool.
Note that the event will not trigger if you use caxis
. This command does not change the colormap
itself but the way some colors are mapped to it. So if you use this command, your pcolor
will be modified (although the colormap won't). The caxis
command changes the CLim
property of the current axes
(not figure
!). So if you want to detect that, you have to attach a listener to this property on the correct axis. Something like:
lh = addlistener( gca , 'CLim' , 'PostSet' , @(h,e) disp('clim changed !') )
As a more applied example, here's a little demo which will react every time the colormap
is changed. Since I don't know what you planned to do to your contour
plot at every change, I just modify a couple of properties just to show that it's doing something. Adjust that to what you need to do.
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
