python-awips/examples/notebooks/Model_Sounding_Data.ipynb

1617 lines
308 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",
"# Model Sounding Data\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/model_sounding_preview.png\" alt=\"preview image of a model sounding skewt and hodograph\" style=\"height: 300px;\"></div>\n",
"\n",
"\n",
"# Objectives\n",
"\n",
"* Use python-awips to connect to an edex server\n",
"* Define and filter data request for model sounding data\n",
"* Create vertical profiles from GFS BUFR products\n",
"* Use MetPy to create [SkewT](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html) and [Hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html) plots\n",
"\n",
"---"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
2018-09-05 15:52:38 -06:00
"metadata": {
"toc": true
2018-09-05 15:52:38 -06:00
},
"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=\"#EDEX-Connection\" data-toc-modified-id=\"EDEX-Connection-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>EDEX Connection</a></span></li><li><span><a href=\"#Setting-Location\" data-toc-modified-id=\"Setting-Location-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Setting Location</a></span><ul class=\"toc-item\"><li><span><a href=\"#Available-Location-Names\" data-toc-modified-id=\"Available-Location-Names-3.1\"><span class=\"toc-item-num\">3.1&nbsp;&nbsp;</span>Available Location Names</a></span></li><li><span><a href=\"#Setting-the-Location-Name\" data-toc-modified-id=\"Setting-the-Location-Name-3.2\"><span class=\"toc-item-num\">3.2&nbsp;&nbsp;</span>Setting the Location Name</a></span></li></ul></li><li><span><a href=\"#Filtering-by-Time\" data-toc-modified-id=\"Filtering-by-Time-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>Filtering by Time</a></span></li><li><span><a href=\"#Get-the-Data!\" data-toc-modified-id=\"Get-the-Data!-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>Get the Data!</a></span></li><li><span><a href=\"#Use-the-Data!\" data-toc-modified-id=\"Use-the-Data!-6\"><span class=\"toc-item-num\">6&nbsp;&nbsp;</span>Use the Data!</a></span><ul class=\"toc-item\"><li><span><a href=\"#Prepare-data-objects\" data-toc-modified-id=\"Prepare-data-objects-6.1\"><span class=\"toc-item-num\">6.1&nbsp;&nbsp;</span>Prepare data objects</a></span></li><li><span><a href=\"#Calculate-Dewpoint-from-Specific-Humidity\" data-toc-modified-id=\"Calculate-Dewpoint-from-Specific-Humidity-6.2\"><span class=\"toc-item-num\">6.2&nbsp;&nbsp;</span>Calculate Dewpoint from Specific Humidity</a></span><ul class=\"toc-item\"><li><span><a href=\"#Method-1\" data-toc-modified-id=\"Method-1-6.2.1\"><span class=\"toc-item-num\">6.2.1&nbsp;&nbsp;</span>Method 1</a></span></li><li><span><a href=\"#Method-2\" data-toc-modified-id=\"Method-2-6.2.2\"><span class=\"toc-item-num\">6.2.2&nbsp;&nbsp;</span>Method 2</a></span></li><li><span><a href=\"#Method-3\" data-toc-modified-id=\"Method-3-6.2.3\"><span class=\"toc-item-num\">6.2.3&nbsp;&nbsp;</span>Method 3</a></span></li></ul></li></ul></li><li><span><a href=\"#Plot-the-Data!\" data-toc-modified-id=\"Plot-the-Data!-7\"><span class=\"toc-item-num\">7&nbsp;&nbsp;</span>Plot the Data!</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-Documentation\" data-toc-modified-id=\"Additional-Documentation-8.2\"><span class=\"toc-item-num\">8.2&nbsp;&nbsp;</span>Additional Documentation</a></span></li></ul></li></ul></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports\n",
"\n",
"The imports below are used throughout the notebook. Note the first import is coming directly from python-awips and allows us to connect to an EDEX server. The subsequent imports are for data manipulation and visualization. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
"from math import exp, log\n",
"import numpy as np\n",
"from metpy.calc import dewpoint, vapor_pressure, wind_speed, wind_direction\n",
2018-09-05 15:52:38 -06:00
"from metpy.plots import SkewT, Hodograph\n",
"from metpy.units import units"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## EDEX Connection\n",
2018-09-05 15:52:38 -06:00
"\n",
"First we establish a connection to Unidata's public EDEX server. With that connection made, we can create a [new data request object](http://unidata.github.io/python-awips/api/IDataRequest.html) and set the data type to ***modelsounding***, and define additional parameters and an identifier on the request."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
2018-10-11 14:56:26 -06:00
"request = DataAccessLayer.newDataRequest(\"modelsounding\")\n",
2018-09-05 15:52:38 -06:00
"forecastModel = \"GFS\"\n",
"request.addIdentifier(\"reportType\", forecastModel)\n",
"request.setParameters(\"pressure\",\"temperature\",\"specHum\",\"uComp\",\"vComp\")"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setting Location\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Available Location Names\n",
"When working with a new data type, it is often useful to investigate all available options for a particular setting. Shown below is how to see all available location names for a data request with type `modelsounding` and `reportType` identifier of `GFS`. This step is not necessary if you already know exactly what the location name(s) you're interested in is."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 3,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['1V4',\n",
" '2I0',\n",
" '2IS',\n",
" '3J2',\n",
" '4BL',\n",
" '4BQ',\n",
" '4HV',\n",
" '4OM',\n",
" '5AF',\n",
" '5AG',\n",
" '5SZ',\n",
" '6RO',\n",
" '82MN',\n",
" '8V7',\n",
" '95E',\n",
" '9B6',\n",
" 'A#2',\n",
" 'A#3',\n",
" 'A#4',\n",
" 'A#5',\n",
" 'A#6',\n",
" 'A#7',\n",
" 'A#8',\n",
" 'A#9',\n",
" 'A#A',\n",
" 'A#B',\n",
" 'A#C',\n",
" 'A#D',\n",
" 'A#E',\n",
" 'ABL',\n",
" 'ADM',\n",
" 'AFA',\n",
" 'AGR',\n",
" 'AHN',\n",
" 'AIH',\n",
" 'AJO',\n",
" 'AKO',\n",
" 'ALTA',\n",
" 'ANJ',\n",
" 'APPL',\n",
" 'APX',\n",
" 'AQQ',\n",
" 'ATH',\n",
" 'ATL1',\n",
" 'ATL2',\n",
" 'ATL3',\n",
" 'ATL4',\n",
" 'ATL5',\n",
" 'ATL6',\n",
" 'ATLH',\n",
" 'AWH',\n",
" 'AWR',\n",
" 'B#1',\n",
" 'B#2',\n",
" 'B#3',\n",
" 'B#4',\n",
" 'B#5',\n",
" 'B#6',\n",
" 'B#7',\n",
" 'B#8',\n",
" 'B#9',\n",
" 'B#A',\n",
" 'B#B',\n",
" 'B#C',\n",
" 'B#D',\n",
" 'B#E',\n",
" 'B#F',\n",
" 'B#G',\n",
" 'B#H',\n",
" 'B#J',\n",
" 'B#K',\n",
" 'B#L',\n",
" 'B#M',\n",
" 'B#N',\n",
" 'B#O',\n",
" 'B#P',\n",
" 'B#Q',\n",
" 'B#S',\n",
" 'B#T',\n",
" 'B#U',\n",
" 'B#V',\n",
" 'B#W',\n",
" 'B#X',\n",
" 'B015',\n",
" 'B40',\n",
" 'B41',\n",
" 'B42',\n",
" 'B43',\n",
" 'B44',\n",
" 'B45',\n",
" 'B46',\n",
" 'B47',\n",
" 'B48',\n",
" 'B49',\n",
" 'BAB',\n",
" 'BAX',\n",
" 'BBD',\n",
" 'BDG',\n",
" 'BDP',\n",
" 'BDS',\n",
" 'BFL',\n",
" 'BFX',\n",
" 'BGTL',\n",
" 'BH1',\n",
" 'BH2',\n",
" 'BH3',\n",
" 'BH4',\n",
" 'BH5',\n",
" 'BHK',\n",
" 'BID',\n",
" 'BIR',\n",
" 'BIV',\n",
" 'BKY',\n",
" 'BLS',\n",
" 'BLU',\n",
" 'BMX',\n",
" 'BNA',\n",
" 'BNY',\n",
" 'BOD',\n",
" 'BON',\n",
" 'BPK',\n",
" 'BRA',\n",
" 'BS1',\n",
" 'BS2',\n",
" 'BS3',\n",
" 'BTL',\n",
" 'BVR',\n",
" 'BYG',\n",
" 'C01',\n",
" 'C02',\n",
" 'C03',\n",
" 'C04',\n",
" 'C06',\n",
" 'C07',\n",
" 'C08',\n",
" 'C09',\n",
" 'C10',\n",
" 'C11',\n",
" 'C12',\n",
" 'C13',\n",
" 'C14',\n",
" 'C18',\n",
" 'C19',\n",
" 'C22',\n",
" 'C23',\n",
" 'C25',\n",
" 'C27',\n",
" 'C28',\n",
" 'C32',\n",
" 'C33',\n",
" 'C34',\n",
" 'C35',\n",
" 'C36',\n",
" 'C7H',\n",
" 'CAI',\n",
" 'CAN',\n",
" 'CBE',\n",
" 'CBN',\n",
" 'CCL',\n",
" 'CCR',\n",
" 'CFC',\n",
" 'CHE',\n",
" 'CHRL',\n",
" 'CKN',\n",
" 'CLD',\n",
" 'CLE',\n",
" 'CLN',\n",
" 'CND',\n",
" 'CNLK',\n",
" 'CNN',\n",
" 'COA',\n",
" 'COL1',\n",
" 'COL2',\n",
" 'COL3',\n",
" 'COL4',\n",
" 'COT',\n",
" 'COV',\n",
" 'CQV',\n",
" 'CRL',\n",
" 'CRR',\n",
" 'CSQ',\n",
" 'CTY',\n",
" 'CVD',\n",
" 'CVM',\n",
" 'CVS',\n",
" 'CWEU',\n",
" 'CWFN',\n",
" 'CWKX',\n",
" 'CWLB',\n",
" 'CWLO',\n",
" 'CWLT',\n",
" 'CWLW',\n",
" 'CWMW',\n",
" 'CWOS',\n",
" 'CWPH',\n",
" 'CWQG',\n",
" 'CWSA',\n",
" 'CWSE',\n",
" 'CWZB',\n",
" 'CWZC',\n",
" 'CWZV',\n",
" 'CYAH',\n",
" 'CYAW',\n",
" 'CYBK',\n",
" 'CYBU',\n",
" 'CYCB',\n",
" 'CYCG',\n",
" 'CYCX',\n",
" 'CYDA',\n",
" 'CYDF',\n",
" 'CYEG',\n",
" 'CYEV',\n",
" 'CYFB',\n",
" 'CYFO',\n",
" 'CYFS',\n",
" 'CYGQ',\n",
" 'CYHM',\n",
" 'CYHZ',\n",
" 'CYJT',\n",
" 'CYKF',\n",
" 'CYLH',\n",
" 'CYLJ',\n",
" 'CYMD',\n",
" 'CYMO',\n",
" 'CYMT',\n",
" 'CYMX',\n",
" 'CYOC',\n",
" 'CYOW',\n",
" 'CYPA',\n",
" 'CYPE',\n",
" 'CYPL',\n",
" 'CYPQ',\n",
" 'CYQA',\n",
" 'CYQD',\n",
" 'CYQG',\n",
" 'CYQH',\n",
" 'CYQI',\n",
" 'CYQK',\n",
" 'CYQM',\n",
" 'CYQQ',\n",
" 'CYQR',\n",
" 'CYQT',\n",
" 'CYQX',\n",
" 'CYQY',\n",
" 'CYRB',\n",
" 'CYSJ',\n",
" 'CYSM',\n",
" 'CYSY',\n",
" 'CYTH',\n",
" 'CYTL',\n",
" 'CYTS',\n",
" 'CYUL',\n",
" 'CYUX',\n",
" 'CYVO',\n",
" 'CYVP',\n",
" 'CYVQ',\n",
" 'CYVR',\n",
" 'CYVV',\n",
" 'CYWA',\n",
" 'CYWG',\n",
" 'CYWO',\n",
" 'CYXC',\n",
" 'CYXE',\n",
" 'CYXH',\n",
" 'CYXS',\n",
" 'CYXU',\n",
" 'CYXX',\n",
" 'CYXY',\n",
" 'CYXZ',\n",
" 'CYYB',\n",
" 'CYYC',\n",
" 'CYYE',\n",
" 'CYYG',\n",
" 'CYYJ',\n",
" 'CYYL',\n",
" 'CYYQ',\n",
" 'CYYR',\n",
" 'CYYT',\n",
" 'CYYZ',\n",
" 'CYZF',\n",
" 'CYZS',\n",
" 'CYZT',\n",
" 'CYZV',\n",
" 'CYZX',\n",
" 'CZC',\n",
" 'D07',\n",
" 'D55',\n",
" 'DDOR',\n",
" 'DEN',\n",
" 'DOV',\n",
" 'DPG',\n",
" 'DSC',\n",
" 'DSD',\n",
" 'DTX',\n",
" 'DVN',\n",
" 'DYS',\n",
" 'E28',\n",
" 'E74',\n",
" 'EAX',\n",
" 'EDW',\n",
" 'EFL',\n",
" 'ELZB',\n",
" 'EMF',\n",
" 'EMP',\n",
" 'END',\n",
" 'ENL',\n",
" 'EON',\n",
" 'ESTC',\n",
" 'EVR',\n",
" 'EVW',\n",
" 'FCS',\n",
" 'FDR',\n",
" 'FFC',\n",
" 'FHU',\n",
" 'FLG',\n",
" 'FLK',\n",
" 'FLP',\n",
" 'FNB',\n",
" 'FPK',\n",
" 'FPS7',\n",
" 'FRI',\n",
" 'FRO',\n",
" 'FRS',\n",
" 'FSI',\n",
" 'FSTK',\n",
" 'FTR',\n",
" 'FTSR',\n",
" 'FWD',\n",
" 'FZP',\n",
" 'G#1',\n",
" 'G#2',\n",
" 'G#3',\n",
" 'G#4',\n",
" 'G#5',\n",
" 'G#6',\n",
" 'G#7',\n",
" 'G#8',\n",
" 'G#9',\n",
" 'G#A',\n",
" 'G#B',\n",
" 'G#C',\n",
" 'G#D',\n",
" 'G#E',\n",
" 'G#F',\n",
" 'G#G',\n",
" 'G001',\n",
" 'G003',\n",
" 'G004',\n",
" 'G005',\n",
" 'G007',\n",
" 'G009',\n",
" 'G010',\n",
" 'G011',\n",
" 'GDP',\n",
" 'GDV',\n",
" 'GLRY',\n",
" 'GMX1',\n",
" 'GNB',\n",
" 'GNC',\n",
" 'GRF',\n",
" 'GRMM',\n",
" 'GRUN',\n",
" 'GTB',\n",
" 'GTP',\n",
" 'GVH',\n",
" 'GVL',\n",
" 'GVS',\n",
" 'GVY',\n",
" 'GYX',\n",
" 'H02',\n",
" 'HAY',\n",
" 'HGR',\n",
" 'HLD',\n",
" 'HMM',\n",
" 'HMN',\n",
" 'HNR',\n",
" 'HOM',\n",
" 'HOO',\n",
" 'HSI',\n",
" 'HYR',\n",
" 'ICC',\n",
" 'IGM',\n",
" 'IJD',\n",
" 'ILN',\n",
" 'ILS',\n",
" 'ILX',\n",
" 'IMT',\n",
" 'INK',\n",
" 'INV',\n",
" 'IPX',\n",
" 'ISQ',\n",
" 'IVNH',\n",
" 'JACK',\n",
" 'JAYV',\n",
" 'JCT',\n",
" 'JDN',\n",
" 'JHN',\n",
" 'JOES',\n",
" 'JPB',\n",
" 'JWG',\n",
" 'K13K',\n",
" 'K1A6',\n",
" 'K1H2',\n",
" 'K20V',\n",
" 'K2G4',\n",
" 'K2V5',\n",
" 'K36U',\n",
" 'K3LF',\n",
" 'K40B',\n",
" 'K48I',\n",
" 'K4MB',\n",
" 'K4S3',\n",
" 'K5J0',\n",
" 'K8K2',\n",
" 'K9D1',\n",
" 'K9K7',\n",
" 'K9K8',\n",
" 'K9V9',\n",
" 'KAAT',\n",
" 'KABE',\n",
" 'KABI',\n",
" 'KABQ',\n",
" 'KABR',\n",
" 'KABY',\n",
" 'KACK',\n",
" 'KACT',\n",
" 'KACV',\n",
" 'KACY',\n",
" 'KAEL',\n",
" 'KAFJ',\n",
" 'KAFO',\n",
" 'KAGC',\n",
" 'KAGS',\n",
" 'KAHN',\n",
" 'KAIA',\n",
" 'KAIB',\n",
" 'KAK',\n",
" 'KAKP',\n",
" 'KALB',\n",
" 'KALI',\n",
" 'KALO',\n",
" 'KALS',\n",
" 'KALW',\n",
" 'KAMA',\n",
" 'KAN',\n",
" 'KANB',\n",
" 'KAND',\n",
" 'KAOO',\n",
" 'KAPA',\n",
" 'KAPN',\n",
" 'KAQP',\n",
" 'KARA',\n",
" 'KARR',\n",
" 'KART',\n",
" 'KASE',\n",
" 'KAST',\n",
" 'KATL',\n",
" 'KATY',\n",
" 'KAUG',\n",
" 'KAUS',\n",
" 'KAUW',\n",
" 'KAVL',\n",
" 'KAVP',\n",
" 'KAXN',\n",
" 'KAYS',\n",
" 'KAZO',\n",
" 'KBAF',\n",
" 'KBBG',\n",
" 'KBBW',\n",
" 'KBCE',\n",
" 'KBDE',\n",
" 'KBDL',\n",
" 'KBDR',\n",
" 'KBED',\n",
" 'KBFD',\n",
" 'KBFF',\n",
" 'KBFI',\n",
" 'KBFL',\n",
" 'KBFM',\n",
" 'KBGM',\n",
" 'KBGR',\n",
" 'KBHB',\n",
" 'KBHM',\n",
" 'KBIE',\n",
" 'KBIH',\n",
" 'KBIL',\n",
" 'KBIS',\n",
" 'KBJC',\n",
" 'KBJI',\n",
" 'KBKE',\n",
" 'KBKW',\n",
" 'KBKX',\n",
" 'KBLF',\n",
" 'KBLH',\n",
" 'KBLI',\n",
" 'KBMG',\n",
" 'KBMI',\n",
" 'KBML',\n",
" 'KBNA',\n",
" 'KBNO',\n",
" 'KBNV',\n",
" 'KBOI',\n",
" 'KBOS',\n",
" 'KBPI',\n",
" 'KBPT',\n",
" 'KBQK',\n",
" 'KBRD',\n",
" 'KBRL',\n",
" 'KBRO',\n",
" 'KBTL',\n",
" 'KBTM',\n",
" 'KBTR',\n",
" 'KBTV',\n",
" 'KBUF',\n",
" 'KBUR',\n",
" 'KBVI',\n",
" 'KBVN',\n",
" 'KBVO',\n",
" 'KBVX',\n",
" 'KBVY',\n",
" 'KBWG',\n",
" 'KBWI',\n",
" 'KBYI',\n",
" 'KBZN',\n",
" 'KC1',\n",
" 'KCAD',\n",
" 'KCAE',\n",
" 'KCAK',\n",
" 'KCAR',\n",
" 'KCDC',\n",
" 'KCDR',\n",
" 'KCDS',\n",
" 'KCEC',\n",
" 'KCEF',\n",
" 'KCEZ',\n",
" 'KCFV',\n",
" 'KCGI',\n",
" 'KCGX',\n",
" 'KCHA',\n",
" 'KCHH',\n",
" 'KCHO',\n",
" 'KCHS',\n",
" 'KCIC',\n",
" 'KCID',\n",
" 'KCIU',\n",
" 'KCKB',\n",
" 'KCKL',\n",
" 'KCLE',\n",
" 'KCLL',\n",
" 'KCLM',\n",
" 'KCLT',\n",
" 'KCMH',\n",
" 'KCMI',\n",
" 'KCMX',\n",
" 'KCNB',\n",
" 'KCNK',\n",
" 'KCNM',\n",
" 'KCNU',\n",
" 'KCNY',\n",
" 'KCOD',\n",
" 'KCOE',\n",
" 'KCON',\n",
" 'KCOS',\n",
" 'KCOU',\n",
" 'KCPR',\n",
" 'KCRE',\n",
" 'KCRP',\n",
" 'KCRQ',\n",
" 'KCRW',\n",
" 'KCSG',\n",
" 'KCSM',\n",
" 'KCSV',\n",
" 'KCTB',\n",
" 'KCVG',\n",
" 'KCXO',\n",
" 'KCYS',\n",
" 'KDAB',\n",
" 'KDAF',\n",
" 'KDAG',\n",
" 'KDAL',\n",
" 'KDAN',\n",
" 'KDAY',\n",
" 'KDBQ',\n",
" 'KDCA',\n",
" 'KDDC',\n",
" 'KDEC',\n",
" 'KDEH',\n",
" 'KDEN',\n",
" 'KDET',\n",
" 'KDFW',\n",
" 'KDHN',\n",
" 'KDHT',\n",
" 'KDIK',\n",
" 'KDLH',\n",
" 'KDLL',\n",
" 'KDLS',\n",
" 'KDMN',\n",
" 'KDNV',\n",
" 'KDPA',\n",
" 'KDRA',\n",
" 'KDRO',\n",
" 'KDRT',\n",
" 'KDSM',\n",
" 'KDTL',\n",
" 'KDTW',\n",
" 'KDUB',\n",
" 'KDUG',\n",
" 'KDUJ',\n",
" 'KEAR',\n",
" 'KEAT',\n",
" 'KEAU',\n",
" 'KECG',\n",
" 'KECS',\n",
" 'KEE0',\n",
" 'KEED',\n",
" 'KEET',\n",
" 'KEGE',\n",
" 'KEHA',\n",
" 'KEKN',\n",
" 'KEKO',\n",
" 'KEKQ',\n",
" 'KEL',\n",
" 'KELD',\n",
" 'KELM',\n",
" 'KELN',\n",
" 'KELO',\n",
" 'KELP',\n",
" 'KELY',\n",
" 'KEMM',\n",
" 'KEMP',\n",
" 'KENV',\n",
" 'KENW',\n",
" 'KEPH',\n",
" 'KEPO',\n",
" 'KEPZ',\n",
" 'KERI',\n",
" 'KERY',\n",
" 'KESC',\n",
" 'KESF',\n",
" 'KEUG',\n",
" 'KEVV',\n",
" 'KEWB',\n",
" 'KEWN',\n",
" 'KEWR',\n",
" 'KEYW',\n",
" 'KFAM',\n",
" 'KFAR',\n",
" 'KFAT',\n",
" 'KFAY',\n",
" 'KFDY',\n",
" 'KFKL',\n",
" 'KFLD',\n",
" 'KFLG',\n",
" 'KFLL',\n",
" 'KFLO',\n",
" 'KFMH',\n",
" 'KFMN',\n",
" 'KFMY',\n",
" 'KFNL',\n",
" 'KFNT',\n",
" 'KFOD',\n",
" 'KFOE',\n",
" 'KFPR',\n",
" 'KFRM',\n",
" 'KFSD',\n",
" 'KFSM',\n",
" 'KFTK',\n",
" 'KFTW',\n",
" 'KFTY',\n",
" 'KFVE',\n",
" 'KFVX',\n",
" 'KFWA',\n",
" 'KFXE',\n",
" 'KFYV',\n",
" 'KGAG',\n",
" 'KGBD',\n",
" 'KGBG',\n",
" 'KGCC',\n",
" 'KGCK',\n",
" 'KGCN',\n",
" 'KGEG',\n",
" 'KGEY',\n",
" 'KGFK',\n",
" 'KGFL',\n",
" 'KGGG',\n",
" 'KGGW',\n",
" 'KGJT',\n",
" 'KGKL',\n",
" 'KGLD',\n",
" 'KGLH',\n",
" 'KGLS',\n",
" 'KGMU',\n",
" 'KGNR',\n",
" 'KGNV',\n",
" 'KGON',\n",
" 'KGPI',\n",
" 'KGPT',\n",
" 'KGRB',\n",
" 'KGRI',\n",
" 'KGRK',\n",
" 'KGRR',\n",
" 'KGSB',\n",
" 'KGSO',\n",
" 'KGSP',\n",
" 'KGTF',\n",
" 'KGUC',\n",
" 'KGUP',\n",
" 'KGUY',\n",
" 'KGWO',\n",
" 'KGXA',\n",
" 'KGXY',\n",
" 'KGYY',\n",
" 'KGZH',\n",
" 'KHAT',\n",
" 'KHBG',\n",
" 'KHBR',\n",
" 'KHCO',\n",
" 'KHDE',\n",
" 'KHDN',\n",
" 'KHFD',\n",
" 'KHFJ',\n",
" 'KHIB',\n",
" 'KHIE',\n",
" 'KHIO',\n",
" 'KHJH',\n",
" 'KHKY',\n",
" 'KHLC',\n",
" 'KHLG',\n",
" 'KHLN',\n",
" 'KHNR',\n",
" 'KHOB',\n",
" 'KHON',\n",
" 'KHOT',\n",
" 'KHOU',\n",
" 'KHPN',\n",
" 'KHQM',\n",
" 'KHRL',\n",
" 'KHRO',\n",
" 'KHSV',\n",
" 'KHTH',\n",
" 'KHTS',\n",
" 'KHUF',\n",
" 'KHUL',\n",
" 'KHUT',\n",
" 'KHVN',\n",
" 'KHVR',\n",
" 'KHXD',\n",
" 'KHYA',\n",
" 'KHYS',\n",
" 'KIAD',\n",
" 'KIAG',\n",
" 'KIAH',\n",
" 'KICR',\n",
" 'KICT',\n",
" 'KIDA',\n",
" 'KIDI',\n",
" 'KIEN',\n",
" 'KIJX',\n",
" 'KIKK',\n",
" 'KIL',\n",
" 'KILG',\n",
" 'KILM',\n",
" 'KIML',\n",
" 'KIMM',\n",
" 'KIND',\n",
" 'KINK',\n",
" 'KINL',\n",
" 'KINT',\n",
" 'KINW',\n",
" 'KIOB',\n",
" 'KIOW',\n",
" 'KIPL',\n",
" 'KIPT',\n",
" 'KISM',\n",
" 'KISN',\n",
" 'KISO',\n",
" 'KISP',\n",
" 'KISW',\n",
" 'KITH',\n",
" 'KIWD',\n",
" 'KIXA',\n",
" 'KJAC',\n",
" 'KJAN',\n",
" 'KJAX',\n",
" 'KJBR',\n",
" 'KJFK',\n",
" 'KJHW',\n",
" 'KJKL',\n",
" 'KJLN',\n",
" 'KJMR',\n",
" 'KJMS',\n",
" 'KJST',\n",
" 'KJVL',\n",
" 'KJXN',\n",
" 'KJYR',\n",
" 'KK68',\n",
" 'KKL',\n",
" 'KLAF',\n",
" 'KLAN',\n",
" 'KLAR',\n",
" 'KLAS',\n",
" 'KLAX',\n",
" 'KLBB',\n",
" 'KLBE',\n",
" 'KLBF',\n",
" 'KLBL',\n",
" 'KLBX',\n",
" 'KLCB',\n",
" 'KLCG',\n",
" 'KLCH',\n",
" 'KLCK',\n",
" 'KLDM',\n",
" 'KLDN',\n",
" 'KLEB',\n",
" 'KLEE',\n",
" 'KLEW',\n",
" 'KLEX',\n",
" 'KLFK',\n",
" 'KLFT',\n",
" 'KLG',\n",
" 'KLGA',\n",
" 'KLGB',\n",
" 'KLGU',\n",
" 'KLIT',\n",
" 'KLJF',\n",
" 'KLKN',\n",
" 'KLMT',\n",
" 'KLND',\n",
" 'KLNK',\n",
" 'KLNL',\n",
" 'KLNR',\n",
" 'KLNS',\n",
" 'KLOL',\n",
" 'KLOZ',\n",
" 'KLRD',\n",
" 'KLRU',\n",
" 'KLS',\n",
" 'KLSE',\n",
" 'KLUK',\n",
" 'KLVK',\n",
" 'KLVS',\n",
" 'KLWB',\n",
" 'KLWM',\n",
" 'KLWS',\n",
" 'KLWT',\n",
" 'KLWV',\n",
" 'KLXL',\n",
" 'KLXN',\n",
" 'KLYH',\n",
" 'KLZK',\n",
" 'KMAF',\n",
" 'KMBL',\n",
" 'KMBS',\n",
" 'KMCB',\n",
" 'KMCE',\n",
" 'KMCI',\n",
" 'KMCN',\n",
" 'KMCO',\n",
" 'KMCW',\n",
" 'KMDH',\n",
" 'KMDN',\n",
" 'KMDT',\n",
" 'KMDW',\n",
" 'KMDZ',\n",
" 'KMEI',\n",
" 'KMEM',\n",
" 'KMFD',\n",
" 'KMFE',\n",
" 'KMFR',\n",
" 'KMGC',\n",
" 'KMGM',\n",
" 'KMGW',\n",
" 'KMHE',\n",
" 'KMHK',\n",
" 'KMHR',\n",
" 'KMHT',\n",
" 'KMHV',\n",
" 'KMHX',\n",
" 'KMIA',\n",
" 'KMIB',\n",
" 'KMIV',\n",
" 'KMKC',\n",
" 'KMKE',\n",
" 'KMKG',\n",
" 'KMKL',\n",
" 'KMKX',\n",
" 'KMLB',\n",
" 'KMLC',\n",
" 'KMLI',\n",
" 'KMLS',\n",
" 'KMLT',\n",
" 'KMLU',\n",
" 'KMML',\n",
" 'KMMU',\n",
" 'KMNM',\n",
" 'KMOB',\n",
" 'KMOP',\n",
" 'KMOT',\n",
" 'KMPH',\n",
" 'KMPV',\n",
" 'KMQT',\n",
" 'KMRB',\n",
" 'KMRJ',\n",
" 'KMRY',\n",
" 'KMSL',\n",
" 'KMSN',\n",
" 'KMSO',\n",
" 'KMSP',\n",
" 'KMSS',\n",
" 'KMSV',\n",
" 'KMSY',\n",
" 'KMTH',\n",
" 'KMTJ',\n",
" 'KMTN',\n",
" 'KMTO',\n",
" 'KMTW',\n",
" 'KMVL',\n",
" 'KMWH',\n",
" 'KMYR',\n",
" 'KMYZ',\n",
" 'KNA',\n",
" 'KNEW',\n",
" 'KNL',\n",
" 'KNSI',\n",
" 'KOAJ',\n",
" 'KOAK',\n",
" 'KOFK',\n",
" 'KOGA',\n",
" 'KOGB',\n",
" 'KOGD',\n",
" 'KOKC',\n",
" 'KOLM',\n",
" 'KOLU',\n",
" 'KOMA',\n",
" 'KONL',\n",
" 'KONT',\n",
" 'KOPF',\n",
" 'KOQU',\n",
" 'KORD',\n",
" 'KORE',\n",
" 'KORF',\n",
" 'KORH',\n",
" 'KOSH',\n",
" 'KOTH',\n",
" 'KOTM',\n",
" 'KOTX',\n",
" 'KOVO',\n",
" 'KOWB',\n",
" 'KP11',\n",
" 'KP28',\n",
" 'KP38',\n",
" 'KP59',\n",
" 'KP60',\n",
" 'KPAE',\n",
" 'KPAH',\n",
" 'KPBF',\n",
" 'KPBG',\n",
" 'KPBI',\n",
" 'KPDK',\n",
" 'KPDT',\n",
" 'KPDX',\n",
" 'KPEQ',\n",
" 'KPFN',\n",
" 'KPGA',\n",
" 'KPGV',\n",
" 'KPHD',\n",
" 'KPHF',\n",
" 'KPHG',\n",
" 'KPHL',\n",
" 'KPHN',\n",
" 'KPHX',\n",
" 'KPIA',\n",
" 'KPIB',\n",
" 'KPIE',\n",
" 'KPIH',\n",
" 'KPIR',\n",
" 'KPIT',\n",
" 'KPKB',\n",
" 'KPLN',\n",
" 'KPMD',\n",
" 'KPNA',\n",
" 'KPNC',\n",
" 'KPNE',\n",
" 'KPNS',\n",
" 'KPNT',\n",
" 'KPOB',\n",
" 'KPOE',\n",
" 'KPOF',\n",
" 'KPOU',\n",
" 'KPOY',\n",
" 'KPQI',\n",
" 'KPRB',\n",
" 'KPRC',\n",
" 'KPSC',\n",
" 'KPSF',\n",
" 'KPSM',\n",
" 'KPSO',\n",
" 'KPSP',\n",
" 'KPTK',\n",
" 'KPUB',\n",
2018-10-05 17:09:43 -06:00
" ...]"
2018-09-05 15:52:38 -06:00
]
},
"execution_count": 3,
2018-09-05 15:52:38 -06:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"locations = DataAccessLayer.getAvailableLocationNames(request)\n",
"locations.sort()\n",
"list(locations)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setting the Location Name\n",
"\n",
"In this case we're setting the location name to `KFRM` which is the Municipal Airport in Fairmont, Minnesota."
]
},
2018-09-05 15:52:38 -06:00
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"request.setLocationNames(\"KFRM\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Filtering by 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": "code",
"execution_count": 5,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"cycles = DataAccessLayer.getAvailableTimes(request, True)\n",
"times = DataAccessLayer.getAvailableTimes(request)\n",
"\n",
"try:\n",
" fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)\n",
" list(fcstRun)\n",
" response = DataAccessLayer.getGeometryData(request,[fcstRun[0]])\n",
"except:\n",
" print('No times available')\n",
" exit"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
2018-09-05 15:52:38 -06:00
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get the Data!\n",
"\n",
"Here we can now request our data response from the EDEX server with our defined time filter.\n",
"Printing out some data about the response verifies we received the data we were interested in."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 6,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"parms = ['temperature', 'pressure', 'vComp', 'uComp', 'specHum']\n",
"site = KFRM\n",
"geom = POINT (-94.41999816894531 43.650001525878906)\n",
"datetime = 2025-02-12 18:00:00 (0)\n",
"reftime = Feb 12 25 18:00:00 GMT\n",
"fcstHour = 0\n",
"period = (Feb 12 25 18:00:00 , Feb 12 25 18:00:00 )\n"
2018-09-05 15:52:38 -06:00
]
}
],
"source": [
"obj = response[0]\n",
"\n",
"print(\"parms = \" + str(obj.getParameters()))\n",
"print(\"site = \" + str(obj.getLocationName()))\n",
"print(\"geom = \" + str(obj.getGeometry()))\n",
"print(\"datetime = \" + str(obj.getDataTime()))\n",
"print(\"reftime = \" + str(obj.getDataTime().getRefTime()))\n",
"print(\"fcstHour = \" + str(obj.getDataTime().getFcstTime()))\n",
"print(\"period = \" + str(obj.getDataTime().getValidPeriod()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Use the Data!\n",
"\n",
"Since we filtered on time, and requested the data in the previous cell, we now have a `response` object we can work with."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prepare data objects\n",
"\n",
"Here we construct arrays for each parameter to plot (temperature, pressure, moisture (spec. humidity), wind components, and cloud cover). We have two sets of arrays for temperature and pressure, where the second set only has values as long as the specific humidity is not zero. That is because we are going to do some calculations with specific humidity, temperature, and pressure and we need all those arrays to be the same length, and for the specific humidty to not equal zero."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Create new arrays to populate from our response objects\n",
"tmp,prs,sh,prs2,tmp2 = np.array([]),np.array([]),np.array([]),np.array([]),np.array([])\n",
"uc,vc = np.array([]),np.array([])\n",
2018-09-05 15:52:38 -06:00
"\n",
"# Cycle through all response objects to populate new arrays\n",
2018-09-05 15:52:38 -06:00
"for ob in response:\n",
2018-10-05 17:09:43 -06:00
" tmp = np.append(tmp,ob.getNumber(\"temperature\"))\n",
" prs = np.append(prs,ob.getNumber(\"pressure\"))\n",
" uc = np.append(uc,ob.getNumber(\"uComp\"))\n",
" vc = np.append(vc,ob.getNumber(\"vComp\"))\n",
" # don't include data with 0 specific humidity\n",
" if(ob.getNumber(\"specHum\")==0):\n",
" continue\n",
" sh = np.append(sh,ob.getNumber(\"specHum\"))\n",
" prs2 = np.append(prs2,ob.getNumber(\"pressure\"))\n",
" tmp2 = np.append(tmp2,ob.getNumber(\"temperature\"))"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Calculate Dewpoint from Specific Humidity\n",
2018-09-05 15:52:38 -06:00
"\n",
"Because the modelsounding plugin does not return dewpoint values, we must calculate the profile ourselves. Here are three examples of dewpoint calculated from specific humidity, including a manual calculation following NCEP AWIPS/NSHARP. \n",
"\n",
"First, we'll set up variables that are used in all three methods (and later in the notebook)."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"tfull = (tmp-273.15) * units.degC\n",
"t = (tmp2-273.15) * units.degC\n",
"\n",
"pfull = prs/100 * units.mbar\n",
"p = prs2/100 * units.mbar\n",
2018-09-05 15:52:38 -06:00
"\n",
"u,v = uc*1.94384,vc*1.94384 # m/s to knots\n",
2020-09-04 10:34:52 -06:00
"spd = wind_speed(u*units.knots, v*units.knots)\n",
"dir = wind_direction(u*units.knots, v*units.knots) * units.deg"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Method 1\n",
"\n",
"Here we'll calculate the dewpoint using MetPy calculated mixing ratio and the vapor pressure."
]
},
2018-09-05 15:52:38 -06:00
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-17.861027609224152 -18.296283305867178 -18.61873165139778 -18.956045264648424 -19.17502589815922 -19.67533661570917 -20.060517352662544 -20.60677624765424 -21.034562441122517 -20.47030103586505 -20.095639271448306 -19.765441774539482 -19.47765111329744 -19.118520675916415 -19.039256945399615 -19.220687869449876 -19.659848697746412 -20.35989694232248 -21.34132106267046 -22.510151905707176 -23.891435648286034 -25.377619126624808 -26.823631224180673 -28.373325286396692 -29.322811329792188 -29.28950476725845 -32.316697089981005 -37.609577734507525 -42.2249867107964 -46.4725928841666 -50.779120288769434 -59.06429640317202 -70.0497515867722 -70.71615305853982] degree_Celsius\n"
]
}
],
2018-09-05 15:52:38 -06:00
"source": [
"rmix = (sh/(1-sh)) *1000 * units('g/kg')\n",
"e = vapor_pressure(p, rmix)\n",
"td = dewpoint(e)\n",
"print(td)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Method 2\n",
"\n",
"Here we'll calculate dewpoint using MetPy while assuming the mixing ratio is equal to the specific humidity."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-17.872374594539878 -18.307233712088532 -18.62941615219512 -18.966463858936493 -19.185307466171594 -19.685223771445862 -20.07013889228719 -20.616005053394304 -21.04352622946604 -20.479887317174047 -20.105720862492916 -19.776017591322585 -19.4887197093349 -19.130208537923124 -19.051303531109 -19.23283161612025 -19.671828764230696 -20.371455840693898 -21.352206267145135 -22.520243304233674 -23.900618221790864 -25.385905205061363 -26.831154201846743 -28.38009666226398 -29.329310144996413 -29.296431567874123 -32.322083827390884 -37.61282774776876 -42.22705759872292 -46.4739459966614 -50.77998341031628 -59.064612626911355 -70.04982150804739 -70.7162224435676] degree_Celsius\n"
]
}
],
2018-09-05 15:52:38 -06:00
"source": [
"td2 = dewpoint(vapor_pressure(p, sh))\n",
"print(td2)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Method 3\n",
2018-09-05 15:52:38 -06:00
"\n",
"Here we use logic from the NCEP AWIPS soundingrequest plugin. This logic was based on [GEMPAK and NSHARP calculations](https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783)."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
"execution_count": 11,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-17.856866063572326 -18.292352624634983 -18.61495502652454 -18.95242234278033 -19.17148109212604 -19.67201981493028 -20.057352947508043 -20.603837750203628 -21.031774978696657 -20.467148227064524 -20.09219397247566 -19.76170356716989 -19.473619844784952 -19.11412104616787 -19.034640805389554 -19.21600817115405 -19.655258048229165 -20.355545859726377 -21.337356589010316 -22.5066427651069 -23.88844692083168 -25.37514098495366 -26.82158360694533 -28.3716989735814 -29.321328899510995 -29.287762680418876 -32.315822657544324 -37.609884107908435 -42.22590892550121 -46.47386041955892 -50.7805953411855 -59.065935666579605 -70.05132888695185 -70.71771826198025] degree_Celsius\n"
]
}
],
2018-09-05 15:52:38 -06:00
"source": [
"# new arrays\n",
"ntmp = tmp2\n",
2018-09-05 15:52:38 -06:00
"\n",
"# where p=pressure(pa), T=temp(C), T0=reference temp(273.16)\n",
"rh = 0.263*prs2*sh / (np.exp(17.67*ntmp/(ntmp+273.15-29.65)))\n",
2018-09-05 15:52:38 -06:00
"vaps = 6.112 * np.exp((17.67 * ntmp) / (ntmp + 243.5))\n",
"vapr = rh * vaps / 100\n",
"dwpc = np.array(243.5 * (np.log(6.112) - np.log(vapr)) / (np.log(vapr) - np.log(6.112) - 17.67)) * units.degC\n",
"print(dwpc)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
2018-09-05 15:52:38 -06:00
"metadata": {},
"source": [
"## Plot the Data!\n",
"\n",
"Create and display SkewT and Hodograph plots using MetPy.\n",
"\n",
"Since we're displaying all three dewpoint plots, we also create a \"zoomed in\" view to highlight the slight differences between the three calculations."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [
{
"data": {
"image/png": "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
2018-09-05 15:52:38 -06:00
"text/plain": [
"<Figure size 1200x1400 with 3 Axes>"
2018-09-05 15:52:38 -06:00
]
},
"metadata": {},
2018-09-05 15:52:38 -06:00
"output_type": "display_data"
}
],
"source": [
"# Create a new figure and define the size\n",
"fig = plt.figure(figsize=(12, 14))\n",
2018-09-05 15:52:38 -06:00
"\n",
"# Create a skewT plot\n",
"skew = SkewT(fig)\n",
2018-09-05 15:52:38 -06:00
"\n",
"# Plot the data\n",
"skew.plot(pfull, tfull, 'r', linewidth=2)\n",
2018-09-05 15:52:38 -06:00
"skew.plot(p, td, 'b', linewidth=2)\n",
"skew.plot(p, td2, 'y', linewidth=2)\n",
2018-09-05 15:52:38 -06:00
"skew.plot(p, dwpc, 'g', linewidth=2)\n",
"skew.plot_barbs(pfull, u, v)\n",
"# set the domain and range (these may need to be adjusted\n",
"# depending on the exact data for best viewing purposes)\n",
2018-09-05 15:52:38 -06:00
"skew.ax.set_ylim(1000, 100)\n",
"skew.ax.set_xlim(-70, 40)\n",
2018-09-05 15:52:38 -06:00
"\n",
"# Add title to the plot\n",
"# format: \"2022-08-18 18Z FH 0 | GFS KFRM (43.65,-94.42)\"\n",
"datetime = str(ob.getDataTime())[0:-6]+\"Z\"\n",
"forecastHr = str(ob.getDataTime().getFcstTime())\n",
"site = ob.getLocationName()\n",
"lat = \"{:.2f}\".format(ob.getGeometry().y)\n",
"lon = \"{:.2f}\".format(ob.getGeometry().x)\n",
"coords = \"(\" + lat + \", \" + lon +\")\"\n",
"\n",
"title = datetime + \" FH \" + forecastHr + \" | \" + forecastModel + \" \" + site + \" \" + coords\n",
"plt.title(title)\n",
"\n",
"# Create a secondary axes for the \"zoomed in\" view\n",
"zoom_ax = inset_axes(skew.ax, '35%', '35%', loc=3,\n",
" bbox_to_anchor=(.05, .05, 1, 1),\n",
" bbox_transform=skew.ax.transAxes)\n",
"# create a secondary plot for zoomed in section\n",
"fig2 = plt.figure()\n",
"skew2 = SkewT(fig2)\n",
"skew2.ax = zoom_ax\n",
"skew2.plot(p, td, 'b', linewidth=2, label='MetPy calculated mixing ratio')\n",
"skew2.plot(p, td2, 'y', linewidth=2, label='MetPy spec. hum = mixing ratio')\n",
"skew2.plot(p, dwpc, 'g', linewidth=2, label='GEMPAK legacy caluclation')\n",
"# create a legend to explain the three lines\n",
"skew2.ax.legend(loc=1)\n",
"# remove the axis title on the zoomed plot since they\n",
"# are redundant and just clutter the plot\n",
"skew2.ax.set_xlabel(\"\")\n",
"skew2.ax.set_ylabel(\"\")\n",
"# these exact bounds may need to change depending on\n",
"# the most recent data\n",
"skew2.ax.set_ylim(970, 900)\n",
"skew2.ax.set_xlim(-29, -26)\n",
"\n",
"# draw an indicator in the main plot of the \"zoomed in\" region\n",
"skew.ax.indicate_inset_zoom(zoom_ax, edgecolor=\"black\")\n",
"\n",
"# dispose of the second figure, since creating a new\n",
"# skewt in metpy automatically creates a new figure\n",
"# which is unnecessary in this case\n",
"plt.close(fig2)\n",
2018-09-05 15:52:38 -06:00
"\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=1)\n",
"h = Hodograph(ax_hod, component_range=spd.max()/units.knots)\n",
2018-09-05 15:52:38 -06:00
"h.add_grid(increment=20)\n",
"h.plot_colormapped(u, v, spd)\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
},
{
"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",
"* [Upper Air BUFR Soundings](http://unidata.github.io/python-awips/examples/generated/Upper_Air_BUFR_Soundings.html)\n",
"* [Forecast Model Vertical Sounding](http://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html)\n",
"\n",
"### Additional Documentation\n",
"\n",
"**python-awips:**\n",
"\n",
"* [awips.DataAccessLayer](http://unidata.github.io/python-awips/api/DataAccessLayer.html)\n",
"* [awips.PyGeometryData](http://unidata.github.io/python-awips/api/PyGeometryData.html)\n",
"\n",
"**matplotlib:**\n",
"\n",
"* [matplotlib.pyplot](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html)\n",
"\n",
"**MetPy**\n",
"\n",
"* [metpy.wind_speed](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_speed.html)\n",
"* [metpy.wind_direction](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_direction.html)\n",
"* [metpy.vapor_pressure](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.vapor_pressure.html)\n",
"* [metpy.dewpoint](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html)\n",
"* [metpy.skewt](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html)\n",
"* [metpy.hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.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 (ipykernel)",
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.13.1"
},
"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
}