爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 44934|回复: 27

[经验总结] [源代码]python的colormap总结(matplotlib+ncl+气象家园调色盘)

[复制链接]

新浪微博达人勋

发表于 2019-1-16 23:12:20 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 凉茶啦啦啦啦啦 于 2019-12-21 15:37 编辑

colormap又叫colorbar是一个包含三列矩阵的色彩映射表,简单来说就是一个shape为(N,3)的矩阵。
  • 矩阵中的值的值取值范围为[0,1]
  • 每一行代表一个颜色,即RGB值

1.matplotlib colorbar
(a)matplotlib自带的colorbar
python的matplotlib模块中内嵌了大批常用的colormapshttps://matplotlib.org/examples/color/colormaps_reference.html
  1. import matplotlib.pyplot as plt
  2. from mpl_toolkits.basemap import Basemap as mp
  3. import numpy as np
  4. import netCDF4 as nc
  5. #%%
  6. obj=nc.Dataset('E:/tidal mixing/gebco/GEBCO_2014_2D_90.0_5.0_100.0_17.0.nc')
  7. lon=obj.variables['lon'][0:-1:2]
  8. lat=obj.variables['lat'][0:-1:2]
  9. elevation=obj.variables['elevation'][0:-1:2,0:-1:2]
  10. elevation=np.ma.masked_greater_equal(elevation,0)
  11. plt.figure(1,figsize=(8,6))
  12. m=mp(llcrnrlon=90.0,llcrnrlat=5.0,urcrnrlon=100.0,urcrnrlat=17.0,\
  13.          resolution='i',projection='mill')
  14. m.drawcoastlines()
  15. lonlabel=['90','92','94','96','98','100']
  16. lon_num=[90,92,94,96,98,100]
  17. latlabel=['6','8','10','12','14','16']
  18. lat_num=[6,8,10,12,14,16]
  19. lon_num,temp=m(lon_num,np.arange(len(lon_num)))
  20. temp,lat_num=m(np.arange(len(lat_num)),lat_num)
  21. plt.xticks(lon_num,lonlabel,fontsize=20)
  22. plt.yticks(lat_num,latlabel,fontsize=20)
  23. plt.xlabel('Longitude(E)',fontsize=20)
  24. plt.ylabel('Latitude(N)',fontsize=20)
  25. xx,yy=np.meshgrid(lon,lat)
  26. xx,yy=m(xx,yy)
  27. cmap_color=plt.cm.get_cmap('RdYlBu_r')       #_r的意思是反转colorbar
  28. m.pcolormesh(xx,yy,elevation,cmap=cmap_color)
  29. cbar=m.colorbar()
  30. cbar.ax.tick_params(labelsize=20)
复制代码
输出图像:
C5A2E2B4BD104BD0A6FB80E6A8CF7B44.jpg
2.使用ncl的colorbar
是之前在气象家园上看到的一个大神自己写的包cmaps,这个包中基本包含了ncl的所有colorbar。气象家园地址
ncl colormap:
http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml
使用方法很简单,首先导入cmaps包,然后改变cmap就行

  1. import cmaps
  2. ....
  3. cmap_color=cmaps.ncl_default          #如需反转colorbar,其方法是cmap_color=cmap_color.reversed()
复制代码

屏幕截图.jpg


3. 使用气象家园调色盘

这种方法是结合气象家园的调色盘,将平时看文献看到的colorbar为自己所用。

气象家园调色盘下载地址:

http://bbs.06climate.com/forum.php?mod=viewthread&tid=33880&extra=page%3D1


       用链接里的方法克隆完色标之后生成一个txt文件,其文件中包含rgb值,即你将要使用的colormap

屏幕截图2.jpg

之后的工作是在python中导入这个colormap,由于生成的值在[0,255]之间,而python中要用的colormap RGB值范围是[0,1],所以要进行简单转换。
以下将colorbar转换写成一个函数,直接调用即可。
这个函数需要用到matplotlib的colors,因此要提前导入

  1. from matplotlib import colors
  2. def dcmap():
  3.       file_path='E:/python/colorbar/test.txt'
  4.       fid=open(file_path)
  5.       data=fid.readlines()
  6.       n=len(data);
  7.       rgb=np.zeros((n,3))
  8.       for i in np.arange(n):
  9.             rgb[i][0]=data[i].split(',')[0]
  10.             rgb[i][1]=data[i].split(',')[1]
  11.             rgb[i][2]=data[i].split(',')[2]
  12.       rgb=rgb/255.0
  13.       icmap=colors.ListedColormap(rgb,name='my_color')
  14.       return icmap
复制代码
  1. cmap_color=dcmap()
  2. m.pcolormesh(xx,yy,elevation,cmap=cmap_color.reversed())
复制代码

输出图像

屏幕截图3.jpg
以上三点是我常用的三种选择python colorbar的方法,还有一种方法是可以用matplotlib自己定义新的colorbar以及在原有colorbar的基础上修改形成一个新的colorbar的方法,在这里就先不写了,以后有时间再总结吧。希望可以给学习python的朋友有一些帮助,如有不足之处还请多多指教!







评分

参与人数 3金钱 +50 贡献 +12 收起 理由
三岁最可爱 + 10
huangbicheng + 20 + 2 赞一个!
mofangbao + 20 + 10

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-7-5 10:04:17 | 显示全部楼层
感谢分享,那个方法可以精简为以下语句:
def dcmap():
    rgb = np.loadtxt(r''E:\python\colorbar\test.txt'', delimiter=',')
    rgb /= 255.0
    icmap = colors.ListedColormap(rgb, name='my_color')
    return icmap
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2019-1-22 12:05:36 | 显示全部楼层
一个小tips,读入rgb信息并处理的时候,可以使用numpy的类方法loadtxt,十分迅速
直接
import numpy as np
rgb=np.loadtxt('E:/python/colorbar/test.txt',delimiter=',')
rgb/=255.0
这个时候rgb就是一个N x 3的数组了,而且matplotlib可以直接用的色彩数组了
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2022-8-10 16:58:27 | 显示全部楼层
学习了,亲测可以使用Grads-NCL调色盘输出NCL模板的rgb文件,然后读取时跳过前4行,再用matplotlib 自带的LinearSegmentedColormap.from_list转换就可以使用自定义色板啦
        mycolor = np.loadtxt('mycolors.rgb',delimiter=' ',skiprows=4) #加载自定义色板
        rgb_table = LinearSegmentedColormap.from_list('my cmap', mycolor / 255.0)
        c_f = ax.contourf(lons,#lon
                            lats ,#lat
                            vort_adv,
                            np.arange(-9,9,3),#填色范围
                            cmap=rgb_table,#使用自定义色板
                            # cmap=cmaps.BlGrYeOrReVi200,#使用NCL色板
                            extend='both')#设置色条为两头尖
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

0
早起挑战累计收入
发表于 2019-1-17 09:17:12 | 显示全部楼层
调色板1.3版本支持Python语法写扩展,你也可以尝试写一个Python直接可用的输出分享下,而不是使用默认的输出。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-17 09:22:44 | 显示全部楼层
mofangbao 发表于 2019-1-17 09:17
调色板1.3版本支持Python语法写扩展,你也可以尝试写一个Python直接可用的输出分享下,而不是使用默认的输 ...

好的,谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-1-17 12:15:25 | 显示全部楼层
cmaps模块支持自定义rgb文件,利用环境变量导入。最近cmaps模块也进行了更新
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-1-17 14:03:26 | 显示全部楼层
mofangbao 发表于 2019-1-17 09:17
调色板1.3版本支持Python语法写扩展,你也可以尝试写一个Python直接可用的输出分享下,而不是使用默认的输 ...

其实,我是建议,把常用的colormap都做成RGB文件,然后用cmaps模块动态调用就行了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-21 13:13:42 | 显示全部楼层
又是那隻貓 发表于 2019-1-17 12:15
cmaps模块支持自定义rgb文件,利用环境变量导入。最近cmaps模块也进行了更新

好的,非常感谢您的建议!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-1-21 18:42:01 | 显示全部楼层
又是那隻貓 发表于 2019-1-17 14:03
其实,我是建议,把常用的colormap都做成RGB文件,然后用cmaps模块动态调用就行了

这个不错,可以使用自定义的coloar,而不是每次都在脚本写rgb值。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-27 22:38:40 | 显示全部楼层
Masterpiece 发表于 2019-1-22 12:05
一个小tips,读入rgb信息并处理的时候,可以使用numpy的类方法loadtxt,十分迅速
直接
import numpy as n ...

我还用的不是很熟练,非常感谢你的建议!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-2-13 16:59:27 | 显示全部楼层
又是那隻貓 发表于 2019-1-17 14:03
其实,我是建议,把常用的colormap都做成RGB文件,然后用cmaps模块动态调用就行了

Users can define a environmental variable CMAP_DIR pointing to the folder containing the self-defined rgb files.怎么定义环境变量,这步不知怎么走了,希望猫神指导一二
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表