python篇:无投影nc文件出图

在meteoinfo中无法进行nc文件中无投影的解析出图,所以改用python实现(在气象家园反馈后清风大神已经更新3版本,可是实现了)
因为python代码并不是专门学习的,所以是各种查询的方法,此处做下笔记,有大神看到不对的地方多多批评指正

import netCDF4 as nc
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.basemap import Basemap
from matplotlib import cm
from datetime import date
from datetime import datetime
from datetime import timedelta
import os

element=''
start='2011-01-01'
end='2011-01-01'
timeType='日'
momthOrSeason='1'
slon='118.5'
elon='126'
slat='38.4'
elat='43.6'
color='yellow,green,red,blue,#8484FF,#008400,#C6C6C6,#00FFFF,#00FF42,#FF8400'
level='10,20,30,40,50,60,70,80,90'
picPath=''

#固定值
wrfoutFolder='E://Pic/wrfout/'
mapPath='E:\\Pic\\map\\'
title='分布图'
arrElementCh=['降水量(mm)','2m相对湿度(%)','2m温度(℃)','10分钟风速(m/s)']
arrElement=['rain','rh2','tc2','ws10']
if timeType!='日':
    start=int(start)
    end=int(end)
    momthOrSeason=int(momthOrSeason)

#根据中文获取对应的字段和标题
for i in range(4):
    if (element in arrElementCh[i]):
        title=arrElementCh[i]
        element=arrElement[i]

#获取时间
fmt = '%Y-%m-%d'
if timeType=='日':
    begin=datetime.strptime(start,fmt)
    end=datetime.strptime(end,fmt)
if timeType=='月':
    begin = date(start,momthOrSeason,1)
    end = date(end,momthOrSeason+1,1)-timedelta(days=1)
if timeType=='年':
    begin = date(start,1,1)
    end = date(end,12,31)
if timeType=='季':
    if monthOrSeason==1:#冬
        begin = date(int(start)-1,12,1)
        end = date(end,2,1)
    if monthOrSeason==2:#春
        begin = date(start,3,1)
        end = date(end,5,31)
    if monthOrSeason==3:#夏
        begin = date(start,6,1)
        enumerated = date(end,8,31)
    if monthOrSeason==4:#秋
        begin = date(start,9,1)
        end = date(end,11,30)

delta=timedelta(days=1)
interval=int((end-begin).days) +1

#获取数据
index=0
data=[]
for i in range(0,interval,1):
    time = begin+delta*i
    name = time.strftime('%Y-%m-%d')
    year=time.strftime('%Y')
    filePath=wrfoutFolder+year+'-WRFOUT/wrfout_d02_'+name+'_00_00_00.nc'
    #判断文件是否存在
    if os.path.exists(filePath):
        fileData = nc.Dataset(filePath,'r')
        dataElement=fileData.variables[element][:].data
        if index==0:
            lon=fileData.variables['lon'][:].data
            lat=fileData.variables['lat'][:].data
        if len(data)==0:
            data=dataElement
        else:
            data = np.append(data,dataElement,axis=0)
        index=index+1

#数据求平均
if element=='rain':
    data=data.sum(axis=0)
else:
    data=data.mean(axis=0)
'''
#测试图例,颜色和值的对应,发现是小于等于
for i in range(81):
    for j in range(87):
        data[i][j]=1.5

print(data)
'''
#数据求最大值、最小值
#color_max = np.max(data)
#color_min = np.min(data)

#设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体,也可以替换为其他字体 ,支持中文显示
plt.rcParams['axes.unicode_minus'] = False


#添加边界线
m = Basemap(llcrnrlon=slon, urcrnrlon=elon, llcrnrlat=slat, urcrnrlat=elat)
#m=Basemap(projection = 'cyl')
m.readshapefile(mapPath+"liaoningcity", "liaoningcity")

#等级第一个值对应的是第一个颜色
#<=0 是 第一个颜色
color=color.split(',')
level=level.split(',')
c = m.contourf(lon,lat,data,levels=level,colors=color,extend='both')
m.colorbar()

parallels = np.arange(0,90,1)
m.drawparallels(parallels,labels=[True,False,False,False],color='none')
meridians = np.arange(100,130,1)
m.drawmeridians(meridians,labels=[False,False,False,True],color='none')

plt.title(title)
plt.savefig(picPath,dpi=200)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 2.7 中,我们可以使用 netCDF4 库来读取 nc 文件,使用 Basemap 库来绘制地图和等值线图,使用 matplotlib 库来绘制填色图和风杆图。 下面是一个简单的示例代码,其中假设 nc 文件中包含了温度和风场数据,我们需要将其绘制在地图上: ```python import netCDF4 from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np # 读取 nc 文件 nc_file = 'data.nc' nc_data = netCDF4.Dataset(nc_file) # 读取温度和风场数据 temp = nc_data.variables['temp'][:] u_wind = nc_data.variables['u_wind'][:] v_wind = nc_data.variables['v_wind'][:] # 读取经纬度和时间信息 lon = nc_data.variables['lon'][:] lat = nc_data.variables['lat'][:] time = nc_data.variables['time'][:] time_units = nc_data.variables['time'].units # 绘制地图和等值线图 m = Basemap(projection='mill', llcrnrlon=lon.min(), llcrnrlat=lat.min(), urcrnrlon=lon.max(), urcrnrlat=lat.max(), resolution='l') lon, lat = np.meshgrid(lon, lat) x, y = m(lon, lat) plt.figure(figsize=(10, 8)) cs = m.contourf(x, y, temp[0, :, :], cmap='coolwarm') m.colorbar(cs) m.drawcoastlines() m.drawcountries() m.drawstates() # 绘制风杆图 skip = (slice(None, None, 3), slice(None, None, 3)) m.barbs(x[skip], y[skip], u_wind[0, skip], v_wind[0, skip], length=5) plt.title('Temperature and Wind on {}'.format(time[0])) plt.show() ``` 在这个示例中,我们首先使用 netCDF4 库读取了 nc 文件中的数据,然后使用 Basemap 库绘制了地图和等值线图,使用 matplotlib 库绘制了填色图和风杆图。需要注意的是,我们需要根据 nc 文件中的经纬度信息来设置地图的范围和投影方式,同时需要根据温度和风场数据的形状来设置等值线图和风杆图的位置和大小。 希望这个示例代码能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆意飞扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值