You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matlab中为不等数据范围设置自定义分段的colorbar

解决方案

问题原因

你遇到的问题是Matlab默认会将caxis定义的颜色范围和colormap做线性映射:你设置了caxis([0 6])且colormap只有3个颜色,Matlab就自动把0-6均分为3个等长区间对应3个颜色,不会识别你自定义的阈值。

修正后完整代码

to_plot = hu_atl;
mask = zeros(size(to_plot));

mask(hz_atl>200) = NaN;  % 开放大洋
mask(hz_atl<=200) = 1; % 陆架

mask(mask==1) = to_plot(mask==1);
log_data = log10(mask); % 注意不要用log作为变量名,log是Matlab内置函数,避免覆盖报错

% 按需求阈值分箱:1代表≤2.7,2代表>2.7,NaN值保留
plot_data = discretize(log_data, [-inf, 2.7, inf]);
pcolor(plot_data'); 

shading interp; 

% 设置NaN(陆地)的显示颜色,这里用中灰色,可自行修改RGB数值调整颜色
set(gca, 'NaNColor', [0.5 0.5 0.5]);

% 定义自定义色卡:第一个颜色对应分箱值1(≤2.7区间),第二个对应分箱值2(>2.7区间),可自行调整RGB匹配需求
cmap = [
    0 0.8 0.8; % 青色:对应≤2.7区间
    1 1 0      % 黄色:对应>2.7区间
];
colormap(cmap);
caxis([1 2]); % 锁定颜色映射范围,避免生成多余区间

c = colorbar;
c.Label.String = 'log 10(h/u^3)'; 
% 自定义colorbar刻度和标签,直接匹配你的分段规则
c.Ticks = [1.25, 1.75];
c.TickLabels = {'≤2.7', '>2.7'};

title('Global tidal mixing front positions based on TPXO9 tidal data')
xlabel('Longitude') 
ylabel('Latitude') 
set(gca,'XTick',[]) 
set(gca,'YTick',[]) 

关键修改说明

  • 不直接用原始log值绘图,先通过discretize函数把数据按你的阈值做离散分箱,从根源避免Matlab自动做线性颜色映射
  • 用set(gca, 'NaNColor', 颜色值)单独设置NaN区域(陆地)的颜色,不需要把陆地颜色加入colormap
  • 自定义colorbar的刻度和标签,直接对应你的分段规则,不需要匹配线性数值区间
  • 如果需要保留你最初设计的「蓝色对应0、青色对应0.001~2.7、黄色对应大于2.7」的三段规则,只需要把分箱代码改成plot_data = discretize(log_data, [-inf, 0, 2.7, inf]);,同时给cmap新增对应蓝色的RGB值、调整colorbar的Ticks和TickLabels即可。

内容的提问来源于stack exchange,提问作者Katie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:36:02