不知道你们有没有遇到过这样的甲方or领导or老师or审稿人or Other,每次都会死揪住你的图不放,非说你画的图,没有感觉。。


这感觉,除了你肚子里的蛔虫,神特么也猜不出来你是什么feel啊!
不过话又说回来,虽然这个所谓的“感觉”,非常之主观,非常之任性,非常之不可描述。。但事实上,它也还是有迹可循的!
这个所谓的“迹”,就是习惯,也可称之为路径依赖。
在过去的十多年间,NCL可以算作是称霸气象领域的一个主要绘图软件——哪怕GrADS是你大学时期的必修课,你对它早已十分熟悉,但也会因为NCL图片的清爽怡人而一秒沉沦,毫不犹豫地抛弃晦暗糊涂的GrADS;哪怕你曾经为MATLAB丰富的数学库所吸引,但还是会因为NCL的细腻柔和而放弃MATLAB充满工业感的坚硬风格。
所以,这也就造成了早你十多年入行的甲方or领导or老师or审稿人or Other,他们对于NCL出图风格的习惯和认同。这个时候,你作为一名习惯于用Python的新生代选手,画出来的图片自然是有着Python,尤其是matplotlib风格的图片,自然是会让“老”人们觉得,怪怪的。
但是,现在的NCL,对于新人们来说,真的是过时了。尤其是,NCAR自己都放弃了对NCL的维护和更新,而且NCL的最新版本V6.6.2真的是难用的一腿:它对于环境格外挑剔,你装个跟它不相干的东西,它都会立马死给你看。而且,NCAR说好的要把NCL转为Python库,甚至还列出了明确的时间节点,但是过了这么久,似乎又都没有下文了。
所以现在新学NCL,完全没有意义啊。我们只要用Python画出NCL风格的图片,就可以了嘛。
而想要模仿NCL风格,最简单的就是用NCL自带的色标啦。
要在Python中调用NCL的色标,有两种方法,一个是直接从NCL的colormap中提取出每一个颜色的rgb数值,然后再写入Python中进行绘图。
事实上,这种方法不仅可以用于重现NCL的colormap,也可以用来重现其他任何来源的colormap。
举个例子,某一天,你的甲方看到中央气象台的24小时降水预报产品(http://www.nmc.cn/publish/precipitation/1-day.html)图中的colormap,觉得高端大气上档次,同时也认为自己家的产品也必须跟国家局保持一致,于是要求你按照这个colormap画图。那你该怎么办?
如何用Python画出NCL风格的图片?_Python首先,你需要用Python读取出这几个颜色的rgb值,并把它们写成一个单独的文件,方便以后直接调用,这里将该文件命名为TP_cma.rgb。它的内容就像这样:如何用Python画出NCL风格的图片?_Python_02然后,用这个colormap和相应的区间进行绘图:
   
   
   cmpfile='TP_cma.rgb'
    
    
    cmpdata=np.loadtxt(cmpfile)
    
    
    cmpdata=cmpdata/255.0
    
    
    nlvs = [0,0.1,10,25,50,100,250]
    
    
    fig=plt.figure(figsize=[8,5],dpi=300)
    
    
    plt.contourf(lon,lat,pic_data,levels=nlvs,extend='max',colors=cmpdata, zorder=0)
    
    
    plt.savefig(image_out,dpi=300)
    
    
    plt.close('all')
出图效果大致如下:如何用Python画出NCL风格的图片?_Python_03
还有一种更简单的方法,就是直接调用cmaps包。它的GitHub地址如下:
https://github.com/hhuangwx/cmaps
安装命令如下:
   
   
   pip install cmaps

camps包里面包含了NCL所有的colormap,这些color table的名字详见NCL官网:
http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml#Blue_Purple
这是示例程序:
   
   
   import matplotlib.pyplot as plt
    
    
    import cmaps
    
    
    import numpy as np
    
    
    x = y = np.arange(-3.0, 3.01, 0.05)
    
    
    X, Y = np.meshgrid(x, y)
    
    
    Z1 = plt.mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    
    
    plt.pcolormesh(X,Y,Z1,cmap=cmaps.BlGrYeOrReVi200)
    
    
    plt.colorbar()
    
    
    plt.show()

在我印象中,cmaps库是我一位大气所的师兄写的,刚刚写到这里就去问了一下他,发现并不是。。所以现在我也不知道是谁写的了  如何用Python画出NCL风格的图片?_Python_04
在网上搜了一波,终于在万能的气象家园论坛搜到了出处:

如何用Python画出NCL风格的图片?_Python_05
在这里,我要向“又是那隻猫”大神,还有他文中的沈大神表示深深的感谢!cmaps包帮我们省去了很多重复劳动,而且稳定健壮,非常好用!