将降水数据绘制到matplotlib底图地图上

时间:2019-03-15 19:40:53

标签: python matplotlib-basemap netcdf4

this website的示例具有填充轮廓的图降水量的启发,我想绘制昨天的降水数据并投影到地图上。但是,由于降水量数据的数据格式已更改,因此无法再使用该网站上的示例。

我的方法如下:

  1. 从国家气象局网站下载netCDF4文件
  2. 打开netCDF4-文件并提取相关信息
  3. 使用Basemap创建地图
  4. 将降水数据投影到地图上

我想我的问题是我不了解netCDF4文件格式,特别是元数据,因为有关降水数据的网格原点的信息必须隐藏在其中。

我的代码如下:

from datetime import datetime, timedelta
import netCDF4
import numpy as np
import matplotlib.pyplot as plt
import os.path
import urllib
from mpl_toolkits.basemap import Basemap

# set date for precipitation (1 day ago)
precip_date  = datetime.utcnow() - timedelta(days=1)
precip_fname = 'nws_precip_1day_{0:%Y%m%d}_conus.nc'.format( precip_date )
precip_url   = 'http://water.weather.gov/precip/downloads/{0:%Y/%m/%d}/{1}'.format( precip_date, precip_fname )

# download netCDF4-file if it does not exist already
if not os.path.isfile( precip_fname ):
    urllib.urlretrieve( precip_url, precip_fname )

# read netCDF4 dataset and extract relevant data
precip_dSet = netCDF4.Dataset( precip_fname )
# spatial coordinates
precip_x    = precip_dSet['x'][:]
precip_y    = precip_dSet['y'][:]
# precipitation data (is masked array in netCDF4-dataset)
precip_data = np.ma.getdata( precip_dSet['observation'][:] )
# grid information 
precip_lat0  = precip_dSet[ precip_dSet['observation'].grid_mapping ].latitude_of_projection_origin
precip_lon0  = precip_dSet[ precip_dSet['observation'].grid_mapping ].straight_vertical_longitude_from_pole
precip_latts = precip_dSet[ precip_dSet['observation'].grid_mapping ].standard_parallel
# close netCDF4 dataset
precip_dSet.close()

fig1, ax1 = plt.subplots(1,1, figsize=(9,6) )

# create the map
my_map = Basemap( projection='stere', resolution='l', 
                  width=(precip_x.max()-precip_x.min()), 
                  height=(precip_y.max()-precip_y.min()),
                  lat_0=30,                         # what is the correct value here?
                  lon_0=precip_lon0,
                  lat_ts=precip_latts
                )
# white background
my_map.drawmapboundary( fill_color='white' )
# grey coastlines, country borders, state borders
my_map.drawcoastlines( color='0.1' )
my_map.drawcountries( color='0.5' )
my_map.drawstates( color='0.8' )

# contour plot of precipitation data
# create the grid for the precipitation data
precip_lons, precip_lats = my_map.makegrid( precip_x.shape[0], precip_y.shape[0] )
precip_xx, precip_yy     = my_map( precip_lons, precip_lats ) 
# make the contour plot
cont_precip = my_map.contourf( precip_xx, precip_yy, precip_data )

plt.show()

这是输出的样子(是的,对于最终绘图,必须调整颜色级别):

enter image description here

我知道这是一个非常具体的问题,因此任何建议/提示都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您可以制作剧情,但想要有关添加其他内容的提示吗?

xarray是用于处理netCDF文件的绝佳工具箱。它的工作方式类似于pandas,但适用于netCDF文件,是对'netCDF4'的重大改进:

http://xarray.pydata.org/en/stable/

要指定特定轮廓,可以输入级别:

 cont_precip = my_map.contourf( precip_xx, precip_yy, precip_data,levels=[10,20,30]) # Edit for exact contours needed

如果需要,您可以添加一个颜色栏:

fig1.colorbar(cont_precip,ax=ax1)