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

参考了网上代码: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<"+arr(0)
        end if
        if(i.eq.(num_markers-1))then;最大的一个水平即为大于26的
            indexes=ind(R.ge.max(arr))
            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)+"<=R<"+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_av(indexes)
            lon_new(i,0:(npts_range-1))=lon_av(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=55.0
    mpres@mpMinLonF=72
    mpres@mpMaxLonF=135.0
    mpres@tiMainString="1951 January China average temperature"
    mpres@mpDataBaseVersion = "Ncarg4_1";这一步和下一步必须要,否则加载中国地图的时候会出错(找不到地图库)
    mpres@mpDataSetName="Earth..4";这步加上步再加下面那个China:state和Taiwan就可以画出中国轮廓边界了
    mpres@mpOutlineOn=True
    mpres@mpOutlineSpecifiers=(/"China:states","Taiwan"/);在这个地图库里我们绘制中国和台湾的区域边界,China:state里居然没有台湾!不能忍,要包括进来!
    mpres@mpGeophysicalLineThicknessF=2.0 ;这两行是为了加粗边界和国界线
    mpres@mpNationalLineThicknessF=2.0
    ;我看网上那个最多人转载的那个站点画气温分布等值线图,它用的兰伯特投影,我画了一下,左右纬度不对称,很奇怪,就放弃使用了。
    map=gsn_csm_map(wks,mpres)
    gsres=True
    gsres@gsMarkerIndex=16
    do i=0,num_markers-1
        if (.not.ismissing(lat_new(i,0))) then
            gsres@gsMarkerColor=colors(i)
            gsres@gsMarkerThicknessF=i+1
            gsn_polymarker(wks,map,lon_new(i,:),lat_new(i,:),gsres)
        end if
    end do
    frame(wks);
end

画的是散点分布图,图如下:

 

转载于:https://my.oschina.net/voole/blog/2986287

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NCL(Numerical Control Language)是一种用于可视化和数据处理的程序语言。水凝物粒子时间分布图可以通过NCL实现。 首先,我们需要准备数据,包括水凝物粒子的浓度和时间信息。可以通过观测或模拟得到这些数据。 接下来,我们使用NCL编写程序来水凝物粒子时间分布图。首先,我们需要导入NCL的绘图库,通过以下命令实现: ```ncl load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ``` 然后,我们可以设置绘图的一些属性,如标题、坐标轴标签等: ```ncl res@tiMainString = "水凝物粒子时间分布" res@tiXAxisString = "时间" res@tiYAxisString = "浓度" ``` 接下来,我们可以创建绘图空间,并绘制散点图和连线图来表示水凝物粒子的时间分布。假设我们有两个数组 `time` 和 `concentration` 分别表示时间和浓度,可以使用以下命令来实现: ```ncl plot = gsn_csm_xy(wks) xy = gsn_create_xy(wks, time, concentration) gsn_xy(wks, xy, plot) ; 绘制散点图 gsn_add_polyline(wks, xy, plot) ; 绘制连线图 ``` 最后,我们可以将绘制好的图形保存为图片,并显示在屏幕上: ```ncl draw(plot) frame(wks) ``` 通过以上步骤,我们可以使用NCL出水凝物粒子时间分布图。当然,在实际应用中,我们可以根据需要调整绘图的样式和属性,以满足具体的需求。 ### 回答2: NCL是一种用于观测和研究云、气溶胶和水凝物粒子的仪器。它通过测量粒子的浓度和尺寸分布来揭示大气中微小粒子的变化和演化过程。当我们使用NCL来绘制水凝物粒子的时间分布图时,我们可以从以下几个方面进行讨论: 首先,时间分布图是通过将时间设置为横轴,测量的颗粒浓度或尺寸设置为纵轴来制作的。这可以让我们直观地观察到出现在特定时间段内的水凝物粒子的数量或尺寸变化。 其次,对水凝物粒子的时间分布进行分析可以帮助我们了解不同时间段内云的形成和消散情况。例如,在晴天或阴天之间,我们可以观察到不同的水凝物粒子分布图,从而推断出大气中的云发展情况。 另外,水凝物粒子的时间分布还可以提供关于天气模式和大气环境变化的信息。通过长期的观测,我们可以观察到季节性的变化,例如在夏季和冬季之间的水凝物粒子的数量变化。 最后,通过与其他气象数据(例如温度、湿度等)结合分析,我们可以更好地理解大气中水凝物粒子的形成机制和演化过程。 综上所述,通过绘制NCL的水凝物粒子时间分布图,我们可以从不同角度深入研究和理解大气中微小粒子的变化规律和大气环境变化。这对于气象科学的研究以及天气预报和气候变化研究等方面具有重要的意义。 ### 回答3: 在NCL(Numerical Control Language)绘制水凝物粒子时间分布图时,可以采用以下步骤: 1. 调用相关的NCL库函数,如"Gsn_Contour"或"Gsn_CsmContour"来绘制等值线或色斑图。 2. 准备数据,将水凝物粒子的时间分布数据存储在一个二维数组中。每个数组元素代表一个时间点上的水凝物浓度或数目。 3. 定义绘图区域,包括设置图像大小、标题、坐标轴标签等。 4. 根据需要选择适当的绘图方式,可以使用等值线或色斑图。确定好最小值和最大值以及等值线或色斑的间隔。 5. 使用绘图函数绘制水凝物粒子时间分布图。根据准备好的数据和绘图区域设置,将数据映射到相应的区域,并按照设定的方式进行绘制。 6. 可以添加一些修饰,比如颜色填充、标注等,以增强图像的可读性和美观性。 7. 最后,根据需要保存图像或显示在屏幕上。 需要注意的是,在绘制水凝物粒子时间分布图时,要考虑数据的准确性和可靠性。并且,根据实际情况,可以选择合适的绘图方法和参数,以达到最佳的数据展示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值