from IPython.core.display import HTML HTML('') import numpy import matplotlib.pyplot as plt import datetime as dt import iris import iris.plot as iplt import cartopy.crs as ccrs def time_near(cube,start): timevar=cube.coord('time') itime = timevar.nearest_neighbour_index(timevar.units.date2num(start)) return timevar.points[itime] def myplot(slice,model=None): # make the plot figure(figsize=(12,8)) lat=slice.coord(axis='Y').points lon=slice.coord(axis='X').points time=slice.coord('time')[0] subplot(111,aspect=(1.0/cos(mean(lat)*pi/180.0))) pcolormesh(lon,lat,masked_invalid(slice.data)); colorbar() grid() date_str=time.units.num2date(time.points) plt.title('%s: %s: %s' % (model,slice.long_name,date_str)); # DAP URL: 30 year East Coast wave hindcast (Wave Watch 3 driven by CFSR Winds) #cubes = iris.load('http://geoport.whoi.edu/thredds/dodsC/fmrc/NCEP/ww3/cfsr/4m/best'); # 4 arc minute resolution cubes = iris.load('http://geoport.whoi.edu/thredds/dodsC/fmrc/NCEP/ww3/cfsr/10m/best'); # 10 arc minute resolution print cubes hsig=cubes[0] # use contraints to select geographic subset and nearest time mytime=dt.datetime(1991,10,31,12) #specified time... Nov 1, 1991 was the "Perfect Storm" #mytime=dt.datetime.utcnow() # .... or now slice=hsig.extract(iris.Constraint(time=time_near(hsig,mytime), longitude=lambda cell: -71.5 < cell < -64.0, latitude=lambda cell: 40.0 < cell < 46.0)) print slice print[coord.name() for coord in slice.coords()] figure(figsize=(12,8)) # set the projection ax1 = plt.axes(projection=ccrs.Mercator()) # color filled contour plot h = iplt.contourf(slice,64) # add coastlines, colorbar and title plt.gca().coastlines(resolution='10m') colorbar(h,orientation='vertical'); title('WaveWatch 3 significant wave height driven by CFSR winds'); # first add a Geographic Coord system (required by GRIB2 writer) # here we add a spherical earth with specified radius slice.coord(axis='X').coord_system=iris.coord_systems.GeogCS(654321) slice.coord(axis='Y').coord_system=iris.coord_systems.GeogCS(654321) # add a forecast_period (required by GRIB2 writer) slice.add_aux_coord(iris.coords.DimCoord(0, standard_name='forecast_period', units='hours')) # add a vertical coordinate (required by GRIB2 writer) slice.add_aux_coord(iris.coords.DimCoord(0, "height", units="m")) # GRIB2 stores data in long values. Do we have huge values that would create problems? slice.data.max() # ah, we have NaNs. This causes problems for GRIB2 writer # So convert to masked-array instead. slice.data=ma.masked_invalid(slice.data) # Finally... save slice as grib2 iris.save(slice,'hsig.grib2')