python-awips/examples/notebooks/Plotting_a_Sounding_with_MetPy.ipynb

176 lines
156 KiB
Text
Raw Normal View History

2016-03-15 20:27:25 -05:00
{
"cells": [
{
"cell_type": "code",
2016-04-20 19:05:36 -05:00
"execution_count": 17,
2016-03-15 20:27:25 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
2016-04-20 19:05:36 -05:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"83900.0 1.5\n",
"100000.0 -9999998.0\n",
"92500.0 -9999998.0\n",
"85000.0 -9999998.0\n",
"70000.0 0.5\n",
"50000.0 6.09999990463\n",
"40000.0 3.0\n",
"30000.0 7.69999980927\n",
"25000.0 16.8999996185\n",
"20000.0 7.19999980927\n",
"15000.0 10.1999998093\n",
"10000.0 13.8000001907\n",
"7000.0 9.19999980927\n",
"5000.0 7.69999980927\n",
"3000.0 5.59999990463\n",
"2000.0 6.59999990463\n",
"1000.0 10.8000001907\n",
"700.0 5.09999990463\n",
"500.0 -9999.0\n",
"300.0 -9999.0\n",
"200.0 -9999.0\n",
"100.0 -9999.0\n"
]
},
2016-03-15 20:27:25 -05:00
{
"data": {
2016-04-20 19:05:36 -05:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABD0AAANoCAYAAADDEJGyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XeYVOX5PvD7zO5s32UXll5UEAQL2HuLBaOJQf3GqDEa\nTYwlP000iDEhdrEBFuygKAQVCyAWqsDSOwssLOzC7gLbe5s+c875/bGLg5GyZWaed2buz3XlCkx5\n5+bxLMw8c97naKZpgoiIiIiIiIgo0likAxARERERERERBQObHkREREREREQUkdj0ICIiIiIiIqKI\nxKYHEREREREREUUkNj2IiIiIiIiIKCKx6UFEREREREREEYlNDyIiIiIiIiKKSGx6EBEREREREVFE\nYtODiIiIiIiIiCISmx5EREREREREFJHY9CAiIiIiIiKiiMSmBxERERERERFFJDY9iIiIiIiIiCgi\nselBRERERERERBGJTQ8iIiIiIiIiikhsehARERERERFRRGLTg4iIiIiIiIgiEpseRERERERERBSR\n2PQgIiIiIiIioojEpgcRERERERERRSQ2PYiIiIiIiIgoIrHpQUREREREREQRiU0PIiIiIiIiIopI\nbHoQERERERERUURi04OIiIiIiIiIIhKbHkREREREREQUkdj0ICIiIiIiIqKIxKYHEREREREREUUk\nNj2IiIiIiIiIKCKx6UFEREREREREEYlNDyIiIiIiIiKKSGx6EBEREREREVFEYtODiIiIiIiIiCIS\nmx5EREREREREFJHY9CAiIiIiIiKiiMSmBxERERERERFFJDY9iIiIiIiIiCgiselBRERERERERBGJ\nTQ8iIiIiIiIiikhsehARERERERFRRGLTg4iIiIiIiIgiEpseRERERERERBSR2PQgIiIiIiIioojE\npgcRERERERERRSQ2PYiIiIiIiIgoIrHpQUREREREREQRiU0PIiIiIiIiIopIbHoQERERERERUURi\n04OIiIiIiIiIIhKbHkREREREREQUkdj0ICIiIiIiIqKIxKYHEREREREREUUkNj2IiIiIiIiIKCKx\n6UFEREREREREEYlNDyIiIiIiIiKKSGx6EBEREREREVFEYtODiIiIiIiIiCISmx5EREREREREFJHY\n9CAiIiIiIiISomlataZpQ6VzRCrNNE3pDERERERERERRSdM0E0C2aZpnSmeJRDzTg4iIiIiIiEjO\n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\nELe3EBEpIly2tzQ0lCE
2016-03-15 20:27:25 -05:00
"text/plain": [
2016-04-20 19:05:36 -05:00
"<matplotlib.figure.Figure at 0x7fc3dfc9cc90>"
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",
"\n",
"import matplotlib.tri as mtri\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
"import numpy as np\n",
"\n",
"from metpy.calc import get_wind_components, lcl, dry_lapse, parcel_profile\n",
"from metpy.plots import SkewT, Hodograph\n",
"from metpy.units import units, concatenate\n",
"\n",
"plt.rcParams['figure.figsize'] = (12, 14)\n",
"\n",
"# Set EDEX host\n",
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
"request = DataAccessLayer.newDataRequest()\n",
"\n",
"# Data type bufrua\n",
"request.setDatatype(\"bufrua\")\n",
"# Parameters\n",
"request.setParameters(\"tpMan\",\"tdMan\",\"prMan\",\"htMan\",\"wdMan\",\"wsMan\")\n",
"# Station ID (name doesn't work yet)\n",
"request.setLocationNames(\"72469\")\n",
"datatimes = DataAccessLayer.getAvailableTimes(request)\n",
"\n",
"# Get most recent record\n",
"response = DataAccessLayer.getGeometryData(request,times=datatimes[-1].validPeriod)\n",
"\n",
"# Initialize data arrays\n",
"tpMan,tdMan,prMan,htMan,wdMan,wsMan = [],[],[],[],[],[]\n",
"\n",
"# Build ordered arrays\n",
"for ob in response:\n",
2016-04-20 19:05:36 -05:00
" print float(ob.getString(\"prMan\")), float(ob.getString(\"wsMan\"))\n",
2016-03-15 20:27:25 -05:00
" tpMan.append(float(ob.getString(\"tpMan\")))\n",
" tdMan.append(float(ob.getString(\"tdMan\")))\n",
" prMan.append(float(ob.getString(\"prMan\")))\n",
" htMan.append(float(ob.getString(\"htMan\")))\n",
" wdMan.append(float(ob.getString(\"wdMan\")))\n",
" wsMan.append(float(ob.getString(\"wsMan\")))\n",
"\n",
2016-04-20 19:05:36 -05:00
"# we can use units.* here...\n",
2016-03-15 20:27:25 -05:00
"T = np.array(tpMan)-273.15\n",
"Td = np.array(tdMan)-273.15\n",
"p = np.array(prMan)/100\n",
"height = np.array(htMan)\n",
"direc = np.array(wdMan)\n",
"spd = np.array(wsMan)\n",
"u, v = get_wind_components(spd, np.deg2rad(direc))\n",
"\n",
"p = p * units.mbar\n",
"T = T * units.degC\n",
"Td = Td * units.degC\n",
"spd = spd * units.knot\n",
"direc = direc * units.deg\n",
"\n",
"# Create a skewT plot\n",
"skew = SkewT()\n",
"\n",
"# Plot the data using normal plotting functions, in this case using\n",
"# log scaling in Y, as dictated by the typical meteorological plot\n",
"skew.plot(p, T, 'r')\n",
"skew.plot(p, Td, 'g')\n",
"skew.plot_barbs(p, u, v)\n",
"skew.ax.set_ylim(1000, 100)\n",
"skew.ax.set_xlim(-40, 60)\n",
"\n",
"# Calculate LCL height and plot as black dot\n",
"l = lcl(p[0], T[0], Td[0])\n",
"lcl_temp = dry_lapse(concatenate((p[0], l)), T[0])[-1].to('degC')\n",
"skew.plot(l, lcl_temp, 'ko', markerfacecolor='black')\n",
"\n",
"# Calculate full parcel profile and add to plot as black line\n",
"prof = parcel_profile(p, T[0], Td[0]).to('degC')\n",
"skew.plot(p, prof, 'k', linewidth=2)\n",
"\n",
"# Example of coloring area between profiles\n",
"skew.ax.fill_betweenx(p, T, prof, where=T>=prof, facecolor='blue', alpha=0.4)\n",
"skew.ax.fill_betweenx(p, T, prof, where=T<prof, facecolor='red', alpha=0.4)\n",
"\n",
"# An example of a slanted line at constant T -- in this case the 0 isotherm\n",
"l = skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)\n",
"\n",
"# Draw hodograph\n",
"ax_hod = inset_axes(skew.ax, '40%', '40%', loc=3)\n",
"h = Hodograph(ax_hod, component_range=80.)\n",
"h.add_grid(increment=20)\n",
"h.plot_colormapped(u, v, spd)\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"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
}