通过示例对比Python和NCL,感受两种语言的区别。
NCL语言大概是从2018年开始,陪伴我走过了一年的时间,也帮助我发表了自己的第一篇文章。后来由于自己需要实现的算法过于复杂,自己无力编写,在朋友的诱惑下不得不转投Python,靠网上各路大神的帖子东拼西凑满足自己的科研需求。说卸磨杀驴也有点不合适,但在适应了Python之后,我确实基本没有再打开过NCL了。最近整理文件,找到了自己发表第一篇学术垃圾时候的NCL脚本,心血来潮的想再用Python实现一遍。也算是对评论里很多读者的一个回应吧(貌似气象家园帖子下边第一个评论就是希望我写一个两者对比的文章,被我鸽到现在,咕咕咕)。注:编程水平仅限于能跑就行,warning不管,冗杂语句请忽视。
示例1(EOF)
选择EOF的原因是图片内容较为丰富,同时方法较为常用
由于原始数据过大,只提供处理好的数据方便测试(数据为每年的寒潮路径的概率密度分布,为39年×90纬度×360经度,由FLEXPART模式追踪后通过高斯核密度估计算法Gaussian KDE得到。
测试数据和代码如下:
1 准备工作
NCL:在引入一些特殊函数(NCL本体不具备的函数)时,通常会加上类似于以下语句:
1 | load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" |
Python:引入各个模块(库):
1 | import xarray as xr |
2 数据读取
NCL:
1 | f=addfile("out.nc","r");读取文件 |
Python:利用Xarray库读取NC文件
1 | f = xr.open_dataset("out.nc" ) |
3 EOF
NCL:
1 | eof=eofunc_Wrap(dot,3,False) |
Python:利用EOF库
1 | solver = Eof(dot) |
4.1 绘图:建立画布
NCL的有些绘图参数并不是必要的,由于年代久远,我记不清起每条语句对应的详细功能了。
NCL:
1 | wks=gsn_open_wks("pdf","tmp") |
Python:
1 | fig = plt.figure(figsize=(15,15)) |
4.2 绘图:绘制EOF
NCL:其绘图思路是每一条语句指定一个绘图效果,通过不断的”叠BUFF“实现全部要素的叠加,先将共同要素叠给res,然后通过res1=res, res2=res赋值后,再对res1和res2分别添加各自的属性。
1 | res@mpMaxLatF=90;设置经纬度边界 |
Python:与NCL相似的地方在于需要对每个axes添加参数,不同的地方在于其一条指令可以包含多个效果(比如将所有设置填色绘图的参数全部加在f_ax1.contourf里)。
1 | proj = ccrs.PlateCarree(central_longitude=80) #投影 |
4.3 绘图:绘制PC
NCL:
1 | respc@gsnYRefLine=0 |
Python:
1 | f_ax3 = fig.add_axes([0.45, 0.44, 0.3, 0.156])#绘制PC1 |
5 收尾工作
NCL:将各个子图组合起来,并整体添加色标。由于NCL在一开始建立画布时就指定了输出文件和格式,因此这里不再需要。
1 | resp=True |
Python:图形输出。
1 | #plt.show() |
6 小节
就个人感觉而言,Python语言还是会更简洁,思路更清晰一些,尤其是在指定各个绘图参数的时候。由于这个示例并不涉及复杂数据处理部分,因此没有很好的体现python的优势。但是就图形本身而言,NCL毕竟作为专业的绘图工具还是有优势的,当然从审美的角度来看各花入个眼,看个人风格喜好吧。本来想的是可以将代码块分成两个纵列,逐条对比,但是首先MD编辑器不允许代码块分列,其次两种语言的差异也没办法逐条对比,最终只能妥协成现在这样。后边有时间的话会继续补充一些其它的示例,从数据处理等其它方面继续对比一下两种语言的差异。