NCL站点资料画中国区域气温散点图及分布图

您所在的位置:网站首页 dayz左下角坠机点分布图 NCL站点资料画中国区域气温散点图及分布图

NCL站点资料画中国区域气温散点图及分布图

2024-07-11 13:03| 来源: 网络整理| 查看: 265

为什么80%的码农都做不了架构师?>>>   hot3.png

参考了网上代码:http://bbs.06climate.com/forum.php?mod=viewthread&tid=11417 最NCL做站点资料不妨看看这个。代码如下:

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          file_path="/mnt/c/users/hong/desktop/1.txt"     data=asciiread(file_path, (/4216,13/), "float")     station=data(:,0)       ;读入站点号     lat=data(:,1)           ;读入纬度     lon=data(:,2)           ;读入经度     day=data(:,6)           ;由于我选的就是1951年1月的,所以只有日期存在区别。     temp=data(:,7)          ;NCL是从0开始计数,因此第8列索引是7。     temp@_FillValue=32766   ;在数据说明里说了气温的缺测值是32766      ;由于在资料里是整数性,需要对其进行一下转换,其中经纬度要从60进制转为100进制     lat_a=round(lat*0.01,0)+(lat*0.01-round(lat*0.01,3))/60*100     lon_a=round(lon*0.01,0)+(lat*0.01-round(lat*0.01,3))/60*100     temp_a=temp*0.1     temp_av=new(136,"float")     lon_av=new(136,"float")     lat_av=new(136,"float")     do i=0,135         temp_av(i)=dim_avg_n(temp_a(31*i:31*i+30),0)         lon_av(i)=lon_a(31*i)         lat_av(i)=lat_a(31*i)     end do     temp_max=max(temp_av)     temp_min=min(temp_av)     olon=new(64,"float")    ;中国经度范围73°33′E-135°05′E,这里我设置经度70°-140°     olat=new(41,"float")    ;中国纬度范围3°51′N-53°33′N,这里我设置纬度0°-55°     data1=new((/41,64/),"float")     do i=0,63         olon(i)=72.0+i     end do     do l=0,40         olat(l)=l+15     end do     ;要设置经纬度的单位和名称,否则会报错      lon_av!0          = "lon"      lon_av@long_name  = "lon"      lon_av@units      = "degrees-east"      lon_av&lon        = lon_av      lat_av!0          = "lat"      lat_av@long_name  = "lat"      lat_av@units      = "degrees_north"      lat_av&lat        = lat_av      olon!0          = "lon"      olon@long_name  = "lon"      olon@units      = "degrees-east"      olon&lon        = olon      olat!0          = "lat"      olat@long_name  = "lat"      olat@units      = "degrees_north"      olat&lat        = olat      ;进行插值操作     rscan=(/20,10,5/);网上是10 5 3 我这里用这个是为了让每个位置有数字,因为我没设置缺测值     R=obj_anal_ic_deprecated(lon_av,lat_av,temp_av,olon,olat,rscan, False)     ;下面在开工作空间之前,设置了colormap,我直接复制过来了。     cmap = (/                     \             (/ 255./255, 255./255, 255./255 /),    \  ; 0 - White background.             (/ 0./255  , 0./255  , 0./255   /),         \  ; 1 - Black foreground.             (/ 255./255, 0./255  , 0./255   /),        \  ; 2 - Red.             (/ 0./255  , 0./255  , 255./255 /),        \  ; 3 - Blue.             (/ 164./255, 244./255, 131./255 /),      \  ; 4 - Ocean Blue.             (/ 0./255  , 0./255  , 255./255   /),         \  ; 5 - Bar 1          (/ 0./255  , 153./255, 255./255 /),      \  ; 6 - Bar 2             (/ 0./255, 153./255, 153./255 /),        \  ; 7 - Bar 3              (/ 0./255  , 255./255, 0./255  /),       \  ; 8 - Bar 4                (/ 255./255, 255./255  , 102./255 /),        \  ; 9 - Bar 5              (/ 255./255, 153./255  , 102./255   /),        \  ; 10 - Bar 6             (/ 255./255, 0./255  , 255./255   /)        \  ; 11 - Bar 7             /)     wks=gsn_open_wks("png","example_195101")     gsn_define_colormap(wks,cmap)      ;      res=True     res@gsnAddCyclic=False             ;如果设置为真,则循环点被加入数据,如果数据不是循环的,就设置为假就可以。     res@mpDataBaseVersion = "Ncarg4_1";网上的那个代码里没有这句,害我折腾了好久才明白     res@mpDataSetName="Earth..4"       ;中国地图包含在这个叫Earth..4的地图库里     res@mpOutlineOn=True     res@mpOutlineSpecifiers=(/"China:states","Taiwan"/)     res@mpGeophysicalLineThicknessF=2.0 ;这两行是为了加粗边界和国界线     res@mpNationalLineThicknessF=2.0     res@mpMinLatF=15.0     res@mpMaxLatF=55.0     res@mpMinLonF=72     res@mpMaxLonF=135.0     res@mpDataBaseVersion = "Ncarg4_1"     res@mpAreaMaskingOn = True   ;使能填充覆盖     res@mpMaskAreaSpecifiers = (/"China:states","Taiwan"/)     res@mpOceanFillColor=0     res@mpInlandWaterFillColor=0     res@cnFillOn=True;画填充图     res@cnLinesOn=False;不画等值线     res@cnLineLabelsOn=False;不要等值线上的标签     res@cnFillDrawOrder="PreDraw";先画填充     map=gsn_csm_contour_map(wks,R,res) end

画出的是等值线填充图,图如下:

散点分布图代码:

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          file_path="/mnt/c/users/hong/desktop/1.txt"     data=asciiread(file_path, (/4216,13/), "float")     station=data(:,0)       ;读入站点号     lat=data(:,1)           ;读入纬度     lon=data(:,2)           ;读入经度     day=data(:,6)           ;由于我选的就是1951年1月的,所以只有日期存在区别。     temp=data(:,7)          ;NCL是从0开始计数,因此第8列索引是7。     temp@_FillValue=32766   ;在数据说明里说了气温的缺测值是32766      ;由于在资料里是整数性,需要对其进行一下转换,其中经纬度要从60进制转为100进制     lat_a=round(lat*0.01,0)+(lat*0.01-round(lat*0.01,3))/60*100     lon_a=round(lon*0.01,0)+(lat*0.01-round(lat*0.01,3))/60*100     temp_a=temp*0.1     temp_av=new(136,"float")     lon_av=new(136,"float")     lat_av=new(136,"float")     do i=0,135         temp_av(i)=dim_avg_n(temp_a(31*i:31*i+30),0)         lon_av(i)=lon_a(31*i)         lat_av(i)=lat_a(31*i)     end do     R=temp_av     temp_max=max(temp_av)     temp_min=min(temp_av)     itv=(temp_max-temp_min)/5     arr=(/temp_min+itv,temp_min+2*itv,temp_min+3*itv,temp_min+4*itv/);我把所有温度均匀地用4个节点分配为5份     colors = (/10,38,56,66,94/);5个水平需要5个颜色来代表     num_markers=dimsizes(arr)+1;     lat_new = new((/num_markers,dimsizes(R)/),float,-999);     lon_new = new((/num_markers,dimsizes(R)/),float,-999);     labels = new(dimsizes(arr)+1,string);最后出现在图下方的标签     do i =0,num_markers-1         if(i.eq.0);第一个水平即低于0的水平             indexes=ind(R.lt.arr(0))             labels(i)="R="+max(arr)         end if         if(i.gt.0.and.i.lt.(num_markers-1))then;中间的水平             indexes=ind(R.ge.arr(i-1).and.R.lt.arr(i))             labels(i)=arr(i-1)+"


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3