MATLAB | MATLAB海洋、气象数据colormap配色补充包(NCL color tables)
nclCM
众所周知,海洋、气象、水文等一系列学科绘制图像时,因很多时候涉及要将陆地海洋分开或者应对一些非常特殊的情况,因此有很多非常特别的colormap,我之前虽然做过一些常用colormap的补充包但是依旧是无法完全应对各种特殊的colormap,
而NCL(The NCAR Command Language)是一种专门为科学数据处理以及数据可视化设计的高级语言,很适合用在气象数据的处理和可视化上。该语言内置了一系列非常适合气象数据的colormap,于是我将其也做出了一个MATLAB colormap补充包!!
前言及所作工作
先说明如果不适用该补充包如何获取颜色数据,颜色数据是从官网:
- https://www.ncl.ucar.edu/Document/Graphics/color_tables.shtml
获取的,该网址将内置colormap按照颜色特点做出了33个分类(例如:左侧白色,彩虹色,海洋山脉色,偏蓝色,偏绿色):
若是随便点开一个颜色就能进入该颜色展示界面:
之后点击新界面的.rgb
链接就可以下载文件:
文件是.rgb
格式,其实可以直接改为.txt
进行读取,但是下载的颜色数据非常乱,有的需要删掉注释,有的是0-255范围有的是0-1范围:
而且每次都要去下载太麻烦了,于是我直接用MATLAB写了个p虫,先把txt格式都pa了下来:
function getNCL
% @author: slandarer
main_forder_name='NCL_RGB';
main_website_path='https://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml#SVG';
if ~exist(main_forder_name,'dir')
mkdir(main_forder_name);
end
% 获取每一个面板位置
main_content=webread(main_website_path);
class_sep=[regexpi(main_content,'<a name='),length(main_content)];
className{length(class_sep)-1}='';
colorName{length(class_sep)-1}={''};
for i=1:length(class_sep)-1
class_content=main_content(class_sep(i):class_sep(i+1));
% 获取各类名称
class_begin=10;
class_end=regexpi(class_content,'></a>');
class_name=class_content(class_begin:class_end(1)-2);
className{i}=class_name;
class_forder_name=['NCL_RGB\',class_name];
if ~exist(class_forder_name,'dir')
mkdir(class_forder_name);
end
% 获取每个示意图名称
img_begin=regexpi(class_content,'Images/');
img_end=regexpi(class_content,'_labelbar');
% 循环获取颜色
tColorNameCell={};
disp(' ')
for j=1:length(img_begin)
color_name=class_content(img_begin(j)+7:img_end(j)-1);
tColorNameCell{j}=color_name;
color_website_path=['https://www.ncl.ucar.edu/Document/Graphics/ColorTables/Files/',color_name,'.rgb'];
disp(['正在获取','Class(',num2str(i),')[',class_name,']->Color(',num2str(j),')[',color_name,']'])
websave([class_forder_name,'\',color_name,'.txt'],color_website_path);
end
colorName{i}=tColorNameCell;
end
% save nclCM_Name.mat className colorName
end
之后经过一系列整合,终于有了此补充包。
颜色展示
使用方法
不指定获取颜色个数会默认返回长度为图示每个colormap左下角颜色数的颜色,每种colormap和一个右上角序号相对应。
举例获取[190]号cmocean_curl颜色,只输入一个参数返回的颜色长度就为256,以下两种写法等价:
- nclCM(‘cmocean_curl’)
- nclCM(190)
第二个参数可以指定获取颜色数量,例如获取30个颜色:
- nclCM(‘cmocean_curl’,30)
- nclCM(190,30)
将获取的颜色放入colormap
函数或者某些图像的CData
即可,例如:
- colormap(nclCM(‘cmocean_curl’))
需要注意的是,为了更好的分类,有一两个颜色在不同类别多次出现,因此更推荐使用序号调用。
使用实例
demo1 随机生成曲面
使用cmocean_curl配色,200个颜色:
% demo1
X=linspace(0,1,200)';
CL=(-cos(X*2*pi)+1).^.2;
r=(X-.5)'.^2+(X-.5).^2;
surf(X,X',abs(ifftn(exp(7i*rand(200))./r.^.9)).*(CL*CL')*30,'EdgeColor','none')
% 67 458 190
colormap(nclCM('cmocean_curl',200))
light
material dull
view(59.1823,56.1559)
% 修饰一下
ax=gca;
ax.Projection='perspective';
ax.LineWidth=.8;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.ZMinorTick='on';
ax.GridLineStyle=':';
ax.FontName='Cambria';
当然第一个参数也可以换成序号190或者其他序号:
demo2 大地水准面高度
此demo需要mapping toolbox
,不过在这只是为了展示换colormap,其他工具箱例如m_map
也差不多类似的操作:
% demo2
% 需要mapping toolbox
% 大地水准面高度数导入
load geoid60c.mat
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
ax=worldmap(latlim,lonlim);
geoshow(ax,geoid60c,geoid60cR,'DisplayType','surface')
% 205 190 215
colormap(nclCM(215,20))
% colormap(nclCM(335,100))
colorbar
demo3 全球大地水准面高度
% demo3
% 需要mapping toolbox
[N,R] = egm96geoid;
axesm eckert4
Z=zeros(R.RasterSize);
geoshow(N,R,'DisplayType','surface','CData',N,'ZData',Z)
framem;gridm
% 215 190 150
% colormap(nclCM(215,20))
colormap(nclCM(150,20))
cb=colorbar('southoutside');
cb.Label.String = 'EGM96 Geoid Height in Meters';
geoshow('landareas.shp','FaceColor',[.5,.5,.5])
demo4 高程数据
% demo4
% 需要mapping toolbox
[Z,R]=readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');
key.GTModelTypeGeoKey = 2;
key.GTRasterTypeGeoKey = 2;
key.GeographicTypeGeoKey = 4326;
filename='southboulder.tif';
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)
usamap([39 40],[-106 -105])
g=geoshow(filename,'DisplayType','mesh');
% 190 300 363
colormap(nclCM(15,200))
demo5 曲线赋色
% demo5
t=linspace(0,5*pi,200);
% 116 190 402 162
C=nclCM(15,50);
ax=gca;hold on
for i=1:50
plot(t,sin(t)+i.*.1,'Color',C(i,:),'LineWidth',2);
end
% 坐标区域修饰
ax.YLim=[0,5];
ax.XLim=[0,5*pi];
ax.YTick=0:.5:5;
ax.XTick=0:1:15;
% ax.XGrid='on';
ax.YGrid='on';
ax.GridLineStyle='-.';
ax.LineWidth=1.2;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.Box='on';
ax.FontName='Cambria';
ax.FontWeight='bold';
ax.FontSize=12;
另
可将该文件夹添加到搜索路径,这样任何地方都可以调用此函数:
完
接近五百组数据整理起来真真真真的巨累,希望大家该点赞的点赞
,该在看的在看!!
未经允许本代码请勿作商业用途,引用的话可以引用我file exchange上的链接,可使用如下格式:
Zhaoxu Liu / slandarer (2022). ncl colormaps (https://www.mathworks.com/matlabcentral/fileexchange/120848-ncl-colormaps), MATLAB Central File Exchange. 检索来源 2022/11/19.
若转载请保留以上file exchange链接及本文链接!!!!!
完整数据及实例
【nclCM 487 colormaps】
更新时会跟进更新以下连接:
【链接】:https://pan.baidu.com/s/1s7WTRsQfUahufk6hVUuFRA?pwd=slan
【提取码】:slan
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)