爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2847|回复: 2

求助 画低层数据时遮盖低于地形高度的部分

[复制链接]

新浪微博达人勋

发表于 2019-5-22 14:29:07 | 显示全部楼层 |阅读模式

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

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

x
如题,在画NCEP数据700hpa/850hpa水汽通量散度的时候想抹去小于地形高度的部分。
ncl中有mask函数,grades也听说过。因为MI已经写好代码了所以想用MI试试能不能做到。
我自己想的是最简单的那种,用位势高度减去地形高度,小于0的部分填色成白色。但是在实现的时候发现用contourm可以描绘出轮廓,但是用contourfm填色却不行。可能是我图层设置的问题..?
是不是只能用循环把要遮盖地区的数据写成缺省?或者用grades进行maskout数据?

我对python了解不多,希望各位老师和同学们多多指点!非常感谢!!
以下是代码,感谢王老师的水汽通量散度的程序.
  1. #NCEP 6H 水汽通量散度
  2. print 'Open data files...'
  3. f_Air = addfile('E:/HELLO WORLD/DATA/NCEP/Water Vapor Flux/700hPa 9.3-5 air.nc')
  4. f_Uwnd = addfile('E:/HELLO WORLD/DATA/NCEP/Water Vapor Flux/700hPa 9.3-5 uwind.nc')
  5. f_Vwnd = addfile('E:/HELLO WORLD/DATA/NCEP/Water Vapor Flux/700hPa 9.3-5 vwind.nc')
  6. f_Rhum = addfile('E:/HELLO WORLD/DATA/NCEP/Water Vapor Flux/700hPa 9.3-5 rh.nc')

  7. f_hgt = addfile('E:/HELLO WORLD/DATA/NCEP/Water Vapor Flux/700hPa 9.3-5 hgt.nc') #700hpa位势高度
  8. f_z = addfile('E:/HELLO WORLD/DATA/NCEP/hgt/NECP.hgt.sfc.nc') #地面位势高度

  9. print 'Read data array...'
  10. tidx = 8
  11. t = f_Air.gettime(tidx)
  12. Air = f_Air['air'][tidx,:,:,:]
  13. Uwnd = f_Uwnd['uwnd'][tidx,:,:,:]
  14. Vwnd = f_Vwnd['vwnd'][tidx,:,:,:]
  15. Rhum = f_Rhum['rhum'][tidx,:,:,:]
  16. hgt = f_hgt['hgt'][tidx,:,:,:]
  17. z = f_z['hgt'][:,:,:]

  18. # Calculate
  19. print 'Calculate...'
  20. speed = sqrt(Uwnd*Uwnd+Vwnd*Vwnd) #风场

  21. prs = 700 #level
  22. g = 9.8
  23. es = 6.112*exp(17.67*(Air-273.16)/(Air-29.65)) #饱和水汽压
  24. qs = 0.62197*es/(prs-0.378*es)*1000 #饱和比湿
  25. q = qs*Rhum/100 #比湿
  26. qhdivg = hdivg(q*Uwnd/g,q*Vwnd/g)*100000 #units = 10-5*g/(s•cm2•hPa)

  27. blank = z-hgt

  28. #Plot
  29. print 'Plot...'
  30. proj = projinfo(proj='lcc', lon_0=105, lat_1=25, lat_2=37)
  31. axesm(projinfo=proj, axison=True, gridlabel=True, frameon=True)
  32. mlayer = shaperead('E:/HELLO WORLD/MeteoInfo/map/country.shp')
  33. lsichuan = shaperead('E:/HELLO WORLD/MeteoInfo/map/sichuan.shp')
  34. geoshow(mlayer, edgecolor='black',size=2)
  35. geoshow(lsichuan,edgecolor='black',size=2)

  36. levs1 = [-3,-2.5,-2, -1.5, -1, -0.5,0, 0.5,1,1.5,2,2.5,3]
  37. levs2 = [0,10000]

  38. layer1 = contourfm(qhdivg,levs1, cmap='BlueRed') #水汽通量散度
  39. layer2 = quiverm(Uwnd, Vwnd, speed,size=20,color='black') #风场
  40. layer3 = contourm(blank,levs2,colors='white')#地形遮盖

  41. title('Water Vapor Flux Divergency (' + t.strftime('%Y-%m-%d_%H:%M:%S') + ')',fontsize=20)
  42. colorbar(layer1)
  43. axism([81, 132, 9, 47])
  44. #savefig('E:/HELLO WORLD/results/090500 700hPa WVP Divergency.png')
复制代码
这是出来的图,用layer3 = contoufm(blank,levs2,colors='white')的话就直接不显示了....不明白为什么啊,是因为不能用两个contoufm函数么?

                               
登录/注册后可看大图

问的问题可能非常小白,谢谢大家看帖。

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

新浪微博达人勋

发表于 2019-5-22 23:08:40 | 显示全部楼层
参考下面的代码,只会将 blank 大于10000的等值区画成白色,小于10000的等值区的颜色是完全透明的(不会压盖下面图层的内容)。绘图函数的zorder参数也很重要,一个图中有两个contourfm语句生成的填色图层会互相压盖,blank图层要放在水汽通量散度图层之上。

levs2 = [10000]
cols = [(255,255,255,0), 'w']
layer3 = contourfm(blank, levs2, colors=cols, zorder=2)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-5-23 12:48:48 | 显示全部楼层
MeteoInfo 发表于 2019-5-22 23:08
参考下面的代码,只会将 blank 大于10000的等值区画成白色,小于10000的等值区的颜色是完全透明的(不会压 ...

因为想把blankd大于0的部分填白色,所以我改成了levs2 = [0],然后zorder=2的话会压盖地图边界,所以改成=1。于是问题全部解决了。

谢谢王老师!!!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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