NCL真·入门笔记

7月20日留所实习,老师安排师姐给我拷贝了站点资料,让我先熟悉一下站点资料的处理。我之前在学校里做项目用的最多的是MATLAB,也比较熟悉,如果用MATLAB,估计已经做完了,哈哈!然而我感觉以后肯定是要学NCL的,所里师兄师姐用NCL居多,我干脆趁这个机会学习一下NCL了。


7月20日,师兄师姐帮我安装上了NCL,看起来还挺复杂的,主要是设计Linux的东西,我完全懵逼。这也体现了在所里的优势啊!咯咯咯!然而自己没锻炼到也是不行,惭愧啊!(后来我买了书来看,书上有详细教程,应该自己弄也是可以的吧)听学长学姐说NCL有如下几种使用情况:

1.用Cygwin模拟器,可以在windows上直接跑NCL。不过模拟器10个G对我的XPS来说忒大了!果断放弃

2.使用Xshell和Xftp来挂在大型机上跑!这个不错!然而我没有大型机账户,很尴尬!

3.学姐最后用windows10自带的Ubantu给我安排上了!哈哈!

不管是哪种方法,都最好需要用到sublime text3能够给高亮,方便写脚本(不过还学要加载NCL Package)


然后我就开始苦逼的NCL学习之旅了。先看看语法啥的,看了一晚上,感觉还好,虽然有些还是不懂,但是基本语法能掌握了,我感觉和MATLAB很大的不同在于,NCL有很多属性要设置,画图的时候要设置的东西一堆(实际画图的代码,全默认的画就两三行)而且!插值和画图是分开的,插值需要先单独做,可以选各种插值,然后才能画等值线啥的图。这和MATLAB又很不同了,MATLAB画图代码里自带了插值方法在语句里。

这里记录一下,我感觉挺有用的网站:http://bbs.06climate.com/forum.php?mod=viewthread&tid=42991.十分钟入门NCL系列,我就喜欢这种简单粗暴的,哈哈!此外我还借了学姐的书来看,我感觉书更有用一些!

懂了一些NCL的基础语法之后,我就开始读txt文件,读站点数据,画图了,遇到一堆问题,一点都不懂NCL的我,都不知道要/mnt/c/users/desktop/,我不知道要/mnt/结果卡了好久,还好大胆地问了同办公室一个不认识的学姐才明白了,卡了好久,突然完成的时候贼开心!

然后贴一下,我抄书上的代码,跑了一个散点图,我感觉可以按这个散点图来画我现在要的站点资料图。代码如下:

;准备把站点标出来,还不太会,看书上的例子照做。
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"

begin

    npts=100;
    lat = random_uniform(15., 50., npts)
    lon = random_uniform(60., 140., npts)
    R=random_uniform(-1.2, 35., npts);在指定经纬度里随机投点,点的大小也随机
    arr = (/0.,5.,10.,15.,20.,23.,26./);把不同水平分为7个节点、8个水平范围
    colors = (/10,30,38,48,56,66,74,94/);8个水平需要8个颜色来代表
    num_distinct_markers=dimsizes(arr)+1;共有8个不同颜色
    lat_new = new((/num_distinct_markers,dimsizes(R)/),float,-999);用来存放不同水平的点的经纬度
    lon_new = new((/num_distinct_markers,dimsizes(R)/),float,-999);
    labels = new(dimsizes(arr)+1,string);最后出现在图下方的标签
    do i =0,num_distinct_markers-1
        if(i.eq.0);第一个水平即低于0的水平
            indexes=ind(R.lt.arr(0))
            labels(i)="x<"+arr(0)
        end if
        if(i.eq.(num_distinct_markers-1))then;最大的一个水平即为大于26的
            indexes=ind(R.ge.max(arr))
            labels(i)="x>="+max(arr)
        end if
        if(i.gt.0.and.i.lt.(num_distinct_markers-1))then;中间的水平
            indexes=ind(R.ge.arr(i-1).and.R.lt.arr(i))
            labels(i)=arr(i-1)+"<=x<"+arr(i)
        end if
        if(.not.any(ismissing(indexes)))then;如果index里有数,而不全是-999,那么把lat、lon_new的前N个(在这一水平里有N个点)换成这N个点的经纬度。
            npts_range=dimsizes(indexes)
            lat_new(i,0:(npts_range-1))=lat(indexes)
            lon_new(i,0:(npts_range-1))=lon(indexes)
        end if
        delete(indexes)
    end do

    wks=gsn_open_wks("png", "scatter_example")
    gsn_define_colormap(wks, "WhViBlGrYeOrRe");设置绘图空间
    mpres=True
    mpres@gsnFrame=False;这个是先不翻页(书上说的,我也不懂什么是翻页)
    mpres@pmTickMarkDisplayMode="Always";这是打开刻度线
    mpres@mpMinLatF=15.0;最小的纬度范围
    mpres@mpMaxLatF=50.0
    mpres@mpMinLonF=60.0;最小的经度范围
    mpres@mpMaxLonF=140.0
    mpres@tiMainString="Dummy Station data colored and sized according to range of values"
    ;这个是标题
    map=gsn_csm_map(wks,mpres);画图
    gsres=True;接下来设置标识点
    gsres@gsMarkerIndex=16;这个表示标识点的形状,这里的16是圆
    do i=0,num_distinct_markers-1
        if (.not.ismissing(lat_new(i,0))) then
            gsres@gsMarkerColor=colors(i);设置标识点的颜色
            gsres@gsMarkerThicknessF=0.7*(i+1);设置标识点的大小
            gsn_polymarker(wks,map,lon_new(i,:),lat_new(i,:),gsres)
        end if
    end do
    frame(wks);
end

这个代码随机生成了100个点,随机散落在指定经纬度范围里,然后画图,我感觉非常地像我所需要画的那种图!我今天就要按这个画我的站点气温分布图!等做完再发上来。

最后结果应该是这样:(标题可能有点问题,尴尬)

 

猜你喜欢

转载自blog.csdn.net/weixin_42762673/article/details/81153336