- 积分
- 4113
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2021-1-14
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 guoguohh 于 2022-10-18 15:02 编辑
最近在画等值线图叠加风场的矢量图,不仅要把通过显著的地方画出来,还要用不同颜色画出未通过显著性的箭头,从而能够看出区域的环流情况。
论坛里有很多人会遇到显著和不显著风场叠加错位的情况,我一开始也有这种情况发生,在经过下面的调试后,最后得出了叠加不错位的解决方法,仅供参考,有大佬还知道别的什么方法也可以交流交流。
这些经验来自不停的控制变量进行设置、绘制、对比得出。
[size=10.5000pt]1. 等值线图与矢量图叠加时
[size=10.5000pt]若显著性通过的区域面积很大,建议不要用打点的方式表示显著区域,画出的图会很乱,最好利用where函数设置未通过显著性的地方为fillvalue。
[size=10.5000pt]zg_test = where(zgsnr.gt.1. , zg , zg@_FillValue)
[size=10.5000pt];zgsnr是检验是否通过指标的变量,大于1时保留zg的变量,否则设置为fillvalue
[size=10.5000pt];画图以普通的等值线图设置进行绘制就可以
;注意,如果底图设为白色时缺测地方就是白色,选择colorbar时就不要选择包含白色的色板
[size=10.5000pt]2. 矢量图叠加时
[size=10.5000pt]在风场叠加时我主要遇到两个问题:第一我的风场在经度为0度的地方出现空白区域,风场不连续;第二我叠加的风场发生错位。
[size=10.5000pt]1)[size=10.5000pt]对于第一个问题主要是因为我的变量的经度范围是从0开始到357.5°(分辨率为2.5°*2.5°),只需要在引入变量时利用ua =lonFlip(fu->ua(0,{850},:,:))就可以解决,函数简介:lonFlip—Reorders a global rectilinear array about the central longitude coordinate variable.
[size=10.5000pt]2)[size=10.5000pt]第二个问题有两个思路,如果选择用原始风场(灰色)和通过显著性检验的风场(黑色)叠加,这种情况下,只有画小区域时风场不会错位,面积大概是欧亚大陆面积以内不会错位,但是画全球的话不管我怎么设置resource都没有办法解决错位问题(如果有人成功过希望能分享一下解决办法);
[size=10.5000pt]如果选择叠加通过显著性区域和未通过显著性区域的箭头,范围不管怎么取都不会错位,但前提是vcGlyphStyle不能选择"CurlyVector",否则不显著区域会缺失一部分或者叠加错位,具体原因我不太确定,可能绘制曲线箭头还会经过一些ncl内部的运算吧。
如果要叠加等值线图可以先画等值线图,之后把风场叠加到等值线图上就可以,也可以用gsn_csm_vector_scalar_map,注意叠加图不能用gsn_csm_vector_map,而应该是gsn_csm_vector。区域越小,矢量箭头分布的越合理。
- begin
- ;引入变量uv
- fu = addfile("ensmean_subua_sulasia-base.nc", "r")
- ua =lonFlip(fu->ua(0,{500},:,:))
- fv = addfile("ensmean_subva_sulasia-base.nc", "r")
- va =lonFlip(fv->va(0,{500},:,:))
- ;引入判定显著区域的变量
- stdua = addfile("SNR_subua_sulasia-base.nc", "r")
- ua_snr = lonFlip(stdua->ua(0,{500},:,:))
- stdva = addfile("SNR_subva_sulasia-base.nc", "r")
- va_snr = lonFlip(stdva->va(0,{500},:,:))
- ;提取显著和不显著区域的变量
- ;ua_snr大于1或va_snr大于1时保留ua和va的变量,否则设置为fillvalue
- ua_test = where(ua_snr.gt.1.or.va_snr.gt.1.,ua,ua@_FillValue)
- va_test = where(ua_snr.gt.1.or.va_snr.gt.1.,va,va@_FillValue)
- ;ua_snr小于等于1和va_snr小于等于1时保留ua和va的变量,否则设置为fillvalue
- ua_fail = where(ua_snr.le.1.and.va_snr.le.1, ua,ua@_FillValue)
- va_fail = where(ua_snr.le.1.and.va_snr.le.1, va,va@_FillValue)
- copy_VarCoords(ua,ua_test)
- copy_VarCoords(va,va_test)
- copy_VarCoords(ua,ua_fail)
- copy_VarCoords(va,va_fail)
- printMinMax(ua_test,True)
- printMinMax(va_test,True)
- /:用mask也可以,逻辑是一样的
- ua_test= mask(ua,((ua_snr.gt.1.).or.(va_snr.gt.1.)),True) ;
- va_test= mask(va,((ua_snr.gt.1.).or.(va_snr.gt.1.)),True)
- ua_fail = mask(ua,((ua_snr.lt.1.).and.(va_snr.lt.1.)),True) ;
- va_fail = mask(va,((ua_snr.lt.1.).and.(va_snr.lt.1.)),True)
- copy_VarCoords(ua,ua_test)
- copy_VarCoords(va,va_test)
- copy_VarCoords(ua,ua_fail)
- copy_VarCoords(va,va_fail)
- printMinMax(ua_test,0)
- printMinMax(ua_fail,0)
- ;/
- wks = gsn_open_wks("eps","subuv_500_sulasia-base")
- res = True
- res@gsnDraw = False
- res@gsnFrame = False
- res@gsnAddCyclic = True
- res@gsnLeftString =" "
- res@gsnRightString =" "
- res@mpFillOn = True
- res@mpDataSetName = "Earth..4"
- res@mpOutlineOn = True
- res@mpLandFillColor = "white"
- res@tmXTOn =False
- res@tmYROn =False
- res@tmYLLabelFontHeightF =0.02
- res@tmXBLabelFontHeightF =0.02
- res@vcGlyphStyle = "LineArrow" ; turn on curley vectors
- res@vcMonoLineArrowColor = True
- res@vcMinDistanceF = 0.01
- res@vcLineArrowThicknessF = 1.5
- res@vcLineArrowHeadMaxSizeF =0.002
- res@vcLineArrowHeadMinSizeF =0.002
- res@vcRefAnnoOn=True
- res@vcRefAnnoPerimOn = True
- res@vcRefAnnoString1On = True
- res@vcRefMagnitudeF = 2
- res@vcRefAnnoString1 = "2 m/s"
- res@vcRefLengthF = 0.02
- res@vcRefAnnoSide = "top"
- res@vcLineArrowColor = "black"
- base =gsn_csm_vector_map(wks,ua_test,va_test,res)
- res@vcRefAnnoOn=False
- res@vcLineArrowColor = "gray"
- plot =gsn_csm_vector(wks,ua_fail,va_fail,res)
- overlay(base,plot)
- draw(base)
- frame(wks)
- end
复制代码
|
-
全球
-
中国区域,小区域风场分布更好看
评分
-
查看全部评分
|