claudiop
claudiop

Reputation: 140

Surface plot with highligheted cut

I would like to plot a 3D surface using the Matlab surf function. The whole surface should be in gray scale, then I need to highlight a specific cut of the surface using a different color.

I thought this code would've worked but it doesn't.

    Mat = randi(100);     % Matrix to be plotted in gray scale

    ind_highlight = 10;   % Row of the matrix to be highlighted
    Mat2 = Mat;
    Mat2([1:ind_highlight-1, ind_highlight+1:end] ,:) = NaN;


    figure
    surf(X,Y,Mat)
    colormap gray
    hold on

    % Highlight the ind_highlight row
    surf(X,Y,Mat2)
    colormap hsv

Any help would be highly appreciated!

Upvotes: 0

Views: 368

Answers (1)

il_raffa
il_raffa

Reputation: 5190

It seems there is no way to use different colormap to obtain the desired effect since the colormap "belongs" to the figure.

I've found a possible solution which does not use colormap.

It is based on the specifying the color matrix in the call to surf, one for the whole matrix, one for the section to be highlighted, then superimposing the second one to the first one.

Unfortunately, I've not been able to set the first ad gray.

I've used the peaks matrix instead of your "randi" in order to have a more smooth surface to work with and inserted the script in a for loop to highlight different section of the matrix

% Mat = randi(100,100,100);     % Matrix to be plotted in gray scale
% Alternative definition of the Matrix to be displayed
n_pt=50;
Mat=peaks(n_pt);
% Generate meshgrid
x=1:n_pt;
y=1:n_pt;
[X,Y]=meshgrid(x,y);
ind_highlight_2 = 5;   % Number of rows of the matrix to be highlighted
% Generate two set of color matrix
% The first on for the whole surf
% The second one for the section to be highlighted
a=randi(2,n_pt,n_pt);
b=randi(10,n_pt,n_pt);

for i=1:n_pt-ind_highlight_2
   ind_highlight_1 = i;   % Starting row of the matrix to be highlighted
   Mat2 = Mat;
   % Modified set of data (in the original just one row was left
   % Mat2([1:ind_highlight-1, ind_highlight+1:end] ,:) = NaN
   Mat2(ind_highlight_1:ind_highlight_1+ind_highlight_2,:) = NaN;
   COL=a;
   COL(ind_highlight_1:ind_highlight_1+ind_highlight_2,:)=b(ind_highlight_1:ind_highlight_1+ind_highlight_2,:);
   % Plot the surf specifying the color
   s_h=surf(X,Y,Mat,COL);
   shading interp
%    view([0 90])
% f_name=['jpg_name_' num2str(i)]
% print('-djpeg75',f_name)
   pause(.1);
end

enter image description here

Hope this helps.

Upvotes: 1

Related Questions