根据 z 轴上的条件绘制两种颜色的曲面图

plotting a surface plot in two colours depending on condition on z axis

z 是 200*200 数组,我有一个使用 Matlab surf(x,y,z) 的冲浪图。我正在尝试绘制冲浪图,以便当 z<10 时它将是蓝色的,而当 z>10 时它将是红色的。目前冲浪情节是这样的。有人可以建议一种在 Matlab 中执行此操作的方法吗?

改编自MATLAB Answers

z = peaks+10; % sample data generated between 3.4 and 18.1
% Make colors be red above 10, and blue below 10.
redChannel = z > 10;
greenChannel = 0*z;
blueChannel = z < 10;
% Make the RGB image.
colors = double(cat(3, redChannel, greenChannel, blueChannel));
% Plot the surface with those colors.
surf(z, colors);

试试这个

surf(x,y,z)
map = [0.0 0.0 1.0
       1.0 0.0 0.0];
colormap(map);
caxis([0 20]);

实现此目的的一种方法(有多种方法)是使用自定义 colormap: 构建一个仅包含您希望在图表中显示的颜色的颜色图,然后只需调整色阶,使中点为 Z=10.

代码的第一部分展示了如何创建自定义颜色图并应用它:

Zt = 10 ;       % threshold level for Z
z  = peaks+Zt ; % dummy test data

% build a colormap with your 2 custom color
%     [%Red %green %blue]
cmap = [0.79 0.22 0.81   ; % some kind of purple
        0    0    1    ] ; % pure blue

surf(z) ;           % plot the surface
colormap(cmap) ;    % apply the custom colormap
hcb = colorbar ;

这将生成一个具有您选择的两种颜色的表面:

但是等等!分离不完全在 Z=10 级别。没问题,如果我们调整颜色图的边界,使您的阈值级别在中间爆炸,Matlab 会负责为我们调整颜色:

%% Now center the colormap boundaries around your threshold level
% get the minimum and maximum
zmax = ceil(  max(max(z)) ) ;
zmin = floor( min(min(z)) ) ;

span = max( [zmax-Zt, Zt-zmin] ) ;  % calculate the span each side of [Zt]
caxis([Zt-span , Zt+span]) ;        % center the colormap around [Zt]

上面的最后一段代码允许围绕您选择的阈值水平定义一个相等的跨度,并考虑 Z 数据的内容。如果您事先知道数据的限制,则无需进行计算。在上面的示例中,我也可以简单地使用带有一些硬编码值的最后一行:

caxis([0 , 20]) ;

只要您为 caxis 指定的时间间隔以您的阈值水平为中心,它就会起作用。


编辑:

为了控制颜色条的标签,我通常在创建colorbar(或axes)后设置TicksTickLabels。为此,您需要 colorbar 对象的句柄。

注意上面的代码我修改了第一个代码块的最后一行。我将 colorbar 更改为 hcb=colorbar;。这样我们就有了颜色条的句柄,它允许我们设置任意刻度和相关标签。

获得此特定示例结果的最直接方法是:

hcb.Ticks      = [   5 , 10 , 15  ] ;
hcb.TickLabels = {'<10','10','>10'} ;

但是,如果您想要一个更通用的解决方案,可以使用任何阈值 Zt,那么您可以使用:

%% adjust colorbar labels
zl = caxis ;            % get the limits of the color scale
Zstr = num2str(Zt) ;    % get a string representing the threshold
hcb.Ticks      = [ (Zt+zl(1))/2 , Zt   , (zl(2)+Zt)/2  ] ;
hcb.TickLabels = { ['<' Zstr]   , Zstr ,  ['>' Zstr]   } ;

对于您的示例,两个选项都会产生: