爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索

[经验总结] Python读取nc数据和绘图

  [复制链接]

新浪微博达人勋

发表于 2020-3-23 19:36:27 | 显示全部楼层
学习学习,多谢分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-3-24 09:57:04 | 显示全部楼层
如果嫌风场箭头过于密集了要怎么设置?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-3-28 09:47:06 | 显示全部楼层
小白一个,已经下载pyproj和basemap两个包了,读取shp文件报错,是不是还需要安装什么
  File "C:\Users\qxt-4\Anaconda3\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 2134, in readshapefile
    raise IOError('cannot locate %s.shp'%shapefile)
OSError: cannot locate D:\Program Files\python_workspace\ncep_download\.shp

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-3-30 08:36:01 | 显示全部楼层
呼啦啦 发表于 2020-3-28 09:47
小白一个,已经下载pyproj和basemap两个包了,读取shp文件报错,是不是还需要安装什么
  File "C:%users\q ...

shp的文件如果是中文,比较麻烦。建议改成英文,删除奇奇怪怪的符号。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-4 17:36:13 | 显示全部楼层
平流层的萝卜 发表于 2020-3-30 08:36
shp的文件如果是中文,比较麻烦。建议改成英文,删除奇奇怪怪的符号。

您好,我看别的帖子,您有回复x轴为时间纵轴为高度的某一经纬度的剖面图,我想问下怎么画,手里的是FML的再分析资料,三维数据,是否是先转换为四维,然后在画,还是循环呢,有没有代码可以分享一下?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-4-6 17:56:03 | 显示全部楼层
呼啦啦 发表于 2020-4-4 17:36
您好,我看别的帖子,您有回复x轴为时间纵轴为高度的某一经纬度的剖面图,我想问下怎么画,手里的是FML的 ...

您好,其实原理是完全一样的,只不过“欺骗”电脑,让纵坐标Y轴从纬度变成高度。画的时候仍然是二维数据,一个x的坐标和一个Y的坐标,对应一个值。这样就形成了一个二维的场。
我之前写了一个比较长的脚本,部分功能是实现画剖面,贴在这里了:
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import netCDF4 as nc
  4. # from mpl_toolkits.basemap import Basemap
  5. import matplotlib.pyplot as plt
  6. import time2page as tp
  7. import thetase
  8. import matplotlib as mpl

  9. # print "fadsfasdfasd"
  10. # exit()
  11. # filesample=open(r'D:\liaoningrenying\dongbeilengwo\thin_reso_data\data\filenamelist.txt')
  12. # filesample=np.loadtxt(r'h:\liaoningrenying\dongbeilengwo\thin_reso_data\data\filenamelist.txt',dtype='string',skiprows=15)
  13. filesample=np.loadtxt(r'h:\liaoningrenying\dongbeilengwo\thin_reso_data\data\filenamelist_filtered_by_rain_trend_newest.txt',dtype='string',skiprows=4)
  14. ######################下边是filenamelist.txt的内容,复制到此
  15. '''
  16. #注释:第一列为以时间命名的文件名,第二列为这个时刻在这个文件里是第几个时次。默认这个时间是降水开始的时间,但实际上需要更改,可另附一列。
  17. #第三列是6h降水最强、范围最大的时刻,基本都是位于中部;第四列的意义:第二列+第四列的数,即为第三列时间在该nc文件里对应的时次;第五列是6h降水开始在辽宁出现的时刻,紧接着是降水出现在辽宁的哪里
  18. #第七列是降水开始的时间相对于降水最长的时间,向前了几个时次
  19. #06z08jun2011.nc 10 由于没有对应的降水数据,改为00z14may2012.nc 9 12051408
  20. 00z10sep2008.nc 9 08091014 1 08090920 西部 -3
  21. 00z14may2012.nc 9 12051408 0 12051320 西部 -2
  22. 06z19apr2005.nc 10 05041920 1 05041902 西部 -3
  23. 12z04nov2006.nc 11 06110420 0 06110414 西部 -1
  24. 12z07jun2006.nc 11 06060714 -1 06060708 西部 -1
  25. 18z03may2008.nc 12 08050408 1 08050320 西部 -2
  26. 18z18may2006.nc 12 06051714 -6 06051708 西部 -1
  27. '''
  28. # print filesample
  29. # exit()
  30. dirthindata=r'h:\liaoningrenying\dongbeilengwo\thin_reso_data\data\\'
  31. def pingjun(gaokong):
  32.     return np.mean(gaokong,axis=0)
  33. # lagt=-4
  34. for lagt in [-4,-3,-2,-1,0,1,2,3,4]:
  35.     # lagt=-1;
  36.     print lagt
  37.     if lagt==-4:timelag='-24h'
  38.     if lagt==-3:timelag='-18h'
  39.     if lagt==-2:timelag='-12h'
  40.     if lagt==-1:timelag='-06h'
  41.     if lagt==0:timelag='+00h'
  42.     if lagt==1:timelag='+06h'
  43.     if lagt==2:timelag='+12h'
  44.     if lagt==3:timelag='+18h'
  45.     if lagt==4:timelag='+24h'

  46.     z,w,t,d,u,v,r,clwc,ciwc,cc=[],[],[],[],[],[],[],[],[],[]
  47.     vor=[]
  48.     for file_pagenum in filesample:
  49.         filename,page_origin,heavyrain_time,delta_p,delta_p2=file_pagenum[0],file_pagenum[1],file_pagenum[2],file_pagenum[3],file_pagenum[6];
  50.         page=int(page_origin)+int(delta_p)+int(delta_p2)    #这个page是6h降水开始出现的时刻
  51.         # page=int(page_origin)+int(delta_p)      #这个page是6h降水最强的时刻
  52.         page=page-1     ###表示20时发现有降水/降水达到最强,则14时开始降水/降水加强
  53.         page=page-1     ####再减1是因为对应的第1页在list里对应第0个时间维,换算成list数
  54.         page=int(page)+lagt
  55.         # print page,page_origin,delta_p,lagt
  56.         # print filename,page
  57.         ncfile=nc.Dataset(dirthindata+filename,'r')
  58.         z1,w1,t1,d1,u1,v1,r1,clwc1,ciwc1,cc1=ncfile['z'][page,:,:,:],ncfile['w'][page,:,:,:],ncfile['t'][page,:,:,:],ncfile['d'][page,:,:,:],ncfile['u'][page,:,:,:],\
  59.                                             ncfile['v'][page,:,:,:],ncfile['r'][page,:,:,:],ncfile['clwc'][page,:,:,:],ncfile['ciwc'][page,:,:,:],ncfile['cc'][page,:,:,:]

  60.         vor1=ncfile['vo'][page,:,:,:]
  61.         # exit()
  62.         lats,lons,levs=ncfile['latitude'][:],ncfile['longitude'][:],ncfile['level'][:]
  63.         z.append(z1);w.append(w1);t.append(t1);d.append(d1);u.append(u1)
  64.         v.append(v1);r.append(r1);clwc.append(clwc1);ciwc.append(ciwc1)
  65.         cc.append(cc1);vor.append(vor1)
  66.         # print ncfile
  67.         ncfile.close()
  68.     # print lons
  69.     z,w,t,d,u,v,r,clwc,ciwc,cc,vor=map(pingjun,(z,w,t,d,u,v,r,clwc,ciwc,cc,vor)) ####z shape :23 ,201,201
  70.     lon,lat=np.meshgrid(lons,lats)
  71.     qvdivs,qxs,qys,qss=[],[],[],[]
  72.     for i in range(0,23):
  73.         qvdiv_i,qx_i,qy_i,qs_i=thetase.qvdiv((lon,lat,u[i,:,:],v[i,:,:],t[i,:,:],r[i,:,:],levs[i]))
  74.         qvdivs.append(qvdiv_i);qxs.append(qx_i);qys.append(qy_i);qss.append(qs_i)
  75.     qvdivs=np.array(qvdivs);qxs=np.array(qxs);qys=np.array(qys);qss=np.array(qss)
  76.     # print np.array(qvdivs)*1e6
  77.     # exit()
  78. ######do slice cross-section#####
  79.     # plt.figure(figsize=(1,1.2))
  80.     fig,ax=plt.subplots(1,1)
  81.     # plt.rcParams["figure.figsize"] = (10,14)
  82.     # print "do cross-section:\n" \
  83.     #       "First ,latitude=41.5,then longitude=",lon_cross_measure
  84.     # nn=list(lats).index(41.5)
  85.     # def latslice(array):
  86.     #     a=array[:,nn,:]
  87.     #     return a
  88.     # z,w,d,u,v,r,clwc,ciwc=map(latslice,(z,w,d,u,v,r,clwc,ciwc))
  89.     #
  90.     # xx,zz=np.meshgrid(lons,levs)
  91.     # contour=ax.contour(xx,zz,w,colors='k');contour.clabel(fmt='%6.4f',inline_spacing=0,fontsize=7)
  92.     # ax.set_xlim(118,127)
  93.     # plt.show()

  94.     # lon_cross_measure=123
  95.     # nn=list(lons).index(lon_cross_measure)
  96.     # def lonslice(array):
  97.     #     a=array[:,:,nn]
  98.     #     return a
  99.     # #
  100.     # z,w,t,d,u,v,r,clwc,ciwc,cc,vor=map(lonslice,(z,w,t,d,u,v,r,clwc,ciwc,cc,vor))
  101.     # qvdiv,qx,qy,qs=map(lonslice,(qvdivs,qxs,qys,qss))
  102.     # yy,zz=np.meshgrid(lats,levs)

  103.     print clwc
  104.     # exit()
  105.     lat_cross_measure=41
  106.     nn=list(lats).index(lat_cross_measure)
  107.     def latslice(array):
  108.         a=array[:,nn,:]
  109.         return a
  110.     z,w,t,d,u,v,r,clwc,ciwc,cc,vor=map(latslice,(z,w,t,d,u,v,r,clwc,ciwc,cc,vor))
  111.     qvdiv,qx,qy,qs=map(latslice,(qvdivs,qxs,qys,qss))

  112.     yy,zz=np.meshgrid(lons,levs)
  113.     print clwc
  114.     # exit()

  115.     ts,e,ei,ew=thetase.rh_t_p_to_thetase((r,t,zz)) #,norm=mpl.colors.Normalize(vmin=300, vmax=330)
  116.     de=e-ei;ew_ei=ew-ei


  117.     ##### 计算非绝热加热潜热
  118.     Cp=1.005
  119.     L=(2500-2.4*(t-273.15))*1e3
  120.     dqsdp=np.gradient(qs,axis=0)/np.gradient(levs)[:,None]/100
  121.     # print dqsdp
  122.     # exit()
  123.     theta=t*(1000/levs)[:,None]**0.285
  124.     Hcs=-1.0/(Cp*t/theta)*L*w*dqsdp
  125.     # np.savetxt('test_Q.txt',Hcs)
  126.     # exit()
  127.     ##### output binary of ts for grads verifying
  128.     # np.float32((r[::-1,::-1],t[::-1,::-1],v[::-1,::-1],w[::-1,::-1])).tofile('thetase_output_by_python_for_grads_verification.grd')
  129.     # # print type(r[1,1])
  130.     # # print ts.shape
  131.     # print yy,'\n',zz[::-1,1]
  132.     # exit()
  133.     # tshade=ax.contourf(yy,zz,ts,range(295,350,3),cmap=plt.get_cmap('jet'));plt.colorbar(tshade)
  134.     # thetase_contour=ax.contour(yy,zz,ts,range(295,350,5),colors='gray');thetase_contour.clabel(fmt='%3d',inline_spacing=-10,fontsize=14)
  135.     # rcontour=ax.contour(yy,zz,r,range(10,91,10),colors='blue');rcontour.clabel(fmt='%02d',inline_spacing=-5,fontsize=12)
  136.     # deshade=ax.contourf(yy,zz,de,[0,0.1,0.2,0.3,0.4],cmap=plt.get_cmap('coolwarm'));plt.colorbar(deshade)
  137.     decontour=ax.contour(yy,zz,de,[0,0.1,0.2,0.3,0.4],colors='k');decontour.clabel(inline_spacing=-10,fontsize=8)#,[0,0.1,0.2,0.3,0.4]
  138.     # qvdivshade=ax.contourf(yy,zz,qvdiv*1e6,range(-50,21,10),cmap=plt.get_cmap('coolwarm'));colorbar_instance=plt.colorbar(qvdivshade)
  139.     # print colorbar_instance.ColorbarBase
  140.     # exit()
  141.     # vor_contour=ax.contour(yy,zz,vor*1e5,range(-10,11,2),colors='brown');vor_contour.clabel(fmt='%3d')
  142.     # Hcs_shade=ax.contourf(yy,zz,Hcs,range(-300,301,50),cmap='coolwarm',extend='both');#plt.colorbar(Hcs_shade,extendfrac=0.2,orientation='horizontal')
  143.     # Hcs_contour=ax.contour(yy,zz,Hcs);Hcs_contour.clabel()
  144.     clwc_shade=ax.contourf(yy,zz,clwc*1e5,range(3,16,3),cmap=plt.get_cmap('Blues'),extend='both');#plt.colorbar(clwc_shade,extendfrac=0.2,orientation='horizontal')       ####对于clwc
  145.     # ciwc_shade=ax.contourf(yy,zz,ciwc*1e5,range(2,11,2),cmap=plt.get_cmap('Blues'),extend='both');plt.colorbar(ciwc_shade,extendfrac=0.2)    ####对于ciwc
  146.     # clwc_contour=ax.contour(yy,zz,clwc*1e5,range(0,21,2),colors='green');clwc_contour.clabel(fmt='%4.0f',inline_spacing=-10,fontsize=12)
  147.     # clwc_contour=ax.contour(yy,zz,ciwc*1e5,range(2,11,2),colors='k');clwc_contour.clabel(fmt='%4.0f',inline_spacing=-10,fontsize=12)
  148.     # quiver=ax.quiver(yy[:,::4],zz[:,::4],(u[:,::4]),-w[:,::4]*100,color='k',headwidth=3,headlength=4,width=0.002)
  149.     tscontour=ax.contour(yy,zz,t-273.15,[-15,-7,-4,0],colors='r');tscontour.clabel(fmt='%d$^\circ$C',inline_spacing=-5,fontsize=12)
  150.     # tscontour=ax.contour(yy,zz,t,[273.15],colors='r');tscontour.clabel(fmt='%6.2f',inline_spacing=-10,fontsize=12)
  151.     # decontour=ax.contour(yy,zz,de*100,range(0,51,5),colors='k');decontour.clabel(fmt='%2d' ,inline_spacing=-10,fontsize=8) #,(0,0.5,1.0,1.5)
  152.     # decontour=ax.contour(yy,zz,de,[0],colors='gray');decontour.clabel(inline_spacing=-10,fontsize=8) #,(0,0.5,1.0,1.5) np.arange(0,0.1,0.01)
  153.     vor[vor<0]=np.nan;v0contour=ax.contour(yy,zz,v*vor,[0],colors='brown',linewidths=4)

  154.     # qvdivcontour=ax.contour(yy,zz,qvdiv*1e5,(-4,-3,-2,-1),colors='darkgreen',linewidths=1,linestyles='-');qvdivcontour.clabel(fmt='%3d' ,inline_spacing=-5,fontsize=8)
  155.     # cc_contour=ax.contour(yy,zz,cc,np.arange(0.1,1.1,0.2),colors='k');cc_contour.clabel(fmt='%3.1f',inline_spacing=-5,fontsize=12)
  156.     # wcontour=ax.contour(yy,zz,w,np.arange(-1.0,1.1,0.2),colors='brown');wcontour.clabel(fmt='%5.1f',inline_spacing=-10,fontsize=12)
  157.     zcontour=ax.contour(yy,zz,z/9.8,(500,1000,2000,3000,4300,5500,6500),colors='orange',linestyles='--');zcontour.clabel(fmt='%4d',inline_spacing=0,fontsize=8)
  158.     # ciwc_contour=ax.contour(yy,zz,ciwc*1e5,range(0,10),colors='purple');ciwc_contour.clabel(fmt='%4.0f',inline_spacing=-10,fontsize=12)
  159.     # print np.shape(-w*100)
  160.     # it=2
  161.     # stream=ax.streamplot(yy,zz,v,-100.0*w,density=2)

  162.     # stream=plt.streamplot(yy,zz,v,100*w,density=2)
  163.      #ax.set_ylim(500,1000)
  164.     # plt.xticks(range(30,56,5),[str(x)+u'°N' for x in range(30,56,5)],fontsize=13)
  165.     plt.xticks(range(110,131,5),[str(x)+u'°E' for x in range(110,131,5)],fontsize=13);ax.set_xlim(110,130)
  166.     plt.yticks((1000,925,900,850,800,700,600,500,400,300,200),fontsize=13)
  167.     # plt.xlabel('Latitude',fontsize=15);plt.ylabel('Level',fontsize=15)
  168.     # ax.set_xlim(38,44);#ax.set_ylim(200,1000)
  169.     ax.set_ylim(300,1000)
  170.     plt.gca().invert_yaxis()    #######把y坐标轴反转
  171.     # plt.gca().invert_xaxis()
  172.     plt.grid(True)

  173.     # plt.title(u'Thetase cross-section plot along 123°E \n'+timelag,fontsize=18)
  174.     # plt.savefig(r'H:\liaoningrenying\dongbeilengwo\\'+str(lat_cross_measure)+r'_cross_CLWC\\'+timelag+u'假相当位温_垂直环流_液水冰水含量_剖线'+str(lat_cross_measure)+'.png')
  175.     plt.savefig(r'H:\liaoningrenying\dongbeilengwo\\'+str(lat_cross_measure)+r'_cross_CLWC\\'+timelag+u'假相当位温_垂直环流_液水冰水含量_剖线'+str(lat_cross_measure)+'.png')
  176.     # plt.savefig(r'H:\liaoningrenying\dongbeilengwo\\'+str(lat_cross_measure)+r'_cross_CLWC\\'+timelag+u'假相当位温_垂直环流_CLWC_e-ei_剖线'+str(lat_cross_measure)+'.png')
  177.     # plt.savefig(r'H:\liaoningrenying\dongbeilengwo\\'+str(lon_cross_measure)+r'_cross_CLWC\\'+timelag+u'假相当位温_垂直环流_液水冰水含量_剖线'+str(lon_cross_measure)+'.png',dpi=600)

  178.     # print r'H:\liaoningrenying\dongbeilengwo\\'+str(lon_cross_measure)+r'_cross\\'+timelag+u'假相当位温_垂直环流_液水冰水含量_剖线'+str(lon_cross_measure)+'.png'

  179.     # plt.savefig(r'H:\liaoningrenying\dongbeilengwo\\'+str(lat_cross_measure)+r'_cross_Q\\'+timelag+u'_Q_垂直环流_液水冰水含量_剖线'+str(lat_cross_measure)+'.png')

  180.     # plt.show()
  181.     plt.close()
  182.     # break
复制代码


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-7 09:06:54 | 显示全部楼层
平流层的萝卜 发表于 2020-4-6 17:56
您好,其实原理是完全一样的,只不过“欺骗”电脑,让纵坐标Y轴从纬度变成高度。画的时候仍然是二维数据 ...

好的,谢谢,我看看。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-9 08:25:09 来自手机 | 显示全部楼层
感谢分享,学习了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-10 11:34:49 | 显示全部楼层
赞一个吧 好样的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-4-13 19:52:00 | 显示全部楼层

我也要学,谢谢分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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