In [1]:
%matplotlib inline
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import cartopy
import netCDF4
from pyudl.cdmr import Dataset
from pyudl.tds import TDSCatalog

In [2]:
cat = TDSCatalog('http://thredds-dev.unidata.ucar.edu/thredds/catalog/grib/HRRR/CONUS_3km/wrfprs/latest.xml')
url = cat.datasets.values()[0].accessUrls['CdmRemote']

In [3]:
ds = Dataset(url)
lcc_info = ds.variables['LambertConformal_Projection']
temp = ds.variables['Temperature_isobaric']
x = ds.variables['x'][:] * 1000.
y = ds.variables['y'][:] * 1000.

timeInd = 0
pressureInd = -1
tempData = temp[timeInd, pressureInd]
pressureLevel = ds.variables['isobaric'][-1] / 100.
time = ds.variables['time'][timeInd]
dt = datetime.strptime(ds.variables['time'].units.split()[-1], '%Y-%m-%dT%H:%M:%SZ') + timedelta(hours=time)

In [4]:
globe = cartopy.crs.Globe(semimajor_axis=lcc_info.earth_radius)
lcc = cartopy.crs.LambertConformal(central_latitude=lcc_info.latitude_of_projection_origin,
                                   central_longitude=lcc_info.longitude_of_central_meridian,
                                   secant_latitudes=(lcc_info.standard_parallel, lcc_info.standard_parallel),
                                   globe=globe)

In [5]:
print ds


http://thredds-dev.unidata.ucar.edu/thredds/cdmremote/grib/HRRR/CONUS_3km/wrfprs/HRRR_CONUS_3km_wrfprs_201410311200.grib2/GC
<class 'pyudl.cdmr.reader.Dimension'> name = x, size = 1799
<class 'pyudl.cdmr.reader.Dimension'> name = y, size = 1059
<class 'pyudl.cdmr.reader.Dimension'> name = reftime, size = 1
<class 'pyudl.cdmr.reader.Dimension'> name = time, size = 8
<class 'pyudl.cdmr.reader.Dimension'> name = isobaric, size = 40
<class 'pyudl.cdmr.reader.Variable'>
int32 LambertConformal_Projection()
	grid_mapping_name: lambert_conformal_conic
	latitude_of_projection_origin: 38.5
	longitude_of_central_meridian: 262.5
	standard_parallel: 38.5
	earth_radius: 6367470.0
	_CoordinateTransformType: Projection
	_CoordinateAxisTypes: GeoX GeoY
<class 'pyudl.cdmr.reader.Variable'>
string reftime_ISO(reftime)
	units: ISO8601
shape = 1
<class 'pyudl.cdmr.reader.Variable'>
float32 Absolute_vorticity_isobaric(time, isobaric, y, x)
	long_name: Absolute vorticity @ Isobaric surface
	units: 1/s
	missing_value: nan
	abbreviation: ABSV
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-2-10_L100
	Grib2_Parameter: [ 0  2 10]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Momentum
	Grib2_Parameter_Name: Absolute vorticity
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Cloud_ice_isobaric(time, isobaric, y, x)
	long_name: Cloud ice @ Isobaric surface
	units: kg.m-2
	missing_value: nan
	abbreviation: CICE
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-6-0_L100
	Grib2_Parameter: [0 6 0]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Cloud
	Grib2_Parameter_Name: Cloud ice
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Cloud_mixing_ratio_isobaric(time, isobaric, y, x)
	long_name: Cloud mixing ratio @ Isobaric surface
	units: kg/kg
	missing_value: nan
	abbreviation: CLWMR
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-1-22_L100
	Grib2_Parameter: [ 0  1 22]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Moisture
	Grib2_Parameter_Name: Cloud mixing ratio
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Dewpoint_temperature_isobaric(time, isobaric, y, x)
	long_name: Dewpoint temperature @ Isobaric surface
	units: K
	missing_value: nan
	abbreviation: DPT
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-0-6_L100
	Grib2_Parameter: [0 0 6]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Temperature
	Grib2_Parameter_Name: Dewpoint temperature
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Geopotential_height_isobaric(time, isobaric, y, x)
	long_name: Geopotential height @ Isobaric surface
	units: gpm
	missing_value: nan
	abbreviation: HGT
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-3-5_L100
	Grib2_Parameter: [0 3 5]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Mass
	Grib2_Parameter_Name: Geopotential height
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Graupel_snow_pellets_isobaric(time, isobaric, y, x)
	long_name: Graupel (snow pellets) @ Isobaric surface
	units: kg/kg
	missing_value: nan
	abbreviation: GRLE
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-1-32_L100
	Grib2_Parameter: [ 0  1 32]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Moisture
	Grib2_Parameter_Name: Graupel (snow pellets)
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Rain_mixing_ratio_isobaric(time, isobaric, y, x)
	long_name: Rain mixing ratio @ Isobaric surface
	units: kg/kg
	missing_value: nan
	abbreviation: RWMR
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-1-24_L100
	Grib2_Parameter: [ 0  1 24]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Moisture
	Grib2_Parameter_Name: Rain mixing ratio
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Relative_humidity_isobaric(time, isobaric, y, x)
	long_name: Relative humidity @ Isobaric surface
	units: %
	missing_value: nan
	abbreviation: RH
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-1-1_L100
	Grib2_Parameter: [0 1 1]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Moisture
	Grib2_Parameter_Name: Relative humidity
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Snow_mixing_ratio_isobaric(time, isobaric, y, x)
	long_name: Snow mixing ratio @ Isobaric surface
	units: kg/kg
	missing_value: nan
	abbreviation: SNMR
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-1-25_L100
	Grib2_Parameter: [ 0  1 25]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Moisture
	Grib2_Parameter_Name: Snow mixing ratio
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Specific_humidity_isobaric(time, isobaric, y, x)
	long_name: Specific humidity @ Isobaric surface
	units: kg/kg
	missing_value: nan
	abbreviation: SPFH
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-1-0_L100
	Grib2_Parameter: [0 1 0]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Moisture
	Grib2_Parameter_Name: Specific humidity
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Temperature_isobaric(time, isobaric, y, x)
	long_name: Temperature @ Isobaric surface
	units: K
	missing_value: nan
	abbreviation: TMP
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-0-0_L100
	Grib2_Parameter: [0 0 0]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Temperature
	Grib2_Parameter_Name: Temperature
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 Vertical_velocity_pressure_isobaric(time, isobaric, y, x)
	long_name: Vertical velocity (pressure) @ Isobaric surface
	units: Pa/s
	missing_value: nan
	abbreviation: VVEL
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-2-8_L100
	Grib2_Parameter: [0 2 8]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Momentum
	Grib2_Parameter_Name: Vertical velocity (pressure)
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 u-component_of_wind_isobaric(time, isobaric, y, x)
	long_name: u-component of wind @ Isobaric surface
	units: m/s
	missing_value: nan
	abbreviation: UGRD
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-2-2_L100
	Grib2_Parameter: [0 2 2]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Momentum
	Grib2_Parameter_Name: u-component of wind
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 v-component_of_wind_isobaric(time, isobaric, y, x)
	long_name: v-component of wind @ Isobaric surface
	units: m/s
	missing_value: nan
	abbreviation: VGRD
	grid_mapping: LambertConformal_Projection
	coordinates: time isobaric 
	Grib_Variable_Id: VAR_0-2-3_L100
	Grib2_Parameter: [0 2 3]
	Grib2_Parameter_Discipline: Meteorological products
	Grib2_Parameter_Category: Momentum
	Grib2_Parameter_Name: v-component of wind
	Grib2_Level_Type: Isobaric surface
	Grib2_Generating_Process_Type: Forecast
shape = (8, 40, 1059, 1799)
<class 'pyudl.cdmr.reader.Variable'>
float32 x(x)
	standard_name: projection_x_coordinate
	units: km
	_CoordinateAxisType: GeoX
shape = 1799
<class 'pyudl.cdmr.reader.Variable'>
float32 y(y)
	standard_name: projection_y_coordinate
	units: km
	_CoordinateAxisType: GeoY
shape = 1059
<class 'pyudl.cdmr.reader.Variable'>
float64 reftime(reftime)
	units: Hour since 2014-10-31T12:00:00Z
	standard_name: forecast_reference_time
	long_name: GRIB reference time
	_CoordinateAxisType: RunTime
shape = 1
<class 'pyudl.cdmr.reader.Variable'>
float64 time(time)
	units: Hour since 2014-10-31T12:00:00Z
	standard_name: time
	long_name: GRIB forecast or observation time
	_CoordinateAxisType: Time
shape = 8
<class 'pyudl.cdmr.reader.Variable'>
float32 isobaric(isobaric)
	units: Pa
	long_name: Isobaric surface
	positive: down
	Grib_level_type: 100
	_CoordinateAxisType: Pressure
	_CoordinateZisPositive: down
shape = 40
	Originating_or_generating_Center: The NOAA Forecast Systems Laboratory, Boulder, CO, United States
	Originating_or_generating_Subcenter: 0
	GRIB_table_version: 2,1
	Type_of_generating_process: Forecast
	Analysis_or_forecast_generating_process_identifier_defined_by_originating_centre: High-Resolution Rapid Refresh
	Conventions: CF-1.6
	history: Read using CDM IOSP GribCollection v2
	featureType: GRID
	file_format: GRIB-2
	_CoordSysBuilder: ucar.nc2.dataset.conv.CF1Convention

In [6]:
fig = plt.figure(figsize=(24, 12))
ax = fig.add_subplot(1, 1, 1, projection=lcc)
bounds=(x.min(), x.max(), y.min(), y.max())
ax.coastlines('50m')
im = ax.imshow(tempData, extent=bounds, transform=lcc, interpolation='nearest',
               cmap=plt.get_cmap('coolwarm'), norm=plt.Normalize(243, 303))
ax.gridlines()
ax.set_extent(bounds, lcc)
ax.set_title('%s Temperature at %dmb' % (dt, pressureLevel))
plt.colorbar(im)


Out[6]:
<matplotlib.colorbar.Colorbar instance at 0x7f35b991e248>