爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 23441|回复: 33

MeteoInfoLab脚本示例:绘制污染物三维粒子图

[复制链接]

新浪微博达人勋

发表于 2020-5-28 08:33:17 | 显示全部楼层 |阅读模式

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

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

x
Axes3DGL类中包含了 plot_particles 方法来绘制三维粒子图,适合用来绘制污染物浓度三维分布。

绘制沙尘浓度三维分布:

  1. #Set date
  2. sdate = datetime.datetime(2020, 5, 11, 0)

  3. #Set directory
  4. datadir = r'W:\Asia-dust\CMA'
  5. datadir = os.path.join(datadir, sdate.strftime('%Y%m%d'))

  6. #Read data
  7. fn = os.path.join(datadir, 'CUACE-DUST_CMA_{}.nc'.format(sdate.strftime('%Y%m%d%H')))
  8. f = addfile(fn)
  9. st = f.gettime(0)
  10. t = 4
  11. dust = f['CONC_DUST'][t]
  12. levels = dust.dimvalue(0)
  13. #dust[dust<5] = 0
  14. height = meteolib.pressure_to_height_std(levels)
  15. lat = dust.dimvalue(1)
  16. lon = dust.dimvalue(2)

  17. #Relief data
  18. rfn = 'D:/Temp/nc/elev.0.25-deg.nc'
  19. rf = addfile(rfn)
  20. elev = rf['data'][0,'15:65','65:155']
  21. elev[elev<0] = -1
  22. lon1 = elev.dimvalue(1)
  23. lat1 = elev.dimvalue(0)
  24. lon1, lat1 = meshgrid(lon1, lat1)

  25. #Map
  26. lchina = shaperead('cn_province')
  27. clon = lchina.x_coord
  28. clat = lchina.y_coord
  29. calt = zeros(len(clon))
  30. h = interp2d(elev, clon, clat)
  31. calt = calt + h
  32. lworld = shaperead('country')
  33. wlon = lworld.x_coord
  34. wlat = lworld.y_coord
  35. walt = zeros(len(wlon))
  36. h = interp2d(elev, wlon, wlat)
  37. walt = walt + h

  38. #Plot
  39. ax = axes3dgl(bbox=True)
  40. ax.set_elevation(-20)
  41. ax.set_rotation(335)
  42. rlevs = arange(0, 6000, 200)
  43. cols = makecolors(len(rlevs) + 1, cmap='MPL_gist_yarg', alpha=1)
  44. cols[0] = [51,153,255]
  45. ax.plot_surface(lon1, lat1, elev, rlevs, colors=cols, edge=False)
  46. ax.plot(clon, clat, calt, color=[255,153,255])
  47. ax.plot(wlon, wlat, walt, color='b')
  48. #Beijing location
  49. ax.plot([116.39,116.39], [39.91,39.91], [0,12000])
  50. #ax.set_lighting(True, position=[1,1,1,1], mat_specular=[0.5,0.5,0.5,1])
  51. levs = [50,100,200,300,400,500]
  52. #levs = [100,200,300,400,500]
  53. cmap='WhiteBlueGreenYellowRed'
  54. #cmap = 'MPL_Oranges'
  55. pp = ax.plot_particles(lon, lat, height, dust, levs, vmin=20, s=2, \
  56.     cmap=cmap, alpha_min=0.1, alpha_max=0.7, density=1)
  57. colorbar(pp, aspect=30)
  58. xlim(65, 155)
  59. xlabel('Longitude')
  60. ylim(15, 65)
  61. ylabel('Latitude')
  62. zlim(0, 12000)
  63. zlabel('Height (m)')
  64. tt = st + datetime.timedelta(hours=t*3)
  65. title('Dust concentration ug/m3 ({}UTC)'.format(tt.strftime('%Y-%m-%d %H:00')))
  66. #savefig('D:/Temp/test/dust_3d_{}.png'.format(tt.strftime('%Y%m%d%H')), dpi=150)


plot_particles_dust.png

输出沙尘三维浓度随时间变化的gif动画图:

  1. import time

  2. #Set date
  3. sdate = datetime.datetime(2020, 5, 10, 0)

  4. #Set directory
  5. datadir = r'W:\Asia-dust\CMA'
  6. datadir = os.path.join(datadir, sdate.strftime('%Y%m%d'))

  7. #Read data
  8. fn = os.path.join(datadir, 'CUACE-DUST_CMA_{}.nc'.format(sdate.strftime('%Y%m%d%H')))
  9. f = addfile(fn)
  10. st = f.gettime(0)
  11. t = 0
  12. dust = f['CONC_DUST'][t]
  13. levels = dust.dimvalue(0)
  14. #dust[dust<5] = 0
  15. height = meteolib.pressure_to_height_std(levels)
  16. lat = dust.dimvalue(1)
  17. lon = dust.dimvalue(2)

  18. #Relief data
  19. rfn = 'D:/Temp/nc/elev.0.25-deg.nc'
  20. rf = addfile(rfn)
  21. elev = rf['data'][0,'15:65','65:155']
  22. elev[elev<0] = -1
  23. lon1 = elev.dimvalue(1)
  24. lat1 = elev.dimvalue(0)
  25. lon1, lat1 = meshgrid(lon1, lat1)

  26. #Map
  27. lchina = shaperead('cn_province')
  28. clon = lchina.x_coord
  29. clat = lchina.y_coord
  30. calt = zeros(len(clon))
  31. h = interp2d(elev, clon, clat)
  32. calt = calt + h
  33. lworld = shaperead('country')
  34. wlon = lworld.x_coord
  35. wlat = lworld.y_coord
  36. walt = zeros(len(wlon))
  37. h = interp2d(elev, wlon, wlat)
  38. walt = walt + h

  39. #Plot
  40. ax = axes3dgl(bbox=True)
  41. ax.set_elevation(-20)
  42. ax.set_rotation(335)
  43. rlevs = arange(0, 6000, 200)
  44. cols = makecolors(len(rlevs) + 1, cmap='MPL_gist_yarg', alpha=1)
  45. cols[0] = [51,153,255]
  46. ax.plot_surface(lon1, lat1, elev, rlevs, colors=cols, edge=False)
  47. ax.plot(clon, clat, calt, color=[255,153,255])
  48. ax.plot(wlon, wlat, walt, color='b')
  49. #Beijing location
  50. ax.plot([116.39,116.39], [39.91,39.91], [0,12000])
  51. #ax.set_lighting(True, position=[1,1,1,1], mat_specular=[0.5,0.5,0.5,1])
  52. levs = [50,100,150,200,300,400,500,1000]
  53. cmap='WhiteBlueGreenYellowRed'
  54. #cmap = 'MPL_Oranges'

  55. #Loop
  56. giffn = os.path.join(datadir, 'Dust_3d_particles_relief_{}--loop-1.gif'.format(st.strftime('%Y%m%d')))
  57. print giffn
  58. animation = gifanimation(giffn)
  59. tn = f.timenum()
  60. tn = 24
  61. for t in range(1, tn):
  62.     print t
  63.     if t > 1:
  64.         cll()
  65.     dust = f['CONC_DUST'][t]
  66.     pp = ax.plot_particles(lon, lat, height, dust, levs, vmin=20, s=2, \
  67.         cmap=cmap, alpha_min=0.1, alpha_max=0.7, density=1)
  68.     colorbar(pp, newlegend=False, aspect=30)
  69.     xlim(65, 155)
  70.     xlabel('Longitude')
  71.     ylim(15, 65)
  72.     ylabel('Latitude')
  73.     zlim(0, 12000)
  74.     zlabel('Height (m)')
  75.     #zticks(arange(len(levels))[1:], levels[1:])
  76.     tt = f.gettime(t)
  77.     title('Dust concentration ug/m3 ({}UTC)'.format(tt.strftime('%Y-%m-%d %H:00')))
  78.     #Add frame to gif animation
  79.     gifaddframe(animation, width=1024, height=516)

  80. #Finish gif animation
  81. animation.finish()
  82. print 'Finished...'


plot_particles_dust_loop.gif

评分

参与人数 2金钱 +11 收起 理由
数学汤家凤 + 1 赞一个!
wet510 + 10 很给力!

查看全部评分

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

新浪微博达人勋

发表于 2020-6-2 09:16:18 | 显示全部楼层
王老师,您的数据(CUACE-DUST_CMA_2020051000.nc和elev.0.25-deg.nc)在哪里下载的,谢谢
密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-5-28 08:58:29 | 显示全部楼层
{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-5-29 10:03:01 | 显示全部楼层
厉害,好漂亮的图,喜欢了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-6-6 19:29:13 | 显示全部楼层
这图画的太好了!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-18 19:35:00 | 显示全部楼层
开心的玉米超人 发表于 2020-6-2 09:16
王老师,您的数据(CUACE-DUST_CMA_2020051000.nc和elev.0.25-deg.nc)在哪里下载的,谢谢

请问您找到CUACE-DUST_CMA_2020051000.nc和elev.0.25-deg.nc的下载地址了吗?如果找到的话,能分享一下吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-11-4 20:41:47 | 显示全部楼层
图画的好炫酷啊,需要什么数据,才能画出来呢?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-11-9 16:09:17 | 显示全部楼层
所以数据大家有找到吗
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-5 11:07:39 | 显示全部楼层
王老师,没有数据啊,怎么画?提供下数据下载链接啊,要不这个帖子会沉下去的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-17 10:37:47 | 显示全部楼层
王老师,您的数据(CUACE-DUST_CMA_2020051000.nc和elev.0.25-deg.nc)在哪里下载的,谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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