# how to setup a color matrix in surf(x,y,z,C) that has two components, one fixed, one related to data?

3 views (last 30 days)
Francisco on 22 Aug 2012
I am solving a wave like equation using the perfectly matched layer method, where an absorbing layer surrounds the domain of interest. I am able to compute the solution and want to plot it. So far what I have been doing is assigning the absorbing layer a fixed color, and the interior of the domain a checkerboard pattern using the code below and surf(X,Y,Z,C). However, I am wondering if it is possible to keep the color of the exterior boundary fixed, but have the interior of the domain have a color assigned related to the Z data.
C=zeros(N+2*Nl);
for n=1:N+2*Nl
for p=1:N+2*Nl
if n<=Nl || n>=(N+Nl) ||p<=Nl || p>=(N+Nl)
C(n,p)=1;
else
if mod(floor(n/10)+floor(p/10),2)==0
C(n,p)=4/3;
else
C(n,p)=5/3;
end
end
end
end
So far the plot looks like this one, but I would like to have instead of the checkerboard pattern the interior to have a colormap related to the z-data, and it would look as if you just used surf(X,Y,Z), but keeping the one color exterior layer. ##### 1 CommentShowHide None
José-Luis on 22 Aug 2012
Could you edit your question so the code is a bit clearer?

Patrick Kalita on 28 Aug 2012
This approach certain has its limitations, but it's also pretty easy to implement: If you set the CData values on the border to be -Inf, those locations will always get the color at the "bottom" of the colormap (which is actually the first row). For example:
%%Generate some X, Y, and ZData
[X, Y] = meshgrid(linspace(-3, 3, 60));
Z = zeros(60);
border = true(60);
border(6:55, 6:55) = false;
Z(~border) = peaks(X(~border), Y(~border));
%%Make CData and plot
C = Z;
C(border) = -Inf;
surf(X, Y, Z, C);