Matlab 颜色条 pcolor
Matlab colorbar pcolor
我有一张用 pcolor 显示潮汐混合锋的地图,我想自定义颜色条。
零值应该是灰色的。
介于 0.1 和 2.5 之间的值应为白色。
介于 2.5 和 6 之间的任何值都应该是彩色的(例如喷射色条或其他东西)。
到目前为止,我已经尝试了下面的代码,该代码有效,但理想情况下我希望彩色位比块色更具有渐变性。
pcolor(log10(hu'));
shading interp;
caxis([0 6]);
map = [0 0 0
0.9 0.9 0.9
0.9 0.9 0.9
0.9 0.9 0.9
0 0 0.3
0 0 0.6
0 0 0.9];
colormap(map);
感谢任何建议!
谢谢
如果你想要相同的颜色图,只是更平滑:
hsv=rgb2hsv(map);
map=interp1(linspace(0,1,size(map,1)),hsv,linspace(0,1,desired_colormap_size));
map=hsv2rgb(map);
请注意,这可能会导致一些奇怪的颜色跳跃,因为 H 是一个循环值 (360==0),interp1
没有考虑到这一点。这取决于你的颜色。
您可以根据要分隔的不同间隔的比例来构建自定义颜色图。
对于您的示例,数据由 [0 6] 域绑定,您可以选择一个简单的 60 种颜色(=60 行)颜色图。
- 第一行(映射到值
0
)设置为灰色
- 第 1 行到第 25 行(映射从 0.1 到 2.5 的值)应该是白色的
- 第 26 行到第 60 行(将值从 2.6 映射到 6.0)应该是渐变色图
当然,如果你想提高分辨率,你可以将这些行数乘以一个系数,只要遵守行数的比例即可。
为了在代码中看到它,我首先需要创建一些示例数据(你没有提供最小的工作示例!!):
%% Sample data
camax = 6 ;
Z = peaks(50) ;
% normalise Z so the data are bound within [0 6]
zmax = max(max(Z)) ; zmin = min(min(Z)) ; zspan = zmax-zmin ;
Zn = ((Z-zmin)./zspan ) * camax ;
% plot
hp=pcolor(Zn);
shading interp;
hb = colorbar ;
这会在左边生成下图。
现在创建并应用您的自定义颜色图:
%% Build and apply colormap
granularity_factor = 1 ; % increase that for higher resolution
levels = [0 0.1 2.5 6] ; % Your different levels
dl = diff(levels) ; % The "span" of each interval between level = [0.1, 2.4, 3.5]
color0 = [.7 .7 .7] ; % Grey
color1 = [1 1 1] ; % White
% Number of lines in the colormap for each interval
nlines = round( dl * 10 * granularity_factor ) ; % = [1, 24, 35] lines for each interval
% Now build the colormap
cmap = [
repmat( color0 , nlines(1) ,1 ) ; ... % 1 line of this color
repmat( color1 , nlines(2) ,1 ) ; ... % 24 lines of this color
parula( nlines(3) ) ... % 35 lines of "parula" colormap
] ;
colormap(cmap) % Apply it
hb.Ticks = [0.1 2.5:0.5:6] ; % Adjust ticks on colorbar (optional)
这将在右边产生下图。
正如我所说,如果您需要更精细的颜色图,请增加 granularity_factor
。
编辑:我早该知道这已经在这里了。您可以看到一个 almost duplicate/similar 问题,它的答案使用我刚刚描述的相同技术:
我有一张用 pcolor 显示潮汐混合锋的地图,我想自定义颜色条。
零值应该是灰色的。 介于 0.1 和 2.5 之间的值应为白色。 介于 2.5 和 6 之间的任何值都应该是彩色的(例如喷射色条或其他东西)。
到目前为止,我已经尝试了下面的代码,该代码有效,但理想情况下我希望彩色位比块色更具有渐变性。
pcolor(log10(hu'));
shading interp;
caxis([0 6]);
map = [0 0 0
0.9 0.9 0.9
0.9 0.9 0.9
0.9 0.9 0.9
0 0 0.3
0 0 0.6
0 0 0.9];
colormap(map);
感谢任何建议! 谢谢
如果你想要相同的颜色图,只是更平滑:
hsv=rgb2hsv(map);
map=interp1(linspace(0,1,size(map,1)),hsv,linspace(0,1,desired_colormap_size));
map=hsv2rgb(map);
请注意,这可能会导致一些奇怪的颜色跳跃,因为 H 是一个循环值 (360==0),interp1
没有考虑到这一点。这取决于你的颜色。
您可以根据要分隔的不同间隔的比例来构建自定义颜色图。
对于您的示例,数据由 [0 6] 域绑定,您可以选择一个简单的 60 种颜色(=60 行)颜色图。
- 第一行(映射到值
0
)设置为灰色 - 第 1 行到第 25 行(映射从 0.1 到 2.5 的值)应该是白色的
- 第 26 行到第 60 行(将值从 2.6 映射到 6.0)应该是渐变色图
当然,如果你想提高分辨率,你可以将这些行数乘以一个系数,只要遵守行数的比例即可。
为了在代码中看到它,我首先需要创建一些示例数据(你没有提供最小的工作示例!!):
%% Sample data
camax = 6 ;
Z = peaks(50) ;
% normalise Z so the data are bound within [0 6]
zmax = max(max(Z)) ; zmin = min(min(Z)) ; zspan = zmax-zmin ;
Zn = ((Z-zmin)./zspan ) * camax ;
% plot
hp=pcolor(Zn);
shading interp;
hb = colorbar ;
这会在左边生成下图。
现在创建并应用您的自定义颜色图:
%% Build and apply colormap
granularity_factor = 1 ; % increase that for higher resolution
levels = [0 0.1 2.5 6] ; % Your different levels
dl = diff(levels) ; % The "span" of each interval between level = [0.1, 2.4, 3.5]
color0 = [.7 .7 .7] ; % Grey
color1 = [1 1 1] ; % White
% Number of lines in the colormap for each interval
nlines = round( dl * 10 * granularity_factor ) ; % = [1, 24, 35] lines for each interval
% Now build the colormap
cmap = [
repmat( color0 , nlines(1) ,1 ) ; ... % 1 line of this color
repmat( color1 , nlines(2) ,1 ) ; ... % 24 lines of this color
parula( nlines(3) ) ... % 35 lines of "parula" colormap
] ;
colormap(cmap) % Apply it
hb.Ticks = [0.1 2.5:0.5:6] ; % Adjust ticks on colorbar (optional)
这将在右边产生下图。
正如我所说,如果您需要更精细的颜色图,请增加 granularity_factor
。
编辑:我早该知道这已经在这里了。您可以看到一个 almost duplicate/similar 问题,它的答案使用我刚刚描述的相同技术: