python-awips/examples/notebooks/NEXRAD_Level_3_Plot_with_Matplotlib.ipynb

163 lines
80 KiB
Text
Raw Normal View History

2016-03-15 20:27:25 -05:00
{
"cells": [
2016-04-20 19:05:36 -05:00
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# NEXRAD Level 3 Plot with Matplotlib"
]
},
2016-03-15 20:27:25 -05:00
{
"cell_type": "code",
2016-04-20 19:05:36 -05:00
"execution_count": 5,
2016-03-15 20:27:25 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2016-04-20 19:05:36 -05:00
"using time 2016-04-11 23:02:22\n",
2016-03-15 20:27:25 -05:00
"buffer by 60\n",
2016-04-20 19:05:36 -05:00
"using range (Apr 11 16 23:01:22 , Apr 11 16 23:03:22 )\n",
"found 94 2016-04-11 23:02:22\n",
"found 99 2016-04-11 23:02:22\n"
2016-03-15 20:27:25 -05:00
]
},
{
"data": {
2016-04-20 19:05:36 -05:00
"image/png": "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\nmE7fmCKOCI4ZACDNIhw
2016-03-15 20:27:25 -05:00
"text/plain": [
2016-04-20 19:05:36 -05:00
"<matplotlib.figure.Figure at 0x7f076b37d650>"
2016-03-15 20:27:25 -05:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2016-04-20 19:05:36 -05:00
"%matplotlib inline\n",
2016-03-15 20:27:25 -05:00
"from awips.dataaccess import DataAccessLayer\n",
"from awips import ThriftClient, RadarCommon\n",
"\n",
"from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange\n",
"from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.radar.request import GetRadarDataRecordRequest\n",
"\n",
"from datetime import datetime\n",
"from datetime import timedelta\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from numpy import ma\n",
"\n",
"# use metpy for color table\n",
"from metpy.plots import ctables\n",
"\n",
"# Set EDEX server and radar site\n",
2016-04-20 19:05:36 -05:00
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
2016-03-15 20:27:25 -05:00
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"radar\")\n",
2016-04-20 19:05:36 -05:00
"request.setLocationNames(\"klzk\")\n",
2016-03-15 20:27:25 -05:00
"\n",
"datatimes = DataAccessLayer.getAvailableTimes(request)\n",
"\n",
"# Get last available time\n",
"timerange = datatimes[-1].validPeriod\n",
"dateTimeStr = str(datatimes[-1])\n",
"\n",
"# Buffer length in seconds\n",
"buffer = 60\n",
"dateTime = datetime.strptime(dateTimeStr, \"%Y-%m-%d %H:%M:%S\")\n",
"beginRange = dateTime - timedelta(0, buffer)\n",
"endRange = dateTime + timedelta(0, buffer)\n",
"timerange = TimeRange(beginRange, endRange)\n",
"\n",
"print \"using time\",dateTimeStr\n",
"print \"buffer by\",buffer\n",
"print \"using range\",timerange\n",
"\n",
"client = ThriftClient.ThriftClient(edex)\n",
"request = GetRadarDataRecordRequest()\n",
"request.setRadarId(site)\n",
"request.setPrimaryElevationAngle(\"0.5\")\n",
"request.setTimeRange(timerange)\n",
"\n",
"fig, axes = plt.subplots(1, 2, figsize=(15, 8))\n",
"for v, ctable, ax in zip((94, 99), ('NWSReflectivity', 'NWSVelocity'), axes):\n",
" request.setProductCode(v)\n",
" response = client.sendRequest(request)\n",
" if response.getData():\n",
" for record in response.getData():\n",
" idra = record.getHdf5Data()\n",
" rdat,azdat,depVals,threshVals = RadarCommon.get_hdf5_data(idra)\n",
" dim = rdat.getDimension()\n",
" yLen,xLen = rdat.getSizes()\n",
" array = rdat.getByteData()\n",
" \n",
" # get data for azimuth angles if we have them.\n",
" if azdat :\n",
" azVals = azdat.getFloatData()\n",
" az = np.array(RadarCommon.encode_radial(azVals))\n",
" dattyp = RadarCommon.get_data_type(azdat)\n",
" az = np.append(az,az[-1])\n",
" \n",
" print \"found\",v,record.getDataTime()\n",
"\n",
" header = RadarCommon.get_header(record, format, xLen, yLen, azdat, \"description\")\n",
" rng = np.linspace(0, xLen, xLen + 1)\n",
" xlocs = rng * np.sin(np.deg2rad(az[:, np.newaxis]))\n",
" ylocs = rng * np.cos(np.deg2rad(az[:, np.newaxis]))\n",
" multiArray = np.reshape(array, (-1, xLen))\n",
" data = ma.array(multiArray)\n",
" data[data==0] = ma.masked\n",
"\n",
" # Plot the data\n",
" norm, cmap = ctables.registry.get_with_steps(ctable, 16, 16)\n",
" ax.pcolormesh(xlocs, ylocs, data, norm=norm, cmap=cmap)\n",
" ax.set_aspect('equal', 'datalim')\n",
" \n",
" multp = 100*(2*xLen/460)\n",
" ax.set_xlim(-multp,multp)\n",
" ax.set_ylim(-multp,multp)\n",
" # This is setting x/ylim on gate/pixel and not km\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
2016-04-20 19:05:36 -05:00
"source": []
2016-03-15 20:27:25 -05:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}