爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 121126|回复: 114

[经验总结] NCL特定等值线加粗方法总结(附一实用加粗子程序)

  [复制链接]

新浪微博达人勋

发表于 2014-7-16 12:12:09 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 风子 于 2016-3-29 13:00 编辑

© 版权所有 2014-2016, MCS强.  本帖允许转载,但须注明出处并附有原文链接

初版: 16 July, 2014
重格式化版: 29 March, 2016

*******************************************************************************************
          方法一和方法二为官网给出的两种特定等值线加粗方法
          方法三为我个人根据官网信息编写的特定等值线加粗子程序
*******************************************************************************************

经常有人询问NCL中怎么加粗特定的等值线,但是却得不到像GrADS中一样的直接设置,因为没有专门的源属性,那么我们该如何加粗特定的等值线呢?

为此NCL官网给出了两种方法,如下:

#1 Overlay程序 (通常用来叠加不同的图形变量)


  1. res@gsnDraw = False  ; 先不画图层和框架
  2. res@gsnFrame = False
  3. ;; 绘制想要加粗的等值线图层并叠加到原图层
  4. res2 = True  ; 定义源变量2
  5. res2@gsnFrame = False                                       
  6. res2@gsnDraw = False
  7. res2@cnLevelSelectionMode ="ExplicitLevels"  ; 设置等值线线阶选择模式
  8. res2@cnLevels = the_contour_level_of_interest  ; 设置想加粗的等值线值
  9. res2@cnLineThicknessF = thickness  ; 设置加粗的等值线粗细值
  10. res2@cnLineColor = color  ; 设置加粗的等值线颜色
  11. second_plot = gsn_csm_contour(wks, data, res2)   ; 绘制加粗等值线的图层
  12. overlay(plot,second_plot)  ; 叠加图层到原图层
  13. draw(plot)
  14. frame(wks)
复制代码

#2 设定cnLevels和cnLineThicknesses数组
注意以下两个源的区别
cnLineThicknessF     //当单一线粗设定为真时,该源规定所有等值线同样的粗细     
   When cnMonoLineThickness is True, this resource sets a uniformline
   thickness for all contour lines.     
   Default: 1.0
cnLineThicknesses    //当单一线粗设定为否时,该源规定每一条等值线的粗细设定     
   If cnMonoLineThickness  is False, each element of this arrayresource specifies the line
   thickness of a contour line drawn at thecorresponding contour level. If the array is not set
   explicitly, allelements default to the value 1.0.  If the array currently containsfewer elements
   than cnLevelCount , more elements will be addedto the array and set to the default value,
   1.0; existing elements withvalid line thicknesses (greater than 0.0) will not be modified.     
   Default: 1.0 for all elements

相应的我们可以设置如下
  1. res@cnLevelSelectionMode = "ExplicitLevels"
  2. res@cnLevels = (/-5, -3, -2, -1, 0, 1, 2, 3, 5/)
  3. res@cnMonoLineThickness = False
  4. res@cnLineThicknesses = (/1, 1, 3, 1, 1, 1, 1, 1, 1/)
复制代码

#3 调用子程序实现一条语句搞定等值线加粗

附件为指定等值线加粗的子程序,请将其内容黏贴到你的 myfoo.ncl 文件,没有的话请创建myfoo.ncl 文件为个人的函数程序库,通常建议在该文件中编写自己的程序或函数,以后每次编写NCL脚本请同时载入自己的函数库myfoo.ncl
thick_specified_contourF调用介绍

thick_specified_contourF( plot[1]:graphic , thickLevel:float , \\
                          thickValue:float , cnMapOverlay:integer)
参数一:plot   你想加粗等值线所在图形变量(如plot)
参数二:thickLevel   你想加粗的等值线值
参数三:thickValue   你想加粗的等值线的粗细值
参数四:cnMapOverlay  如果您使用gsn_csm_contour_map_overlay,想给第二个等值线系统的
                      某条等值线加粗,请设置该参数值为2.  默认请设置为 -1

重要的事: 该子程序加在plot后,因此必须设置
                      res@gsnDraw = False
                      res@gsnFrame = False

示例用法: thick_specified_contourF( plot , 5860 , 4.0 , -1 )
说明:加粗5860线,设置粗细为4.0
注意:若所选等值线不在cnLevles中,本程序将强制添加所选等值线值,
      同时等值线信息(cnInfo***)将被关掉
例:
  1. begin
  2. ;---读取数据文件
  3.     fil  = addfile("/home/svane/Scripts/NCL_Scripts/hgt.2013.nc","r")
  4.     hgt = short2flt(fil->hgt(0,5,:,:))
  5. ;---打开绘图工作台
  6.     wks = gsn_open_wks("ps","hgt_500")
  7. ;---建立源变量并设定属性
  8.     res = True
  9.     res@gsnDraw = False
  10.     res@gsnFrame = False
  11.     res@cnLevelSelectionMode = "ManualLevels"
  12.     res@cnMinLevelValF = 5000
  13.     res@cnMaxLevelValF = 5900
  14.     res@cnLevelSpacingF = 40
  15.     res@cnLineLabelInterval = 1
  16.     res@mpMinLatF =   0.
  17.     res@mpMaxLatF =  60.
  18.     res@mpMinLonF =  80.
  19.     res@mpMaxLonF = 140.
  20. ;---绘图并加粗特定等值线
  21.     plot = gsn_csm_contour_map_ce(wks,hgt,res)
  22.     thick_specified_contourF(plot,5860,4,-1)
  23. ;---绘制图形变量并将工作台写入文件
  24.     draw(plot)
  25.     frame(wks)
  26. end
复制代码


效果:(上例效果为图一)
加粗1_1.png 加粗二.png 加粗三.png

昨天兰溪指出使用gsn_csm_contour_map_overlay来加粗指定等值线,对一些情况比较适用
  鉴于该方式与方法一并无实质区别,并有一定局限性,这里并不将此列为一种新方法
  具体用法:
  与方法一类似,但将以下两句
  1. second_plot = gsn_csm_contour(wks,data,res2)
  2. overlay(plot,second_plot)
复制代码
  合并为
  1. gsn_csm_contour_map_overlay(wks,data,data,res1,res2)
复制代码


© 版权所有 2016, MCS强. 16 July 2014, 转载请注明出处并附有原文链接

thick_specified_contourF.ncl

2.66 KB, 阅读权限: 10, 下载次数: 427, 下载积分: 金钱 -5

指定等值线加粗子程序

评分

参与人数 9金钱 +63 贡献 +20 收起 理由
转黄为底 + 10 很给力!
某耳朵 + 2 赞一个!
TingTing_Hsu + 3 很给力!
さ兜兜~↘ + 1 太强了
guizi + 5 + 2 牛逼 啊
kongfeng0824 + 10 + 8
婧观气变 + 2 赞一个!
尽头的尽头 + 15 + 5
mofangbao + 15 + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-16 12:34:18 | 显示全部楼层
定,lz是强人
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2014-7-16 13:19:42 | 显示全部楼层
期待楼主继续分享好东西~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-7-16 13:31:01 | 显示全部楼层

过奖了,坛子里强人遍地,我来学习的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-7-16 13:35:00 | 显示全部楼层
mofangbao 发表于 2014-7-16 13:19
期待楼主继续分享好东西~

我比较笨,这个帖子花了两天时间  
下一步想写个总结NCL坐标轴的帖子,现在先收集资料

       感谢,我成小雨了,哈哈
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-16 14:11:46 | 显示全部楼层
风子 发表于 2014-7-16 13:31
过奖了,坛子里强人遍地,我来学习的

其实ncl就是不断的使用,慢慢的总结。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-7-16 14:24:47 | 显示全部楼层
freekiller 发表于 2014-7-16 14:11
其实ncl就是不断的使用,慢慢的总结。

说的好,这东西不能断,断了就生了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-16 16:14:47 | 显示全部楼层
哇,前几天就注意到有这么个帖子,只是打开就出现“已删除”,现在终于出来了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-16 16:17:56 | 显示全部楼层
多谢楼主的分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-16 16:31:11 | 显示全部楼层
好东西{:5_213:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表