python-awips/examples/notebooks/Grids_and_Cartopy.ipynb

419 lines
503 KiB
Text
Raw Normal View History

2018-09-05 15:52:38 -06:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a name=\"top\"></a>\n",
"<div style=\"width:1000 px\">\n",
"\n",
"<div style=\"float:right; width:98 px; height:98px;\">\n",
"<img src=\"https://docs.unidata.ucar.edu/images/logos/unidata_logo_vertical_150x150.png\" alt=\"Unidata Logo\" style=\"height: 98px;\">\n",
"</div>\n",
"\n",
"# Grids and Cartopy\n",
"**Python-AWIPS Tutorial Notebook**\n",
"\n",
"<div style=\"clear:both\"></div>\n",
"</div>\n",
"\n",
"---\n",
"\n",
"<div style=\"float:right; width:250 px\"><img src=\"../images/[image name]_preview.png\" alt=\"Colorized RAP13 Conus image\" style=\"height: 300px;\"></div>\n",
"\n",
"\n",
"# Objectives\n",
"\n",
"* Create a colorized plot for the continental US of model data (grib).\n",
"* Access the model data from an EDEX server and limit the data returned by using model specific parameters.\n",
"* Use both *pcolormesh* and *contourf* to create colorized plots, and compare the differences between the two.\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Imports\" data-toc-modified-id=\"Imports-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Imports</a></span></li><li><span><a href=\"#Define-Data-Request\" data-toc-modified-id=\"Define-Data-Request-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>Define Data Request</a></span></li><li><span><a href=\"#Limit-Results-Based-on-Time\" data-toc-modified-id=\"Limit-Results-Based-on-Time-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Limit Results Based on Time</a></span></li><li><span><a href=\"#Function:-make_map()\" data-toc-modified-id=\"Function:-make_map()-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>Function: make_map()</a></span></li><li><span><a href=\"#Use-the-Grid-Data!\" data-toc-modified-id=\"Use-the-Grid-Data!-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>Use the Grid Data!</a></span></li><li><span><a href=\"#Plot-Using-pcolormesh\" data-toc-modified-id=\"Plot-Using-pcolormesh-6\"><span class=\"toc-item-num\">6&nbsp;&nbsp;</span>Plot Using pcolormesh</a></span></li><li><span><a href=\"#Plot-Using-contourf\" data-toc-modified-id=\"Plot-Using-contourf-7\"><span class=\"toc-item-num\">7&nbsp;&nbsp;</span>Plot Using contourf</a></span></li><li><span><a href=\"#See-Also\" data-toc-modified-id=\"See-Also-8\"><span class=\"toc-item-num\">8&nbsp;&nbsp;</span>See Also</a></span><ul class=\"toc-item\"><li><span><a href=\"#Related-Notebooks\" data-toc-modified-id=\"Related-Notebooks-8.1\"><span class=\"toc-item-num\">8.1&nbsp;&nbsp;</span>Related Notebooks</a></span></li><li><span><a href=\"#Additional-Documention\" data-toc-modified-id=\"Additional-Documention-8.2\"><span class=\"toc-item-num\">8.2&nbsp;&nbsp;</span>Additional Documention</a></span></li></ul></li></ul></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports\n",
"\n",
"Start by importing both the python-awips specific library, as well as the libraries needed for plotting and manipulating the data"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"import cartopy.crs as ccrs\n",
"import matplotlib.pyplot as plt\n",
"from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\n",
"from scipy.constants import convert_temperature"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define Data Request\n",
2018-09-05 15:52:38 -06:00
"\n",
"If you read through the [python-awips: How to Access Data](https://nbviewer.jupyter.org/github/Unidata/pyaos-ams-2021/blob/master/notebooks/dataAccess/python-awips-HowToAccessData.ipynb) training, you will know that we need to set an EDEX url to access our server, and then we create a data request. In this example we use *grid* as the data type to define our request.\n",
"In addition to setting the data type, the location, parameters and levels are also set as **RAP13**, **T** (for temperature), and **2.0FHAG** (for Fixed Height Above Ground in meters), respectively."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DefaultDataRequest(datatype=grid, identifiers={}, parameters=['T'], levels=[<dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.level.Level.Level object at 0x11127bfd0>], locationNames=['RAP13'], envelope=None)\n"
]
}
],
"source": [
2018-09-06 13:05:37 -06:00
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
2018-09-05 15:52:38 -06:00
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"grid\")\n",
"request.setLocationNames(\"RAP13\")\n",
"request.setParameters(\"T\")\n",
"request.setLevels(\"2.0FHAG\")\n",
"\n",
"# Take a look at our request\n",
"print(request)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Limit Results Based on Time\n",
"\n",
"Models produce many different time variants during their runs, so let's limit the data to the most recent time and forecast run."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"alert-info\">\n",
"<b>Note:</b> You can play around with different times and forecast runs to see the differences.\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of available times: 74\n",
"Number of available forecast runs: 8\n"
]
}
],
"source": [
2018-09-05 15:52:38 -06:00
"cycles = DataAccessLayer.getAvailableTimes(request, True)\n",
"times = DataAccessLayer.getAvailableTimes(request)\n",
"fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)\n",
"\n",
"# Get the most recent grid data\n",
2018-09-05 15:52:38 -06:00
"response = DataAccessLayer.getGridData(request, [fcstRun[0]])\n",
"\n",
"print('Number of available times:', len(times))\n",
"print('Number of available forecast runs:', len(fcstRun))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Function: make_map()\n",
"\n",
"In order to plot more than one image, it's easiest to define common logic in a function. Here, a new function called **make_map** is defined. This function uses the [matplotlib.pyplot package (plt)](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html) to create a figure and axis. The coastlines (continental boundaries) are added, along with lat/lon grids."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
2018-09-05 15:52:38 -06:00
"def make_map(bbox, projection=ccrs.PlateCarree()):\n",
" fig, ax = plt.subplots(figsize=(16, 9),\n",
" subplot_kw=dict(projection=projection))\n",
" ax.set_extent(bbox)\n",
" ax.coastlines(resolution='50m')\n",
" gl = ax.gridlines(draw_labels=True)\n",
" gl.top_labels = gl.right_labels = False\n",
2018-09-05 15:52:38 -06:00
" gl.xformatter = LONGITUDE_FORMATTER\n",
" gl.yformatter = LATITUDE_FORMATTER\n",
" return fig, ax"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Use the Grid Data!\n",
"\n",
"Here we get our grid data object from our previous response, and then get the raw data array off that object. We also get the latitude and longitude arrays, and create a bounding box that we'll use when creating our plots (by calling **make_map** defined above). Finally, we'll convert our data from degrees Kelvin to Farenheit to make the plot more understandable."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"grid = response[0]\n",
"data = grid.getRawData()\n",
"lons, lats = grid.getLatLonCoords()\n",
"bbox = [lons.min(), lons.max(), lats.min(), lats.max()]\n",
"\n",
"# Convert temp from Kelvin to F\n",
"destUnit = 'F'\n",
"data = convert_temperature(data, 'K', destUnit)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot Using pcolormesh\n",
"\n",
"This example shows how to use [matplotlib.pyplot.pcolormesh](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.pcolormesh.html) to create a colorized plot. We use our **make_map** function to create a subplot and then we create a color scale (cs) and colorbar (cbar) with a label for our plot."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"alert-info\">\n",
"<b>Note:</b> You may see a warning appear with a red background, this is okay, and will go away with subsequent runs of the cell.\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/scarter/opt/miniconda3/envs/python3-awips/lib/python3.9/site-packages/cartopy/mpl/geoaxes.py:1598: UserWarning: The input coordinates to pcolormesh are interpreted as cell centers, but are not monotonically increasing or decreasing. This may lead to incorrectly calculated cell edges, in which case, please supply explicit cell edges to pcolormesh.\n",
" X, Y, C, shading = self._pcolorargs('pcolormesh', *args,\n"
]
},
2018-09-05 15:52:38 -06:00
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAokAAAHsCAYAAAC+BjdVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd7wcVfn/3+fMzNbbb3rvDQiBJNTQCb1GiiDwExFBERSQoqKAXwtYUEoUEASCdESKgEhJABEIJBBCQgklvd7k1m1Tzvn9MWV3bxIISSAh7Of1uq+7ZebMmdnZnc98nuf5PEJrTQUVVFBBBRVUUEEFFZRCbukJVFBBBRVUUEEFFVSw9aFCEiuooIIKKqigggoqWAsVklhBBRVUUEEFFVRQwVqokMQKKqigggoqqKCCCtZChSRWUEEFFVRQQQUVVLAWKiSxggoqqKCCCiqooIK1YG7pCawPhxxyiG5qatrS06jgSwDbtonFYlt6GhV8SVA5Xz5/tLe389FHHzFkyBDS6XTZe2+//TaDBg0ilUpt9Pie51EoFMhmsyxbtoyamhq6dOlCKpVCCLGp0y/DxpwvCxYsoLm5mdraWlKpFOl0mnQ6/ZnmtmTJEpYvX46Ukp122umzTvtLB8dxWLhwIe3t7dTW1mJZFg0NDZ/pPMnn89i2TTKZZNmyZWiticfjrFy5ki5dutDS0kJ9fT09e/b83PZjc/6+zJgx4ymt9SGbZbCNhdZ6q/wbO3asrqCCDcHUqVO39BQq+BKhcr58vnjsscd0ly5d9HPPPbfWe6+//rru06eP9jxvs22vublZX3LJJXr06NG6e/fu+qKLLtKzZs3SrutulvE/6/ny2GOP6R133FG3trZu0nZ/9atfaUAfccQRWimltdZ61qxZesqUKfoXv/jFJo+/tWLChAka0Jdddpnu2rWr7tevn77iiiv0wIED9d57763vu+++6HhsKObNm6e/+c1v6uuvv/4zr/tZsTl/X4DX9RbmYlucDK7vr0ISK9hQVC76FXwWVM6XzwfZbFZ///vf13379tX/+9//1rnM0Ucfrf/0pz99bnN499139SWXXKIHDRqk4/G4Hjx4sD7mmGP0vffeu9HE9LOeL7vssou+5557NmpbpXBdVz/77LN6yZIl0Ws77LCDBvS4ceP08ccfr9955x29cOHCz534fJH46KOP9A033KC11vrOO+/UgN5xxx31zJkz9aOPPqpHjBihd955Z33aaafppUuXbuHZro1tjSRWchIrqKCCCirYJLzxxhuMHTuWpqYmZs2axe67777WMqtWrWLatGl85zvf+dzmMXz4cK666io+/PBDWlpa+Ne//sWkSZO45pprmDhxIs3NzZ/btkN069aNqVOn4rruRo+xZMkSbrjhBv73v//xzjvvkM1mAZg+fTrHH3888+bNwzRNjj76aEaNGsX3vvc9vvvd77L//vvTv39/Ro4cSTwe59prr91cu/WFYeDAgZxzzjkAnHLKKcybN4+XX36ZnXbaiSOPPJKZM2eSy+WYMmUKhx12GAsXLtzCM962sdXmJFZQQQUVVLD1Y/LkyVxxxRX86U9/4uSTT15v3l0mk6GqqopkMvmFzCuRSDBixAhGjBjBySefzI9+9CP2339/XnnlFeLx+Oe23bvuuosTTzyRMWPGcPHFF9O3b19GjBjxiXlwnufx5ptvMmPGDHK5HH//+9/p2bMnI0aM4Kc//SlvvvkmsViMQqFAbW0txx57LH/7298QQvDBBx8wdOhQGhsb+dvf/saQIUO48847ueqqq9hhhx0+t/38ojBkyJCy5/F4HMdxSCQSGIZB//79cRwH06zQmc8DlaNaQQUVVFDBRuHBBx/k6quv5rXXXmPAgAGfuGy/fv1IJBI8/fTTTJw48YuZYADDMLjmmms47LDDuOWWWyKl6vNATU0NTzzxBE899RR//vOfaWlpiYp1unfvTlVVFcOHD6dnz548++yzfPjhhyxYsIDu3buz++67U1VVxf7778/PfvYzqqqqAFBK0dbWRiKRIJFIlG1vyJAhvPDCCwwYMIC+ffsCcPjhh/Paa69xyimn8Jvf/IbTTjttsxf0bCncfffdfPDBBwC89dZb/OxnP6sQxM8RlSNbQQUVVLCV4rnnnuOMM87gySefZMSIEZ/LNmzbZuDAgSxdupRRo0bx3//+l/r6erTW3HTTTRx55JH07t07Wv7DDz/kkUce4d5772XlypXcc889n0oQwVfLDj74YG699dbNQhLb2tq46667eP7555k3bx62bXPvvfey3XbbrXc/R44cyT333MPXvvY15s+fT8+ePenduzcPPPAAvXv3Zq+99tosZEoIwSGHHMIhh/iFqYVCgddee43m5mba29uZM2cOb7zxBgcddBA77bQT/fr1o3v37usdT0pJXV3det/fa6+9yp5PmDCBZ555htdee42zzz6bKVOmcNVVVzF+/PhN3rctjWOOOYYbbriBe++9l5kzZ3L88cdv6Slt06iQxAoqqKCCrRQ9evRg/vz5jBw5EoD99tuPr33ta+y6667stNNOGIaxydv45z//ydKlSwGorq5mwIABpNNplFKsWLGC7373u+yxxx7U1dUxb9482traOOKII/jVr37Ffvvt94kqzsKFC/nXv/7Ff/7zH6ZNm8Z2223HH/7wh02eM8DRRx8dhV4vvPBCzjjjDI444gj2228/+vbty7hx4zjiiCMi0nf00Ufz1FNPATB69Gj69evHsmXLWLFiBWPHjqW1tZXa2loefPDBSJHbWCxbtoxhw4bR0dEBwPXXX8/3v//9TdvhjcD48eN59dVXuemmm/ja175G3759eeKJJ6itrf3C57K5UFVVxTnnnMM555zDMcccw+jRoxk0aBAfffQR/fr14+OPP0bKSrnF5kKFJFZQQQUVbKXo0qULpmnieR5aa6ZOncrUqVOj97t37865557LbrvtRrdu3Zg1axa5XI4zzzxzg7cREpldd92VG2+8kYEDB9LU1ITWmscff5yhQ4eSTqdpbW1lwIABbL/99p96EdZa87vf/Y7f/va3HH744ZxwwgncfPPNdOvWbeMORKexH3nkEd566y2WLl0a5Re++OKLvPrqqyxcuJBFixZx3nnnIYTgiCOOAPww5Zo1a+jatWsZScpmsySTSZRSmKZJv379OPPMM/nBD36wXlXy01BbW8tpp53Gxx9/zNFHH80pp5yyyfu9sTBNk3POOYezzjqL73znOxx77LHU1NTwyCOP8PDDD3P00UdvsbltKu6//34++ugjpJQMHz6chQsXcswxx/Dwww9XiOJmQoUkVlBBBRVspejWrRsrVqzgueeeY/bs2XzrW9/Ctm1efvllHnnkER566CEuu+yytdYLK4gPOugg9tlnH/bdd1/GjRsXmfxOnz6dpqYmhg8fTnNzM9XV1UyZMoVhw4YBRCTqBz/4wUbN+/LLL+fRRx/lzTffpGfPnvzvf//j2WefxbIsWltbWbZsGUuXLqVQKPDzn/+c/v37f+qYIUm+4oorWLVqFQ8//HBZAUptbS0HHXRQ9Lyuro6LL76Yf/3rX/Tu3ZtRo0axyy67UFNTUzZuaNZsGAbz5s3joosu4q9//SsjRozYaJKYSqWYPHly2Wue5/Hvf/+bZcuWceihh5aF8L8ImKbJTTfdxLXXXsuDDz4IwDXXXMPvfvc7LMviwAMP5Nxzz13r+GwMLr30Uq6++mq6du1Kr169OPTQQzn11FMZNWoUf/jDH7j++uuZPn36Jt80HHrooTz33HO8//77aK1ZtmwZvXr14tJLL+W3v/3tJu9HBSB8K56tD+PGjdOvv/76lp5GBV8CTJs2jX333XdLT6OCLwm2tfPlm9/8JnfccQcAAwYM4OSTT6atrY0bbrgBgJ49e9LW1kahUGDYsGForVmzZg3Dhw9n/vz5jB07lt/+9rdrVZFuCnbccUc8z6Nv377MnDmTXr16MXz4cBzHoaamhl69etGzZ09mzZqFbdvR/NeFlpYWvv3tb/PEE08wePBgLrzwQk455ZRPLVawbZtHH32UlStXsmjRIt5
2018-09-05 15:52:38 -06:00
"text/plain": [
"<Figure size 1152x648 with 2 Axes>"
2018-09-05 15:52:38 -06:00
]
},
"metadata": {
"needs_background": "light"
},
2018-09-05 15:52:38 -06:00
"output_type": "display_data"
}
],
"source": [
"cmap = plt.get_cmap('rainbow')\n",
"fig, ax = make_map(bbox=bbox)\n",
"cs = ax.pcolormesh(lons, lats, data, cmap=cmap)\n",
"cbar = fig.colorbar(cs, shrink=0.7, orientation='horizontal')\n",
"cbar.set_label(grid.getLocationName() +\" \"+ grid.getLevel() + \" \" \\\n",
" + grid.getParameter() + \" (\" + destUnit + \") \" \\\n",
2018-09-05 15:52:38 -06:00
" + \"valid \" + str(grid.getDataTime().getRefTime()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot Using contourf\n",
"\n",
"This example shows how to use [matplotlib.pyplot.contourf](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.contourf.html) to create a colorized plot. We use our **make_map** function to create a subplot and then we create a color scale (cs2) and colorbar (cbar2) with a label for our plot."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAogAAAHsCAYAAABRxFxrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd5wTdf7/nzPJzCSbZCtLWbp0ECyACmIXFRUVbKeiXz3Ps+vZvdOz3M/z1PO4s3CnZ8eu2MVyioAVUVBEQUWR3pat2ewmmSSf3x+TmZ1MJrtLXcC8Ho997GYy5TPZyXxe83q/36+3JIQgjzzyyCOPPPLII488TMjtPYA88sgjjzzyyCOPPHYs5AliHnnkkUceeeSRRx4ZyBPEPPLII4888sgjjzwykCeIeeSRRx555JFHHnlkIE8Q88gjjzzyyCOPPPLIQJ4g5pFHHnnkkUceeeSRAW97DyAXjjrqKLFx48b2HkYeOwHi8Tiqqrb3MPLYSZC/XrY9wuEwS5cupW/fvgQCgYz3vv32W3bbbTcKCgo2e//JZJJYLEZjYyNr166lsLCQDh06UFBQgCRJWzr8DGzO9bJ8+XJqamooKiqioKCAQCBAIBDYpLGtXr2adevWIcsye+2116YOe6eDruusWLGCcDhMUVERiqJQWlq6SddJNBolHo/j9/tZu3YtQgg0TWPDhg106NCB2tpaSkpK6NKlyzY7j615f5k3b967QoijtsrONgdCiB3yZ/jw4SKPPNqCmTNntvcQ8tiJkL9eti3eeOMN0aFDB/HBBx9kvffll1+Kbt26iWQyudWOV1NTI6677joxbNgw0alTJ3HNNdeIBQsWiEQisVX2v6nXyxtvvCH22GMPUVdXt0XH/etf/yoAceyxx4pUKiWEEGLBggVi6tSp4i9/+csW739HxZgxYwQgbrzxRlFeXi569OghbrnlFtG7d29x4IEHiueff976PNqKJUuWiLPPPlvcd999m7ztpmJr3l+AL0U78rB2J4K5fvIEMY+2Ij/h57EpyF8v2waNjY3ikksuEd27dxeffvqp6zrHH3+8+Ne//rXNxvD999+L6667Tuy2225C0zTRp08fccIJJ4jnnntus0nppl4v++yzj3j22Wc361h2JBIJMWPGDLF69Wpr2dChQwUgRowYIU4++WSxePFisWLFim1OerYnli5dKu6//34hhBBPPvmkAMQee+wh5s+fL15//XUxcOBAsffee4uzzjpLrFmzpp1Hm41diSDmcxDzyCOPPPLYInz11VcMHz6cjRs3smDBAkaNGpW1TmVlJbNmzeL3v//9NhvHgAEDuOOOO/j555+pra3lzTffZOLEiUyePJmxY8dSU1OzzY5tomPHjsycOZNEIrHZ+1i9ejX3338/n376KYsXL6axsRGAuXPncvLJJ7NkyRK8Xi/HH388gwcP5qKLLuLCCy/k0EMPpWfPngwaNAhN07jnnnu21mltN/Tu3ZuLL74YgEmTJrFkyRI+++wz9tprL8aPH8/8+fNpampi6tSpHH300axYsaKdR7zrYofNQcwjjzzyyGPHx5QpU7jlllv417/+xemnn54zzy4SiRAMBvH7/dtlXD6fj4EDBzJw4EBOP/10rr76ag499FDmzJmDpmnb7LhPP/00p556KnvuuSfXXnst3bt3Z+DAgS3mvSWTSb7++mvmzZtHU1MTTz31FF26dGHgwIHccMMNfP3116iqSiwWo6ioiAkTJvDoo48iSRI//fQT/fr1o6ysjEcffZS+ffvy5JNPcscddzB06NBtdp7bC3379s14rWkauq7j8/nweDz07NkTXdfxevN0Zmsj/4nmkUceeeSxWZg2bRp33nknX3zxBb169Wpx3R49euDz+XjvvfcYO3bs9hlgGh6Ph8mTJ3P00Ufz8MMPWwrVtkBhYSFvvfUW7777Lv/+97+pra21CnM6depEMBhkwIABdOnShRkzZvDzzz+zfPlyOnXqxKhRowgGgxx66KH8+c9/JhgMApBKpaivr8fn8+Hz+TKO17dvXz788EN69epF9+7dATjmmGP44osvmDRpEn/7298466yztnrxTnvhmWee4aeffgLgm2++4c9//nOeHG4j5D/VPPLII48dFB988AHnnnsub7/9NgMHDtwmx4jH4/Tu3Zs1a9YwePBgPv74Y0pKShBC8OCDDzJ+/Hi6du1qrf/zzz/z2muv8dxzz7FhwwaeffbZVskhGCrZkUceySOPPLJVCGJ9fT1PP/00s2fPZsmSJcTjcZ577jmGDBmS8zwHDRrEs88+y4knnsiyZcvo0qULXbt25cUXX6Rr164ccMABW4VISZLEUUcdxVFHGQWosViML774gpqaGsLhMN999x1fffUVRxxxBHvttRc9evSgU6dOOfcnyzLFxcU53z/ggAMyXo8ZM4b333+fL774ggsuuICpU6dyxx13MHLkyC0+t/bGCSecwP33389zzz3H/PnzOfnkk9t7SLss8gQxjzzyyGMHRefOnVm2bBmDBg0C4JBDDuHEE09k3333Za+99sLj8WzxMV555RXWrFkDQCgUolevXgQCAVKpFOvXr+fCCy9k9OjRFBcXs2TJEurr6zn22GP561//yiGHHNKierNixQrefPNN/ve//zFr1iyGDBnCP/7xjy0eM8Dxxx9vhVuvuuoqzj33XI499lgOOeQQunfvzogRIzj22GMtwnf88cfz7rvvAjBs2DB69OjB2rVrWb9+PcOHD6euro6ioiKmTZtmKXGbi7Vr19K/f38aGhoAuO+++7jkkku27IQ3AyNHjuTzzz/nwQcf5MQTT6R79+689dZbFBUVbfexbC0Eg0EuvvhiLr74Yk444QSGDRvGbrvtxtKlS+nRowe//PILspwvr9gayBPEPPLII48dFB06dMDr9ZJMJhFCMHPmTGbOnGm936lTJy699FL2228/OnbsyIIFC2hqauK8885r8zFMErPvvvvywAMP0Lt3bzZu3IgQgunTp9OvXz8CgQB1dXX06tWL3XffvdUJWAjB3//+d+666y6OOeYYTjnlFP773//SsWPHzfsgHPt+7bXX+Oabb1izZo2VT/jRRx/x+eefs2LFClauXMlll12GJEkce+yxgBGarK6upry8PIMgNTY24vf7SaVSeL1eevTowXnnncfll1+eU41sDUVFRZx11ln88ssvHH/88UyaNGmLz3tz4fV6ufjiizn//PP5/e9/z4QJEygsLOS1117j1Vdf5fjjj2+3sW0pXnjhBZYuXYosywwYMIAVK1Zwwgkn8Oqrr+ZJ4lZAniDmkUceeeyg6NixI+vXr+eDDz5g4cKF/Pa3vyUej/PZZ5/x2muv8fLLL3PjjTdmbWdWCh9xxBEcdNBBHHzwwYwYMcIy8J07dy4bN25kwIAB1NTUEAqFmDp1Kv379wewCNTll1++WeO++eabef311/n666/p0qULn376KTNmzEBRFOrq6li7di1r1qwhFotx00030bNnz1b3aRLkW265hcrKSl599dWMYpOioiKOOOII63VxcTHXXnstb775Jl27dmXw4MHss88+FBYWZuzXNGL2eDwsWbKEa665hoceeoiBAwduNkEsKChgypQpGcuSySTvvPMOa9euZdy4cRlh++0Br9fLgw8+yD333MO0adMAmDx5Mn//+99RFIXDDz+cSy+9NOvz2Rxcf/313HnnnZSXl1NRUcG4ceM488wzGTx4MP/4xz+47777mDt37hY/MIwbN44PPviAH3/8ESEEa9eupaKiguuvv5677rpri8/j1w7JsNrZ8TBixAjx5Zdftvcw8tgJMGvWLA4++OD2HkYeOwl2tevl7LPP5oknngCgV69enH766dTX13P//fcD0KVLF+rr64nFYvTv3x8hBNXV1QwYMIBly5YxfPhw7rrrrqxq0S3BHnvsQTKZpHv37syfP5+KigoGDBiArusUFhZSUVFBly5dWLBgAfF43Bq/G2pra/nd737HW2+9RZ8+fbjqqquYNGlSq4UJ8Xic119/nQ0bNrBy5Uq+/fZb5s6diyzL7Lvvvuy3334ceeS
2018-09-05 15:52:38 -06:00
"text/plain": [
"<Figure size 1152x648 with 2 Axes>"
2018-09-05 15:52:38 -06:00
]
},
"metadata": {
"needs_background": "light"
},
2018-09-05 15:52:38 -06:00
"output_type": "display_data"
}
],
"source": [
"fig2, ax2 = make_map(bbox=bbox)\n",
"cs2 = ax2.contourf(lons, lats, data, 80, cmap=cmap,\n",
" vmin=data.min(), vmax=data.max())\n",
"cbar2 = fig2.colorbar(cs2, shrink=0.7, orientation='horizontal')\n",
"cbar2.set_label(grid.getLocationName() +\" \"+ grid.getLevel() + \" \" \\\n",
" + grid.getParameter() + \" (\" + destUnit + \") \" \\\n",
2018-09-05 15:52:38 -06:00
" + \"valid \" + str(grid.getDataTime().getRefTime()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## See Also\n",
"\n",
"### Related Notebooks\n",
"\n",
"* [Grid Levels and Parameters](https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html)\n",
"\n",
"### Additional Documention\n",
"\n",
"**python-awips:**\n",
"* [awips.DataAccessLayer](http://unidata.github.io/python-awips/api/DataAccessLayer.html)\n",
"* [awips.PyGridData](http://unidata.github.io/python-awips/api/PyGridData.html)\n",
"\n",
"**matplotlib:**\n",
"* [matplotlib.pyplot](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html)\n",
"* [matplotlib.pyplot.subplot](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.subplot.html)\n",
"* [matplotlib.pyplot.pcolormesh](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.pcolormesh.html)\n",
"* [matplotlib.pyplot.contourf](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.contourf.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
2018-09-05 15:52:38 -06:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
2018-09-05 15:52:38 -06:00
"language": "python",
"name": "python3"
2018-09-05 15:52:38 -06:00
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
2018-09-05 15:52:38 -06:00
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
2018-09-05 15:52:38 -06:00
}
},
"nbformat": 4,
"nbformat_minor": 4
2018-09-05 15:52:38 -06:00
}