This commit is contained in:
srcarter3 2021-06-01 22:45:40 +00:00
parent d8873eb3c2
commit e850901742
8 changed files with 403 additions and 40 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

View file

@ -2,8 +2,52 @@
Grids and Cartopy
=================
`Notebook <http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Grids_and_Cartopy.ipynb>`_
A simple example of requesting and plotting AWIPS grids with Matplotlib
and Cartopy.
Python-AWIPS Tutorial Notebook
--------------
Objectives
==========
- Create a colorized plot for the continental US of model data (grib).
- Access the model data from an EDEX server and limit the data returned
by using model specific parameters.
- Use both *pcolormesh* and *contourf* to create colorized plots, and
compare the differences between the two.
--------------
Table of Contents
-----------------
| `1
Imports <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#imports>`__\
| `2 Define Data
Request <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#define-data-request>`__\
| `3 Limit Results Based on
Time <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#limit-results-based-on-time>`__\
| `4 Function:
make_map() <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#function-make-map>`__\
| `5 Use the Grid
Data! <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#use-the-grid-data>`__\
|     `5.1 Plot Using
pcolormesh <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#plot-using-pcolormesh>`__\
|     `5.2 Plot Using
contourf <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#plot-using-contourf>`__\
| `6 See
Also <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#see-also>`__\
|     `6.1 Related
Notebooks <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#related-notebooks>`__\
|     `6.2 Additional
Documentation <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#additional-documentation>`__\
--------------
1 Imports
---------
Start by importing both the python-awips specific library, as well as
the libraries needed for plotting and manipulating the data
.. code:: ipython3
@ -11,7 +55,25 @@ and Cartopy.
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
%matplotlib inline
from scipy.constants import convert_temperature
`Top <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html>`__
--------------
2 Define Data Request
---------------------
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. 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.
.. code:: ipython3
DataAccessLayer.changeEDEXHost("edex-cloud.unidata.ucar.edu")
request = DataAccessLayer.newDataRequest()
@ -19,14 +81,65 @@ and Cartopy.
request.setLocationNames("RAP13")
request.setParameters("T")
request.setLevels("2.0FHAG")
# Take a look at our request
print(request)
.. parsed-literal::
DefaultDataRequest(datatype=grid, identifiers={}, parameters=['T'], levels=[<dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.level.Level.Level object at 0x11127bfd0>], locationNames=['RAP13'], envelope=None)
`Top <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html>`__
--------------
3 Limit Results Based on Time
-----------------------------
Models produce many different time variants during their runs, so lets
limit the data to the most recent time and forecast run.
.. container:: alert-info
Note: You can play around with different times and forecast runs to
see the differences.
.. code:: ipython3
cycles = DataAccessLayer.getAvailableTimes(request, True)
times = DataAccessLayer.getAvailableTimes(request)
fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)
# Get the most recent grid data
response = DataAccessLayer.getGridData(request, [fcstRun[0]])
grid = response[0]
data = grid.getRawData()
lons, lats = grid.getLatLonCoords()
bbox = [lons.min(), lons.max(), lats.min(), lats.max()]
print('Number of available times:', len(times))
print('Number of available forecast runs:', len(fcstRun))
.. parsed-literal::
Number of available times: 74
Number of available forecast runs: 8
`Top <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html>`__
--------------
4 Function: make_map()
----------------------
In order to plot more than one image, its 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.
.. code:: ipython3
def make_map(bbox, projection=ccrs.PlateCarree()):
fig, ax = plt.subplots(figsize=(16, 9),
@ -39,8 +152,44 @@ and Cartopy.
gl.yformatter = LATITUDE_FORMATTER
return fig, ax
with pcolormesh
~~~~~~~~~~~~~~~
`Top <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html>`__
--------------
5 Use the Grid Data!
--------------------
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 well use when creating
our plots (by calling **make_map** defined above). Finally, well
convert our data from degrees Kelvin to Farenheit to make the plot more
understandable.
.. code:: ipython3
grid = response[0]
data = grid.getRawData()
lons, lats = grid.getLatLonCoords()
bbox = [lons.min(), lons.max(), lats.min(), lats.max()]
# Convert temp from Kelvin to F
destUnit = 'F'
data = convert_temperature(data, 'K', destUnit)
5.1 Plot Using pcolormesh
~~~~~~~~~~~~~~~~~~~~~~~~~
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.
.. container:: alert-info
Note: You may see a warning appear with a red background, this is
okay, and will go away with subsequent runs of the cell.
.. code:: ipython3
@ -49,16 +198,28 @@ with pcolormesh
cs = ax.pcolormesh(lons, lats, data, cmap=cmap)
cbar = fig.colorbar(cs, shrink=0.7, orientation='horizontal')
cbar.set_label(grid.getLocationName() +" "+ grid.getLevel() + " " \
+ grid.getParameter() + " (" + grid.getUnit() + ") " \
+ grid.getParameter() + " (" + destUnit + ") " \
+ "valid " + str(grid.getDataTime().getRefTime()))
.. parsed-literal::
.. image:: Grids_and_Cartopy_files/Grids_and_Cartopy_3_0.png
/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.
X, Y, C, shading = self._pcolorargs('pcolormesh', *args,
with contourf
~~~~~~~~~~~~~
.. image:: Grids_and_Cartopy_files/Grids_and_Cartopy_21_1.png
5.2 Plot Using contourf
~~~~~~~~~~~~~~~~~~~~~~~
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.
.. code:: ipython3
@ -67,10 +228,44 @@ with contourf
vmin=data.min(), vmax=data.max())
cbar2 = fig2.colorbar(cs2, shrink=0.7, orientation='horizontal')
cbar2.set_label(grid.getLocationName() +" "+ grid.getLevel() + " " \
+ grid.getParameter() + " (" + grid.getUnit()+ ") " \
+ grid.getParameter() + " (" + destUnit + ") " \
+ "valid " + str(grid.getDataTime().getRefTime()))
.. image:: Grids_and_Cartopy_files/Grids_and_Cartopy_5_0.png
.. image:: Grids_and_Cartopy_files/Grids_and_Cartopy_23_0.png
`Top <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html>`__
--------------
6 See Also
----------
6.1 Related Notebooks
~~~~~~~~~~~~~~~~~~~~~
- `Grid Levels and
Parameters <https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html>`__
6.2 Additional Documention
~~~~~~~~~~~~~~~~~~~~~~~~~~
**python-awips:** \*
`awips.DataAccessLayer <http://unidata.github.io/python-awips/api/DataAccessLayer.html>`__
\*
`awips.PyGridData <http://unidata.github.io/python-awips/api/PyGridData.html>`__
**matplotlib:** \*
`matplotlib.pyplot <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html>`__
\*
`matplotlib.pyplot.subplot <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.subplot.html>`__
\*
`matplotlib.pyplot.pcolormesh <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.pcolormesh.html>`__
\*
`matplotlib.pyplot.contourf <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.contourf.html>`__
`Top <https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html>`__
--------------

View file

@ -101,8 +101,16 @@
<li class="toctree-l2"><a class="reference internal" href="GOES_Geostationary_Lightning_Mapper.html">GOES Geostationary Lightning Mapper</a></li>
<li class="toctree-l2"><a class="reference internal" href="Grid_Levels_and_Parameters.html">Grid Levels and Parameters</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Grids and Cartopy</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#with-pcolormesh">with pcolormesh</a></li>
<li class="toctree-l3"><a class="reference internal" href="#with-contourf">with contourf</a></li>
<li class="toctree-l3"><a class="reference internal" href="#objectives">Objectives</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#table-of-contents">Table of Contents</a></li>
<li class="toctree-l4"><a class="reference internal" href="#imports">1 Imports</a></li>
<li class="toctree-l4"><a class="reference internal" href="#define-data-request">2 Define Data Request</a></li>
<li class="toctree-l4"><a class="reference internal" href="#limit-results-based-on-time">3 Limit Results Based on Time</a></li>
<li class="toctree-l4"><a class="reference internal" href="#function-make-map">4 Function: make_map()</a></li>
<li class="toctree-l4"><a class="reference internal" href="#use-the-grid-data">5 Use the Grid Data!</a></li>
<li class="toctree-l4"><a class="reference internal" href="#see-also">6 See Also</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="METAR_Station_Plot_with_MetPy.html">METAR Station Plot with MetPy</a></li>
@ -191,30 +199,120 @@
<div class="section" id="grids-and-cartopy">
<h1>Grids and Cartopy<a class="headerlink" href="#grids-and-cartopy" title="Permalink to this headline"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Grids_and_Cartopy.ipynb">Notebook</a>
A simple example of requesting and plotting AWIPS grids with Matplotlib
and Cartopy.</p>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<div class="section" id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li><p>Create a colorized plot for the continental US of model data (grib).</p></li>
<li><p>Access the model data from an EDEX server and limit the data returned
by using model specific parameters.</p></li>
<li><p>Use both <em>pcolormesh</em> and <em>contourf</em> to create colorized plots, and
compare the differences between the two.</p></li>
</ul>
<hr class="docutils" />
<div class="section" id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#imports">1
Imports</a></div>
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#define-data-request">2 Define Data
Request</a></div>
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#limit-results-based-on-time">3 Limit Results Based on
Time</a></div>
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#function-make-map">4 Function:
make_map()</a></div>
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#use-the-grid-data">5 Use the Grid
Data!</a></div>
<div class="line">    <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#plot-using-pcolormesh">5.1 Plot Using
pcolormesh</a></div>
<div class="line">    <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#plot-using-contourf">5.2 Plot Using
contourf</a></div>
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#see-also">6 See
Also</a></div>
<div class="line">    <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#related-notebooks">6.1 Related
Notebooks</a></div>
<div class="line">    <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html#additional-documentation">6.2 Additional
Documentation</a></div>
</div>
</div>
<hr class="docutils" />
<div class="section" id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<p>Start by importing both the python-awips specific library, as well as
the libraries needed for plotting and manipulating the data</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</span>
<span class="kn">import</span> <span class="nn">cartopy.crs</span> <span class="k">as</span> <span class="nn">ccrs</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">from</span> <span class="nn">cartopy.mpl.gridliner</span> <span class="kn">import</span> <span class="n">LONGITUDE_FORMATTER</span><span class="p">,</span> <span class="n">LATITUDE_FORMATTER</span>
<span class="o">%</span><span class="k">matplotlib</span> inline
<span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="s2">&quot;edex-cloud.unidata.ucar.edu&quot;</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">scipy.constants</span> <span class="kn">import</span> <span class="n">convert_temperature</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html">Top</a></p>
</div>
<hr class="docutils" />
<div class="section" id="define-data-request">
<h3>2 Define Data Request<a class="headerlink" href="#define-data-request" title="Permalink to this headline"></a></h3>
<p>If you read through the <a class="reference external" href="https://nbviewer.jupyter.org/github/Unidata/pyaos-ams-2021/blob/master/notebooks/dataAccess/python-awips-HowToAccessData.ipynb">python-awips: How to Access
Data</a>
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 <em>grid</em>
as the data type to define our request. In addition to setting the data
type, the location, parameters and levels are also set as <strong>RAP13</strong>,
<strong>T</strong> (for temperature), and <strong>2.0FHAG</strong> (for Fixed Height Above Ground
in meters), respectively.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="s2">&quot;edex-cloud.unidata.ucar.edu&quot;</span><span class="p">)</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">()</span>
<span class="n">request</span><span class="o">.</span><span class="n">setDatatype</span><span class="p">(</span><span class="s2">&quot;grid&quot;</span><span class="p">)</span>
<span class="n">request</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="s2">&quot;RAP13&quot;</span><span class="p">)</span>
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s2">&quot;T&quot;</span><span class="p">)</span>
<span class="n">request</span><span class="o">.</span><span class="n">setLevels</span><span class="p">(</span><span class="s2">&quot;2.0FHAG&quot;</span><span class="p">)</span>
<span class="n">cycles</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="c1"># Take a look at our request</span>
<span class="nb">print</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">DefaultDataRequest</span><span class="p">(</span><span class="n">datatype</span><span class="o">=</span><span class="n">grid</span><span class="p">,</span> <span class="n">identifiers</span><span class="o">=</span><span class="p">{},</span> <span class="n">parameters</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">],</span> <span class="n">levels</span><span class="o">=</span><span class="p">[</span><span class="o">&lt;</span><span class="n">dynamicserialize</span><span class="o">.</span><span class="n">dstypes</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">raytheon</span><span class="o">.</span><span class="n">uf</span><span class="o">.</span><span class="n">common</span><span class="o">.</span><span class="n">dataplugin</span><span class="o">.</span><span class="n">level</span><span class="o">.</span><span class="n">Level</span><span class="o">.</span><span class="n">Level</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x11127bfd0</span><span class="o">&gt;</span><span class="p">],</span> <span class="n">locationNames</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;RAP13&#39;</span><span class="p">],</span> <span class="n">envelope</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html">Top</a></p>
</div>
<hr class="docutils" />
<div class="section" id="limit-results-based-on-time">
<h3>3 Limit Results Based on Time<a class="headerlink" href="#limit-results-based-on-time" title="Permalink to this headline"></a></h3>
<p>Models produce many different time variants during their runs, so lets
limit the data to the most recent time and forecast run.</p>
<div class="alert-info docutils container">
<p>Note: You can play around with different times and forecast runs to
see the differences.</p>
</div>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">cycles</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">times</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">fcstRun</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getForecastRun</span><span class="p">(</span><span class="n">cycles</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">times</span><span class="p">)</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGridData</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">getRawData</span><span class="p">()</span>
<span class="n">lons</span><span class="p">,</span> <span class="n">lats</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">getLatLonCoords</span><span class="p">()</span>
<span class="n">bbox</span> <span class="o">=</span> <span class="p">[</span><span class="n">lons</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">lons</span><span class="o">.</span><span class="n">max</span><span class="p">(),</span> <span class="n">lats</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">lats</span><span class="o">.</span><span class="n">max</span><span class="p">()]</span>
<span class="k">def</span> <span class="nf">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="p">,</span> <span class="n">projection</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">()):</span>
<span class="c1"># Get the most recent grid data</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGridData</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Number of available times:&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">times</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Number of available forecast runs:&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">fcstRun</span><span class="p">))</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Number</span> <span class="n">of</span> <span class="n">available</span> <span class="n">times</span><span class="p">:</span> <span class="mi">74</span>
<span class="n">Number</span> <span class="n">of</span> <span class="n">available</span> <span class="n">forecast</span> <span class="n">runs</span><span class="p">:</span> <span class="mi">8</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html">Top</a></p>
</div>
<hr class="docutils" />
<div class="section" id="function-make-map">
<h3>4 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this headline"></a></h3>
<p>In order to plot more than one image, its easiest to define common
logic in a function. Here, a new function called <strong>make_map</strong> is
defined. This function uses the <a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot package
(plt)</a>
to create a figure and axis. The coastlines (continental boundaries) are
added, along with lat/lon grids.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="p">,</span> <span class="n">projection</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">()):</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span>
<span class="n">subplot_kw</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">projection</span><span class="o">=</span><span class="n">projection</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_extent</span><span class="p">(</span><span class="n">bbox</span><span class="p">)</span>
@ -226,31 +324,101 @@ and Cartopy.</p>
<span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span>
</pre></div>
</div>
<div class="section" id="with-pcolormesh">
<h2>with pcolormesh<a class="headerlink" href="#with-pcolormesh" title="Permalink to this headline"></a></h2>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html">Top</a></p>
</div>
<hr class="docutils" />
<div class="section" id="use-the-grid-data">
<h3>5 Use the Grid Data!<a class="headerlink" href="#use-the-grid-data" title="Permalink to this headline"></a></h3>
<p>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 well use when creating
our plots (by calling <strong>make_map</strong> defined above). Finally, well
convert our data from degrees Kelvin to Farenheit to make the plot more
understandable.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">grid</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">getRawData</span><span class="p">()</span>
<span class="n">lons</span><span class="p">,</span> <span class="n">lats</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">getLatLonCoords</span><span class="p">()</span>
<span class="n">bbox</span> <span class="o">=</span> <span class="p">[</span><span class="n">lons</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">lons</span><span class="o">.</span><span class="n">max</span><span class="p">(),</span> <span class="n">lats</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">lats</span><span class="o">.</span><span class="n">max</span><span class="p">()]</span>
<span class="c1"># Convert temp from Kelvin to F</span>
<span class="n">destUnit</span> <span class="o">=</span> <span class="s1">&#39;F&#39;</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">convert_temperature</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="s1">&#39;K&#39;</span><span class="p">,</span> <span class="n">destUnit</span><span class="p">)</span>
</pre></div>
</div>
<div class="section" id="plot-using-pcolormesh">
<h4>5.1 Plot Using pcolormesh<a class="headerlink" href="#plot-using-pcolormesh" title="Permalink to this headline"></a></h4>
<p>This example shows how to use
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.pcolormesh.html">matplotlib.pyplot.pcolormesh</a>
to create a colorized plot. We use our <strong>make_map</strong> function to create a
subplot and then we create a color scale (cs) and colorbar (cbar) with a
label for our plot.</p>
<div class="alert-info docutils container">
<p>Note: You may see a warning appear with a red background, this is
okay, and will go away with subsequent runs of the cell.</p>
</div>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">cmap</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">get_cmap</span><span class="p">(</span><span class="s1">&#39;rainbow&#39;</span><span class="p">)</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
<span class="n">cs</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">pcolormesh</span><span class="p">(</span><span class="n">lons</span><span class="p">,</span> <span class="n">lats</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">cmap</span><span class="p">)</span>
<span class="n">cbar</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">cs</span><span class="p">,</span> <span class="n">shrink</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">orientation</span><span class="o">=</span><span class="s1">&#39;horizontal&#39;</span><span class="p">)</span>
<span class="n">cbar</span><span class="o">.</span><span class="n">set_label</span><span class="p">(</span><span class="n">grid</span><span class="o">.</span><span class="n">getLocationName</span><span class="p">()</span> <span class="o">+</span><span class="s2">&quot; &quot;</span><span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getLevel</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> \
<span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getParameter</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getUnit</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot;) &quot;</span> \
<span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getParameter</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="n">destUnit</span> <span class="o">+</span> <span class="s2">&quot;) &quot;</span> \
<span class="o">+</span> <span class="s2">&quot;valid &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">grid</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getRefTime</span><span class="p">()))</span>
</pre></div>
</div>
<img alt="../../_images/Grids_and_Cartopy_3_0.png" src="../../_images/Grids_and_Cartopy_3_0.png" />
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">/</span><span class="n">Users</span><span class="o">/</span><span class="n">scarter</span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">miniconda3</span><span class="o">/</span><span class="n">envs</span><span class="o">/</span><span class="n">python3</span><span class="o">-</span><span class="n">awips</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="mf">.9</span><span class="o">/</span><span class="n">site</span><span class="o">-</span><span class="n">packages</span><span class="o">/</span><span class="n">cartopy</span><span class="o">/</span><span class="n">mpl</span><span class="o">/</span><span class="n">geoaxes</span><span class="o">.</span><span class="n">py</span><span class="p">:</span><span class="mi">1598</span><span class="p">:</span> <span class="ne">UserWarning</span><span class="p">:</span> <span class="n">The</span> <span class="nb">input</span> <span class="n">coordinates</span> <span class="n">to</span> <span class="n">pcolormesh</span> <span class="n">are</span> <span class="n">interpreted</span> <span class="k">as</span> <span class="n">cell</span> <span class="n">centers</span><span class="p">,</span> <span class="n">but</span> <span class="n">are</span> <span class="ow">not</span> <span class="n">monotonically</span> <span class="n">increasing</span> <span class="ow">or</span> <span class="n">decreasing</span><span class="o">.</span> <span class="n">This</span> <span class="n">may</span> <span class="n">lead</span> <span class="n">to</span> <span class="n">incorrectly</span> <span class="n">calculated</span> <span class="n">cell</span> <span class="n">edges</span><span class="p">,</span> <span class="ow">in</span> <span class="n">which</span> <span class="n">case</span><span class="p">,</span> <span class="n">please</span> <span class="n">supply</span> <span class="n">explicit</span> <span class="n">cell</span> <span class="n">edges</span> <span class="n">to</span> <span class="n">pcolormesh</span><span class="o">.</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">shading</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pcolorargs</span><span class="p">(</span><span class="s1">&#39;pcolormesh&#39;</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span>
</pre></div>
</div>
<div class="section" id="with-contourf">
<h2>with contourf<a class="headerlink" href="#with-contourf" title="Permalink to this headline"></a></h2>
<img alt="../../_images/Grids_and_Cartopy_21_1.png" src="../../_images/Grids_and_Cartopy_21_1.png" />
</div>
<div class="section" id="plot-using-contourf">
<h4>5.2 Plot Using contourf<a class="headerlink" href="#plot-using-contourf" title="Permalink to this headline"></a></h4>
<p>This example shows how to use
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.contourf.html">matplotlib.pyplot.contourf</a>
to create a colorized plot. We use our <strong>make_map</strong> function to create a
subplot and then we create a color scale (cs2) and colorbar (cbar2) with
a label for our plot.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">fig2</span><span class="p">,</span> <span class="n">ax2</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
<span class="n">cs2</span> <span class="o">=</span> <span class="n">ax2</span><span class="o">.</span><span class="n">contourf</span><span class="p">(</span><span class="n">lons</span><span class="p">,</span> <span class="n">lats</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">cmap</span><span class="p">,</span>
<span class="n">vmin</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">vmax</span><span class="o">=</span><span class="n">data</span><span class="o">.</span><span class="n">max</span><span class="p">())</span>
<span class="n">cbar2</span> <span class="o">=</span> <span class="n">fig2</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">cs2</span><span class="p">,</span> <span class="n">shrink</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">orientation</span><span class="o">=</span><span class="s1">&#39;horizontal&#39;</span><span class="p">)</span>
<span class="n">cbar2</span><span class="o">.</span><span class="n">set_label</span><span class="p">(</span><span class="n">grid</span><span class="o">.</span><span class="n">getLocationName</span><span class="p">()</span> <span class="o">+</span><span class="s2">&quot; &quot;</span><span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getLevel</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> \
<span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getParameter</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getUnit</span><span class="p">()</span><span class="o">+</span> <span class="s2">&quot;) &quot;</span> \
<span class="o">+</span> <span class="n">grid</span><span class="o">.</span><span class="n">getParameter</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="n">destUnit</span> <span class="o">+</span> <span class="s2">&quot;) &quot;</span> \
<span class="o">+</span> <span class="s2">&quot;valid &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">grid</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getRefTime</span><span class="p">()))</span>
</pre></div>
</div>
<img alt="../../_images/Grids_and_Cartopy_5_0.png" src="../../_images/Grids_and_Cartopy_5_0.png" />
<img alt="../../_images/Grids_and_Cartopy_23_0.png" src="../../_images/Grids_and_Cartopy_23_0.png" />
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html">Top</a></p>
</div>
</div>
<hr class="docutils" />
<div class="section" id="see-also">
<h3>6 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<div class="section" id="related-notebooks">
<h4>6.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this headline"></a></h4>
<ul class="simple">
<li><p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html">Grid Levels and
Parameters</a></p></li>
</ul>
</div>
<div class="section" id="additional-documention">
<h4>6.2 Additional Documention<a class="headerlink" href="#additional-documention" title="Permalink to this headline"></a></h4>
<p><strong>python-awips:</strong> *
<a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html">awips.DataAccessLayer</a>
*
<a class="reference external" href="http://unidata.github.io/python-awips/api/PyGridData.html">awips.PyGridData</a></p>
<p><strong>matplotlib:</strong> *
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot</a>
*
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.subplot.html">matplotlib.pyplot.subplot</a>
*
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.pcolormesh.html">matplotlib.pyplot.pcolormesh</a>
*
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.contourf.html">matplotlib.pyplot.contourf</a></p>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grids_and_Cartopy.html">Top</a></p>
<hr class="docutils" />
</div>
</div>
</div>
</div>

Binary file not shown.

File diff suppressed because one or more lines are too long