如何在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
相关产品推荐
相关产品推荐

