NCL官网发布重要通告,他们决定不再更新NCL转而向python发展。

但做出这种选择确实也是有一定道理的,python在地球科学社区中的应用越来越广泛,很多优秀的团队还有大牛基于python开发出了不少地球科学相关的库。得益于这些优秀的库,近些年python在地球科学领域快速发展,并逐渐成为未来的趋势。现在python不但可以替代NCL而且还能提供很多NCL不具备的功能。

NCL to Python

NCL的功能在python中转为了PyNIO和PyNGL这两个库: 1.PyNIO使用了NetCDF的接口用来读写各种类型的数据,包括NetCDF、GRIB、HDF等。 2.PyNGL是一个可视化的库,里面的参数设置和NCL中的很相似。

其实让大家从一门自己熟悉的语言转换到另一门语言的过程是很痛苦的,前期肯定是特别的不习惯,但只要熬过了短暂的过渡期后面很快就能适应过来。不过幸运的是NCL团队很贴心的给出了NCL向Python过渡的指导手册(NCL-to-Python Transition Guide)。熟悉NCL的小伙伴借助官方的文档一定能很快的完成向python的过渡。

Linux配置环境

之前的文章里有详细介绍过如何安装conda,想看详情的请见:。下面简单介绍一下。 非常建议大家下载使用包含python3.x版本的Miniconda3或者是Anaconda3。因为很多团队已经宣布不再对python2.x版本进行更新了,python2.7版本的PyNIO和PyGNL在不久的将来也将停止更新。 以下载最新版Miniconda为例,输入下面命令。

1
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh

接下来是安装miniconda,基本上是一路回车下去。在最后系统提示是否要把环境变量加入到.bashrc中时输入yes即可。

1
bash miniconda.sh

之后需要安PyNIO和PyNGL两个库,输入下面命令。其中pyncl是创建的conda环境名可自行命名,目前一定要在conda-forge后面加上/label/cf201901的标签,由于最新版本有一些问题,现在只有先安装之前老一点的版本,过些日子可能官方会修复这个问题吧。

1
conda create -n pyncl -c conda-forge/label/cf201901 pyngl pynio

切换到pyncl环境下,不然无法使用PyNIO,PyNGL。输入下面的命令后命令行的最前面会出现(pyncl),这就代表你已经进入到刚刚配置好的pyncl环境了。

1
source activate pyncl

检查是否已经安装好PyNIO和PyNGL,如果没有报错说明成功。

1
python -c 'import Nio Ngl'

之后想退出该环境的时候可以输入

1
source deactivate

一个栗子

其实官方文档已经给的很详细了,而且基本都是干货代码,不需要过多解释,所以下面只找一个官方的例子做一些简要的说明。 PyNGL的参数设置跟NCL绘图的指令很像,但确实还是有一些区别。最主要的问题就是PyNGL对数据的适配不如NCL中gsn_csm命令好。比如在NCL中只要原数据信息完整,当使用gsn_csm_contour_map命令画图时,可以自动识别数据经纬度信息,会自动填充左上角的变量名和右上角的单位。而在PyNGL中这些就需要自己设置了,经纬度信息(17-18行),左右上角字符(21-25行)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#data: http://www.ncl.ucar.edu/Document/Manuals/NCL_User_Guide/Data/
import numpy as np
import Ngl,Nio
#-- open file and read variables
f = Nio.open_file("rectilinear_grid_3D.nc", "r")
var = f.variables["t"][0,0,:,:]
lat = f.variables["lat"][:]
lon = f.variables["lon"][:]
wks = Ngl.open_wks("png","plot_TRANS_contour_fill_on_map_py")
#-- resource settings
res = Ngl.Resources()
res.nglFrame = False
res.cnFillOn = True
res.cnFillPalette = "NCL_default"
res.cnLineLabelsOn = False
res.lbOrientation = "horizontal"
res.sfXArray = lon  
res.sfYArray = lat
#-- create the contour plot
plot = Ngl.contour_map(wks,var,res)
#-- write variable long_name and units to the plot
txres = Ngl.Resources()
txres.txFontHeightF = 0.012
Ngl.text_ndc(wks,f.variables["t"].attributes['long_name'],0.14,0.82,txres)
Ngl.text_ndc(wks,f.variables["t"].attributes['units'],0.95,0.82,txres)
#-- advance the frame
Ngl.frame(wks)
Ngl.end()
  • 目前PyNGL绘图没有NCL那么方便,其实PyNIO在数据处理暂时也没有NCL那么强大,像一些求年平均、季节平均之类的函数还没有。因为之前NCAR对python开发的支持力度不够,不过随着NCAR官方转向python,他们一定会不断完善其中的功能,满足用户的需求。

  • 那么目前在nc数据处理方面有没有一些比较成熟的库呢,其实也有的比如iris和xarray,这两个库都很强大,功能比较全,用来处理nc数据也很方便。以后会好好介绍一下,想要了解的小伙伴们不要走开昂。