MATLAB: Surf coloring question: How CData works

cdataMATLABmatlab 2018bsurf

I am trying to color different surf pictures. Surf by default colors the surface using the colorbar from minimum of z data up to maximum of z data, using the whole colorbar. I want this to override; color the z data according to the z scale. I have a demo program how I tried to do this:
figure(1);
x=1:50;
y=1:50;
z=rand(50,50);
hs=surf(x,y,z,...
'FaceColor','interp',...
'EdgeColor','none',...
'FaceLighting','gouraud');
abc=max(abs(zlim));
zlim([-abc,abc]);
colorbar;
mmin=min(min(z));
mmax=max(max(z));
hs.CData=(z-mmin)*(2*abc)/(mmax-mmin)-abc ;
view([1 0 0]);
If I run this program, I have a toolbar, saying that deep blue corresponds to -1, bright yellow corresponds to +1 (that is ok, that is what I wanted). The picture, however, is blue around the minimum value (around zero) and yellow at around +1. I would like to have "green" at zero, as it is on the colorbar.
What I am doing wrong???

Best Answer

This is where the caxis function is for. You can change the color axis to match your data to a desired part of your color bar.
figure(1);
x=1:50;
y=1:50;
z=rand(50,50);
hs=surf(x,y,z,...
'FaceColor','interp',...
'EdgeColor','none',...
'FaceLighting','gouraud');
abc=max(abs(zlim));
zlim([-abc,abc]);
colorbar;
view([1 0 0]);
caxis([-1 1])
Related Question