From 8b78410b64e79370bf793a222d1d34575125c80b Mon Sep 17 00:00:00 2001 From: mckenna-stanford <85080500+mckenna-stanford@users.noreply.github.com> Date: Mon, 12 Jun 2023 01:15:05 -0400 Subject: [PATCH] Delete plot_fog_cases.ipynb --- plot_fog_cases.ipynb | 2083 ------------------------------------------ 1 file changed, 2083 deletions(-) delete mode 100644 plot_fog_cases.ipynb diff --git a/plot_fog_cases.ipynb b/plot_fog_cases.ipynb deleted file mode 100644 index ad1b20e..0000000 --- a/plot_fog_cases.ipynb +++ /dev/null @@ -1,2083 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "43dde760", - "metadata": {}, - "outputs": [], - "source": [ - "#============================================================================\n", - "# plot_fog_cases.ipynb\n", - "# Author: McKenna W. Stanford\n", - "#============================================================================" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "0bb09391", - "metadata": {}, - "outputs": [], - "source": [ - "#==================================================\n", - "# Imports\n", - "#==================================================\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import glob\n", - "import xarray\n", - "import datetime\n", - "import calendar\n", - "from matplotlib.gridspec import GridSpec\n", - "import matplotlib.dates as mdates\n", - "import matplotlib\n", - "import pickle\n", - "import pandas as pd\n", - "import os\n", - "from file_struct import file_struct as fs\n", - "from load_sonde_data import load_sonde_data\n", - "from give_me_files_and_subfolders import give_me_files_and_subfolders\n", - "from scipy import ndimage\n", - "from scipy.ndimage import gaussian_filter\n", - "from scipy.interpolate import NearestNDInterpolator as nn\n", - "from matplotlib.patches import Rectangle\n", - "from matplotlib import cm\n", - "import matplotlib.ticker as ticker\n", - "from scipy import stats\n", - "import matplotlib.patches as mpatches\n", - "from dask.distributed import Client, progress, LocalCluster\n", - "import time\n", - "import ctypes\n", - "#from mpl_toolkits.axes_grid.inset_locator import (inset_axes, InsetPosition,\n", - "# mark_inset)\n", - "import seaborn as sns\n", - "from matplotlib.colors import Normalize \n", - "from scipy.interpolate import interpn\n", - "from matplotlib.lines import Line2D\n", - "import matplotlib.colors as colors\n", - "import ctypes\n", - "import matplotlib.patheffects as pe\n", - "import palettable" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "80f2d362", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "#--------------------------------------------\n", - "# Functions\n", - "#--------------------------------------------\n", - "def toTimestamp(d):\n", - " return calendar.timegm(d.timetuple())\n", - "\n", - "def toDatetime(d):\n", - " return datetime.datetime.utcfromtimestamp(d)\n", - "\n", - "def find_nearest(array, value):\n", - " array = np.asarray(array)\n", - " idx = (np.abs(array - value)).argmin()\n", - " return array[idx],idx \n", - "\n", - "# function to make serial date numbers which are the number of days that have passed\n", - "# since epoch beginning given as days.fraction_of_day\n", - "def datenum(d):\n", - " return 366 + d.toordinal() + (d - datetime.datetime.fromordinal(d.toordinal())).total_seconds()/(24*60*60)\n", - "#--------------------------------------------\n", - "#--------------------------------------------\n", - "#--------------------------------------------\n", - "# Trim Memory\n", - "#--------------------------------------------\n", - "def trim_memory() -> int:\n", - " libc = ctypes.CDLL(\"libc.so.6\")\n", - " return libc.malloc_trim(0)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "06ce6235-f103-4c68-8555-ee29b04170bf", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "345\n" - ] - } - ], - "source": [ - "path = '/mnt/raid/mwstanfo/micre/merged_instrument_files/'\n", - "files = glob.glob(path+'*_v3arm.p')\n", - "files = sorted(files)\n", - "print(len(files))" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "f4294deb-2905-4573-bfd6-aa82013a87dc", - "metadata": {}, - "outputs": [], - "source": [ - "# make date array\n", - "dates = []\n", - "for infile in files[0:]:\n", - " dumstr = infile.split('/')\n", - " dumstr = dumstr[-1]\n", - " dumstr = dumstr.split('.')\n", - " dumstr = dumstr[0]\n", - " dumstr = dumstr.split('_')\n", - " dumstr = dumstr[-2]\n", - " dumstr_year = dumstr[0:4]\n", - " dumstr_month = dumstr[4:6]\n", - " dumstr_day = dumstr[6:]\n", - " date = datetime.datetime(int(dumstr_year),int(dumstr_month),int(dumstr_day))\n", - " dates.append(date)\n", - "dates = np.array(dates)\n", - "\n", - "target_date_1a = datetime.datetime(2016,4,14,0,0)\n", - "target_date_1b = datetime.datetime(2016,4,15,0,0)\n", - "target_date_2a = datetime.datetime(2016,5,21,0,0)\n", - "target_date_2b = datetime.datetime(2016,5,22,0,0)\n", - "target_date_2c = datetime.datetime(2016,5,23,0,0)\n", - "target_dates = [target_date_1a,target_date_1b,target_date_2a,target_date_2b,target_date_2c]\n", - "\n", - "target_date_1_start_time = datetime.datetime(2016,4,14,23,0)\n", - "target_date_1_end_time = datetime.datetime(2016,4,16,0,0)\n", - "target_date_2_start_time = datetime.datetime(2016,5,22,11,0)\n", - "target_date_2_end_time = datetime.datetime(2016,5,23,12,0)\n", - "\n", - "\n", - "target_dates_ids = np.where( (dates == target_date_1a) | (dates == target_date_1b) | (dates == target_date_2a) | (dates == target_date_2b) | (dates == target_date_2c) )[0]\n", - "\n", - "files_lim = []\n", - "dates_lim = []\n", - "for ii in range(len(target_dates_ids)):\n", - " files_lim.append(files[target_dates_ids[ii]])\n", - " dates_lim.append(dates[target_dates_ids[ii]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "662c9d20-6418-4b36-82eb-f6bcd0b1a229", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "a5b13c99-09c2-4989-8a24-90fb5abf6ee7", - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_theme()\n", - "#sns.set_style('dark')\n", - "sns.set_style('ticks')\n", - "#sns.set(rc={'axes.facecolor':'white','axes.edgecolor': 'black','grid.color':'grey'})\n", - "sns.set_context('talk') " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "fbccc360-5d3c-4b2a-89b0-345822bd74ed", - "metadata": {}, - "outputs": [], - "source": [ - "#-----------------------------------------------------------\n", - "# Grab Variables and Merge\n", - "#-----------------------------------------------------------\n", - "merged_dict_1a = pickle.load(open(files_lim[0],\"rb\"))\n", - "merged_dict_1b = pickle.load(open(files_lim[1],\"rb\"))\n", - "merged_dict_2a = pickle.load(open(files_lim[2],\"rb\"))\n", - "merged_dict_2b = pickle.load(open(files_lim[3],\"rb\"))\n", - "merged_dict_2c = pickle.load(open(files_lim[4],\"rb\"))\n", - "\n", - "merged_dicts = [merged_dict_1a,merged_dict_1b,merged_dict_2a,merged_dict_2b,merged_dict_2c]\n", - "\n", - "basta_ref_1a = merged_dict_1a['basta']['ref']\n", - "basta_ref_1b = merged_dict_1b['basta']['ref']\n", - "basta_ref_2a = merged_dict_2a['basta']['ref']\n", - "basta_ref_2b = merged_dict_2b['basta']['ref']\n", - "basta_ref_2c = merged_dict_2c['basta']['ref']\n", - "\n", - "basta_vel_1a = merged_dict_1a['basta']['vel']\n", - "basta_vel_1b = merged_dict_1b['basta']['vel']\n", - "basta_vel_2a = merged_dict_2a['basta']['vel']\n", - "basta_vel_2b = merged_dict_2b['basta']['vel']\n", - "basta_vel_2c = merged_dict_2c['basta']['vel']\n", - "\n", - "basta_time_1a = merged_dict_1a['basta']['time_dt']\n", - "basta_time_1b = merged_dict_1b['basta']['time_dt']\n", - "basta_time_2a = merged_dict_2a['basta']['time_dt']\n", - "basta_time_2b = merged_dict_2b['basta']['time_dt']\n", - "basta_time_2c = merged_dict_2c['basta']['time_dt']\n", - "\n", - "basta_height = merged_dict_1a['basta']['height']\n", - "height_lim_id = np.where(basta_height <= 1000.)[0]\n", - "\n", - "#date1_basta_time = basta_time_1\n", - "#date1_basta_ref = basta_ref_1[height_lim_id,:]\n", - "#date1_basta_vel = basta_vel_1[height_lim_id,:]\n", - "\n", - "date1_basta_time = np.concatenate((basta_time_1a,basta_time_1b))\n", - "date1_time_id = np.where( (date1_basta_time >= target_date_1_start_time) & (date1_basta_time <= target_date_1_end_time) )[0]\n", - "date1_basta_time = date1_basta_time[date1_time_id]\n", - "\n", - "\n", - "basta_ref_1 = np.concatenate((basta_ref_1a,basta_ref_1b),axis=1)\n", - "basta_ref_1 = basta_ref_1[:,date1_time_id]\n", - "date1_basta_ref = basta_ref_1[height_lim_id,:]\n", - "\n", - "basta_vel_1 = np.concatenate((basta_vel_1a,basta_vel_1b),axis=1)\n", - "basta_vel_1 = basta_vel_1[:,date1_time_id]\n", - "date1_basta_vel = basta_vel_1[height_lim_id,:]\n", - "\n", - "\n", - "\n", - "date2_basta_time = np.concatenate((basta_time_2a,basta_time_2b,basta_time_2c))\n", - "date2_time_id = np.where( (date2_basta_time >= target_date_2_start_time) & (date2_basta_time <= target_date_2_end_time) )[0]\n", - "date2_basta_time = date2_basta_time[date2_time_id]\n", - "\n", - "basta_ref_2 = np.concatenate((basta_ref_2a,basta_ref_2b,basta_ref_2c),axis=1)\n", - "basta_ref_2 = basta_ref_2[:,date2_time_id]\n", - "date2_basta_ref = basta_ref_2[height_lim_id,:]\n", - "\n", - "basta_vel_2 = np.concatenate((basta_vel_2a,basta_vel_2b,basta_vel_2c),axis=1)\n", - "basta_vel_2 = basta_vel_2[:,date2_time_id]\n", - "date2_basta_vel = basta_vel_2[height_lim_id,:]\n", - "\n", - "basta_height = basta_height[height_lim_id]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "3fd60ee2-70b5-4b05-8f3b-0cde80f04b2e", - "metadata": {}, - "outputs": [], - "source": [ - "date1a_ceil_time = merged_dict_1a['aad_ceil']['native_time_dt']\n", - "date1a_ceil_cbh = merged_dict_1a['aad_ceil']['native_cbh_1']\n", - "date1a_ceil_backscatter = merged_dict_1a['aad_ceil']['native_backscatter']\n", - "date1a_ceil_detection_status = merged_dict_1a['aad_ceil']['native_detection_status']\n", - "ceil_height = merged_dict_1a['aad_ceil']['native_range']\n", - "date1b_ceil_time = merged_dict_1b['aad_ceil']['native_time_dt']\n", - "date1b_ceil_cbh = merged_dict_1b['aad_ceil']['native_cbh_1']\n", - "date1b_ceil_backscatter = merged_dict_1b['aad_ceil']['native_backscatter']\n", - "date1b_ceil_detection_status = merged_dict_1b['aad_ceil']['native_detection_status']\n", - "\n", - "date1_ceil_time = np.concatenate((date1a_ceil_time,date1b_ceil_time))\n", - "date1_ceil_cbh = np.concatenate((date1a_ceil_cbh,date1b_ceil_cbh))\n", - "date1_ceil_backscatter = np.concatenate((date1a_ceil_backscatter,date1b_ceil_backscatter))\n", - "\n", - "\n", - "height_lim_id = np.where(ceil_height <= 1000.)[0]\n", - "ceil_height = ceil_height[height_lim_id]\n", - "\n", - "date1_time_id = np.where( (date1_ceil_time >= target_date_1_start_time) & (date1_ceil_time <= target_date_1_end_time) )[0]\n", - "date1_ceil_time = date1_ceil_time[date1_time_id]\n", - "date1_ceil_cbh = date1_ceil_cbh[date1_time_id]\n", - "date1_ceil_backscatter = date1_ceil_backscatter[date1_time_id,:]\n", - "date1_ceil_backscatter = date1_ceil_backscatter[:,height_lim_id]\n", - "\n", - "\n", - "date2a_ceil_time = merged_dict_2a['aad_ceil']['native_time_dt']\n", - "date2a_ceil_cbh = merged_dict_2a['aad_ceil']['native_cbh_1']\n", - "date2a_ceil_backscatter = merged_dict_2a['aad_ceil']['native_backscatter']\n", - "date2a_ceil_detection_status = merged_dict_2a['aad_ceil']['native_detection_status']\n", - "\n", - "date2b_ceil_time = merged_dict_2b['aad_ceil']['native_time_dt']\n", - "date2b_ceil_cbh = merged_dict_2b['aad_ceil']['native_cbh_1']\n", - "date2b_ceil_backscatter = merged_dict_2b['aad_ceil']['native_backscatter']\n", - "date2b_ceil_detection_status = merged_dict_2b['aad_ceil']['native_detection_status']\n", - "\n", - "date2c_ceil_time = merged_dict_2c['aad_ceil']['native_time_dt']\n", - "date2c_ceil_cbh = merged_dict_2c['aad_ceil']['native_cbh_1']\n", - "date2c_ceil_backscatter = merged_dict_2c['aad_ceil']['native_backscatter']\n", - "date2c_ceil_detection_status = merged_dict_2c['aad_ceil']['native_detection_status']\n", - "\n", - "date2_ceil_time = np.concatenate((date2a_ceil_time,date2b_ceil_time,date2c_ceil_time))\n", - "date2_ceil_cbh = np.concatenate((date2a_ceil_cbh,date2b_ceil_cbh,date2c_ceil_cbh))\n", - "date2_ceil_backscatter = np.concatenate((date2a_ceil_backscatter,date2b_ceil_backscatter,date2c_ceil_backscatter))\n", - "\n", - "date2_time_id = np.where( (date2_ceil_time >= target_date_2_start_time) & (date2_ceil_time <= target_date_2_end_time) )[0]\n", - "date2_ceil_time = date2_ceil_time[date2_time_id]\n", - "date2_ceil_cbh = date2_ceil_cbh[date2_time_id]\n", - "date2_ceil_backscatter = date2_ceil_backscatter[date2_time_id,:]\n", - "\n", - "date2_ceil_backscatter = date2_ceil_backscatter[:,height_lim_id]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "9aeed7e5-e796-41bc-9487-598541200564", - "metadata": {}, - "outputs": [], - "source": [ - "# SFC Met\n", - "\n", - "# date 1\n", - "date1a_sfc_time = merged_dict_1a['sfc_met']['native_time_dt']\n", - "date1a_sfc_temp = merged_dict_1a['sfc_met']['native_temperature']\n", - "date1a_sfc_rh = merged_dict_1a['sfc_met']['native_rh']\n", - "\n", - "date1b_sfc_time = merged_dict_1b['sfc_met']['native_time_dt']\n", - "date1b_sfc_temp = merged_dict_1b['sfc_met']['native_temperature']\n", - "date1b_sfc_rh = merged_dict_1b['sfc_met']['native_rh']\n", - "\n", - "date1_sfc_time = np.concatenate((date1a_sfc_time,date1b_sfc_time))\n", - "date1_sfc_temp = np.concatenate((date1a_sfc_temp,date1b_sfc_temp))\n", - "date1_sfc_rh = np.concatenate((date1a_sfc_rh,date1b_sfc_rh))\n", - "\n", - "date1_time_id = np.where( (date1_sfc_time >= target_date_1_start_time) & (date1_sfc_time <= target_date_1_end_time) )[0]\n", - "date1_sfc_time = list(date1_sfc_time[date1_time_id])\n", - "date1_sfc_temp = date1_sfc_temp[date1_time_id]\n", - "date1_sfc_rh = date1_sfc_rh[date1_time_id]\n", - "\n", - "# date 2\n", - "date2a_sfc_time = merged_dict_2a['sfc_met']['native_time_dt']\n", - "date2a_sfc_temp = merged_dict_2a['sfc_met']['native_temperature']\n", - "date2a_sfc_rh = merged_dict_2a['sfc_met']['native_rh']\n", - "\n", - "date2b_sfc_time = merged_dict_2b['sfc_met']['native_time_dt']\n", - "date2b_sfc_temp = merged_dict_2b['sfc_met']['native_temperature']\n", - "date2b_sfc_rh = merged_dict_2b['sfc_met']['native_rh']\n", - "\n", - "date2c_sfc_time = merged_dict_2c['sfc_met']['native_time_dt']\n", - "date2c_sfc_temp = merged_dict_2c['sfc_met']['native_temperature']\n", - "date2c_sfc_rh = merged_dict_2c['sfc_met']['native_rh']\n", - "\n", - "date2_sfc_time = np.concatenate((date2a_sfc_time,date2b_sfc_time,date2c_sfc_time))\n", - "date2_sfc_temp = np.concatenate((date2a_sfc_temp,date2b_sfc_temp,date2c_sfc_temp))\n", - "date2_sfc_rh = np.concatenate((date2a_sfc_rh,date2b_sfc_rh,date2c_sfc_rh))\n", - "\n", - "date2_time_id = np.where( (date2_sfc_time >= target_date_2_start_time) & (date2_sfc_time <= target_date_2_end_time) )[0]\n", - "date2_sfc_time = list(date2_sfc_time[date2_time_id])\n", - "date2_sfc_temp = date2_sfc_temp[date2_time_id]\n", - "date2_sfc_rh = date2_sfc_rh[date2_time_id]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "2b9e48c8-09fa-48a5-8d5e-9d6e1c9c665e", - "metadata": {}, - "outputs": [], - "source": [ - "# Soundings\n", - "merged_dict_1b['native_sonde'].keys()\n", - "# Date 1\n", - "date1_sonde1_temp = merged_dict_1b['native_sonde']['1']['temperature']\n", - "date1_sonde2_temp = merged_dict_1b['native_sonde']['2']['temperature']\n", - "date1_sonde1_rh = merged_dict_1b['native_sonde']['1']['rh']\n", - "date1_sonde2_rh = merged_dict_1b['native_sonde']['2']['rh']\n", - "date1_sonde1_time = merged_dict_1b['native_sonde']['1']['time_dt']\n", - "date1_sonde2_time = merged_dict_1b['native_sonde']['2']['time_dt']\n", - "date1_sonde1_height = merged_dict_1b['native_sonde']['1']['height']\n", - "date1_sonde2_height = merged_dict_1b['native_sonde']['2']['height']\n", - "date1_sonde1_time_long = merged_dict_1b['native_sonde']['1']['time_dt_long']\n", - "date1_sonde2_time_long = merged_dict_1b['native_sonde']['2']['time_dt_long']\n", - "\n", - "height_lim_id = np.where(date1_sonde1_height*1.e-3 <= 1.)[0]\n", - "date1_sonde1_temp = date1_sonde1_temp[height_lim_id]\n", - "date1_sonde1_rh = date1_sonde1_rh[height_lim_id]\n", - "date1_sonde1_height = date1_sonde1_height[height_lim_id]\n", - "date1_sonde1_time_long = np.array(date1_sonde1_time_long)[height_lim_id]\n", - "\n", - "height_lim_id = np.where(date1_sonde2_height*1.e-3 <= 1.)[0]\n", - "date1_sonde2_temp = date1_sonde2_temp[height_lim_id]\n", - "date1_sonde2_rh = date1_sonde2_rh[height_lim_id]\n", - "date1_sonde2_height = date1_sonde2_height[height_lim_id]\n", - "date1_sonde2_time_long = np.array(date1_sonde2_time_long)[height_lim_id]\n", - "\n", - "# Date 2\n", - "date2_sonde1_temp = merged_dict_2b['native_sonde']['2']['temperature']\n", - "date2_sonde2_temp = merged_dict_2c['native_sonde']['2']['temperature']\n", - "date2_sonde1_rh = merged_dict_2b['native_sonde']['2']['rh']\n", - "date2_sonde2_rh = merged_dict_2c['native_sonde']['2']['rh']\n", - "date2_sonde1_time = merged_dict_2b['native_sonde']['2']['time_dt']\n", - "date2_sonde2_time = merged_dict_2c['native_sonde']['2']['time_dt']\n", - "date2_sonde1_height = merged_dict_2b['native_sonde']['2']['height']\n", - "date2_sonde2_height = merged_dict_2c['native_sonde']['2']['height']\n", - "date2_sonde1_time_long = merged_dict_2b['native_sonde']['2']['time_dt_long']\n", - "date2_sonde2_time_long = merged_dict_2c['native_sonde']['2']['time_dt_long']\n", - "\n", - "height_lim_id = np.where(date2_sonde1_height*1.e-3 <= 1.)[0]\n", - "date2_sonde1_temp = date2_sonde1_temp[height_lim_id]\n", - "date2_sonde1_rh = date2_sonde1_rh[height_lim_id]\n", - "date2_sonde1_height = date2_sonde1_height[height_lim_id]\n", - "date2_sonde1_time_long = np.array(date2_sonde1_time_long)[height_lim_id]\n", - "\n", - "height_lim_id = np.where(date2_sonde2_height*1.e-3 <= 1.)[0]\n", - "date2_sonde2_temp = date2_sonde2_temp[height_lim_id]\n", - "date2_sonde2_rh = date2_sonde2_rh[height_lim_id]\n", - "date2_sonde2_height = date2_sonde2_height[height_lim_id]\n", - "date2_sonde2_time_long = np.array(date2_sonde2_time_long)[height_lim_id]" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "d619a998-8f90-410f-8a3d-9a4825b1921b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_20949/3100984644.py:173: 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", - " ceil_plot = dum_ceil_ax.pcolormesh(date1_ceil_time,\\\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "done\n" - ] - } - ], - "source": [ - "#---------------------------------------------------\n", - "# Case Study 1\n", - "#---------------------------------------------------\n", - "\n", - "fig = plt.figure(figsize=(12,16))\n", - "gs = GridSpec(5,3) # 5 rows, 4 columns\n", - "Fontsize=12\n", - "dfmt = mdates.DateFormatter('%H:%M')\n", - "\n", - "date1_sonde1_ax = fig.add_subplot(gs[0,0])\n", - "date1_sonde2_ax = fig.add_subplot(gs[0,1])\n", - "\n", - "date1_basta_ref_ax = fig.add_subplot(gs[1,0:3])\n", - "\n", - "date1_basta_vel_ax = fig.add_subplot(gs[2,0:3])\n", - "\n", - "date1_ceil_ax = fig.add_subplot(gs[3,0:3])\n", - "\n", - "date1_sfc_ax = fig.add_subplot(gs[4,0:3])\n", - "\n", - "\n", - "date1_time_axlist = [date1_basta_ref_ax,date1_basta_vel_ax,date1_ceil_ax,date1_sfc_ax]\n", - "\n", - "for ax in date1_time_axlist:\n", - " date = dates[0]\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_xlabel('UTC Time [HH:MM]',fontsize=Fontsize)\n", - " ax.xaxis.set_major_formatter(dfmt)\n", - " ax.set_xlim(target_date_1_start_time,target_date_1_end_time)\n", - "\n", - "\n", - "\n", - "sonde_ax_list = [date1_sonde1_ax,date1_sonde2_ax]\n", - "for ax in sonde_ax_list:\n", - " ax.set_ylim(0,1)\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_ylabel('Height [km]',fontsize=Fontsize)\n", - "\n", - " \n", - "dum_time_delta = datetime.timedelta(seconds=15)\n", - "\n", - "height_axlist = [date1_basta_ref_ax,date1_basta_vel_ax,date1_ceil_ax]\n", - "for ax in height_axlist:\n", - " ax.set_ylabel('Height [km]',fontsize=Fontsize)\n", - " ax.set_ylim(0,1.)\n", - "\n", - "\n", - "#==============================================================\n", - "#==============================================================\n", - "# Date 1\n", - "#==============================================================\n", - "#==============================================================\n", - "dum_ref_ax = date1_basta_ref_ax\n", - "dum_vel_ax = date1_basta_vel_ax\n", - "dum_ceil_ax = date1_ceil_ax\n", - "dum_sfc_ax = date1_sfc_ax\n", - "dum_sonde1_ax = date1_sonde1_ax\n", - "dum_sonde2_ax = date1_sonde2_ax\n", - "\n", - "#--------------------------------------------------------------\n", - "# Sounding\n", - "#--------------------------------------------------------------\n", - "\n", - "# Sonde 1\n", - "dum_sonde1_ax.plot(date1_sonde1_temp-273.15,date1_sonde1_height*1.e-3,lw=2,c='red')\n", - "dum_sonde1_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde1_ax.spines['bottom'].set_color('red')\n", - "dum_sonde1_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde1_twinax = dum_sonde1_ax.twiny()\n", - "dum_sonde1_twinax.plot(date1_sonde1_rh,date1_sonde1_height*1.e-3,lw=2,c='blue')\n", - "dum_sonde1_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde1_twinax.spines['top'].set_color('blue')\n", - "dum_sonde1_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde1_twinax.set_xlim(0,105)\n", - "dum_sonde1_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date1_sonde1_rh))\n", - "dumid = np.where(date1_sonde1_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date1_sonde1_ax.axhspan(date1_sonde1_height[dumid[0]]*1.e-3,date1_sonde1_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "# Sonde 2\n", - "dum_sonde2_ax.plot(date1_sonde2_temp-273.15,date1_sonde2_height*1.e-3,lw=2,c='red')\n", - "dum_sonde2_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde2_ax.spines['bottom'].set_color('red')\n", - "dum_sonde2_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde2_twinax = dum_sonde2_ax.twiny()\n", - "dum_sonde2_twinax.plot(date1_sonde2_rh,date1_sonde2_height*1.e-3,lw=2,c='blue')\n", - "dum_sonde2_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde2_twinax.spines['top'].set_color('blue')\n", - "dum_sonde2_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde2_twinax.set_xlim(0,105)\n", - "dum_sonde2_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date1_sonde2_rh))\n", - "dumid = np.where(date1_sonde2_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date1_sonde2_ax.axhspan(date1_sonde2_height[dumid[0]]*1.e-3,date1_sonde2_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Reflectivity\n", - "#--------------------------------------------------------------\n", - "ref = date1_basta_ref.copy()\n", - "ref[(ref > -999.) & (ref < -40.)] = -40.\n", - "ref[ref > 10.] = 10.\n", - "#cmap = matplotlib.cm.get_cmap(\"nipy_spectral\").copy()\n", - "cmap = matplotlib.cm.get_cmap(\"cividis\").copy()\n", - "#from palettable.cmocean.sequential import Ice_20 as colormap\n", - "#from palettable.cmocean.sequential import Solar_20 as colormap\n", - "#cmap = colormap.mpl_colormap\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ref_plot = dum_ref_ax.pcolormesh(date1_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " ref,\\\n", - " cmap=cmap,\\\n", - " vmin=-40.1,vmax=10.1,\\\n", - " ) \n", - "dum_ref_ax.set_axisbelow(False)\n", - "dum_ref_ax.grid(True,c='grey',axis='both')\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Doppler Velocity\n", - "#--------------------------------------------------------------\n", - "vel = date1_basta_vel.copy()\n", - "vel[(vel > -999.) & (vel < -2.)] = -2.\n", - "vel[vel > 2.] = 2.\n", - "cmap = matplotlib.cm.get_cmap(\"seismic\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "vel_plot = dum_vel_ax.pcolormesh(date1_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " vel,\\\n", - " cmap=cmap,\\\n", - " vmin=-2.001,vmax=2.001,\\\n", - " ) \n", - "dum_vel_ax.set_axisbelow(False)\n", - "dum_vel_ax.grid(True,c='grey',axis='both')\n", - "\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# CEIL\n", - "#--------------------------------------------------------------\n", - "beta = date1_ceil_backscatter.copy()\n", - "beta[(beta > -999.) & (beta < -8.)] = -8.\n", - "beta[beta > -3.] = 3.\n", - "cmap = matplotlib.cm.get_cmap(\"viridis\").copy()\n", - "#cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ceil_plot = dum_ceil_ax.pcolormesh(date1_ceil_time,\\\n", - " ceil_height/1.e3,\\\n", - " beta.T,\\\n", - " cmap=cmap,\\\n", - " vmin=-8,vmax=-3,\\\n", - " ) \n", - "dum_ceil_ax.set_axisbelow(False)\n", - "dum_ceil_ax.grid(True,c='grey',axis='both')\n", - "\n", - "# Scatterplot of CBH\n", - "dum_ceil_ax.scatter(date1_ceil_time,date1_ceil_cbh/1.e3,0.5,marker='o',c='k')\n", - "dum_ref_ax.scatter(date1_ceil_time,date1_ceil_cbh/1.e3,0.5,marker='o',c='k')\n", - "dum_vel_ax.scatter(date1_ceil_time,date1_ceil_cbh/1.e3,0.5,marker='o',c='k')\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# SFC Met\n", - "#--------------------------------------------------------------\n", - "dum_sfc_ax.plot(date1_sfc_time,date1_sfc_temp,lw=2,c='red')\n", - "dum_sfc_ax.tick_params(axis='y',labelsize=Fontsize,colors='red')\n", - "dum_sfc_ax.set_ylabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sfc_ax.spines['left'].set_color('red')\n", - "\n", - "dum_sfc_twin_ax = dum_sfc_ax.twinx()\n", - "dum_sfc_twin_ax.plot(date1_sfc_time,date1_sfc_rh,lw=2,c='blue')\n", - "dum_sfc_twin_ax.tick_params(axis='y',labelsize=Fontsize,colors='blue')\n", - "dum_sfc_twin_ax.set_ylabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sfc_twin_ax.spines['right'].set_color('blue')\n", - "dum_sfc_twin_ax.spines['left'].set_visible(False)\n", - "dum_sfc_twin_ax.set_ylim(75,100.)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date1_sfc_rh))\n", - "dumid = np.where(date1_sfc_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date1_sfc_ax.axvspan(date1_sfc_time[dumid[0]],date1_sfc_time[dumid[-1]],facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "\n", - "\n", - "#================================================\n", - "# Colorbars\n", - "#================================================\n", - "\n", - "# Fixed Date 1\n", - "date1_xcbar_xstart = 0.91\n", - "date1_xcbar_xwidth = 0.015\n", - "date1_xcbar_ylength = 0.105\n", - "# Variable Date 1\n", - "date1_xcbar_ystart_ref = 0.61\n", - "date1_xcbar_ystart_vel = 0.4425\n", - "date1_xcbar_ystart_ceil = 0.275\n", - "\n", - "\n", - "# Date 1 Reflectivity\n", - "dum_ticks = [-40,-30,-20,-10,0,10]\n", - "ref_cbar_ax = fig.add_axes([date1_xcbar_xstart,date1_xcbar_ystart_ref,date1_xcbar_xwidth,date1_xcbar_ylength])\n", - "ref_cbar = fig.colorbar(ref_plot,orientation='vertical',cax=ref_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ref_cbar.ax.set_ylabel('Reflectivity [dBZ]',fontsize=Fontsize)\n", - "ref_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 1 Doppler Velocity\n", - "dum_ticks = [-2.,-1.5,-1.,-0.5,0,0.5,1,1.5,2]\n", - "vel_cbar_ax = fig.add_axes([date1_xcbar_xstart,date1_xcbar_ystart_vel,date1_xcbar_xwidth,date1_xcbar_ylength])\n", - "vel_cbar = fig.colorbar(vel_plot,orientation='vertical',cax=vel_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "vel_cbar.ax.set_ylabel('Doppler Velocity [m s$^{-1}$]',fontsize=Fontsize)\n", - "vel_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 1 CEIL\n", - "dum_ticks = [-8,-7,-6,-5,-4,-3]\n", - "ceil_cbar_ax = fig.add_axes([date1_xcbar_xstart,date1_xcbar_ystart_ceil,date1_xcbar_xwidth,date1_xcbar_ylength])\n", - "ceil_cbar = fig.colorbar(ceil_plot,orientation='vertical',cax=ceil_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ceil_cbar.ax.set_ylabel('$log_{10}(\\\\beta_{att})$ [m$^{-1}$ sr$^{-1}$]',fontsize=Fontsize)\n", - "ceil_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "\n", - "\n", - "#================================================\n", - "# Legends\n", - "#================================================\n", - "#legend_elements = [Line2D([0], [0],color='purple',ls='solid',lw=3,label='RH CTH/CBH')]\n", - "dumx = 1.4\n", - "dumy = 0.85\n", - "fac = 1.1\n", - "# RH > 95% - Sfc Met\n", - "purple_patch = mpatches.Patch(color='purple',alpha=0.25,label='RH > 95%')\n", - "lgnd1 = date1_sonde2_ax.legend(handles=[purple_patch],\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "# Missing/Invalid Data\n", - "grey_patch = mpatches.Patch(color='grey',alpha=1.,label='Missing/Invalid Data')\n", - "lgnd2 = date1_sonde2_ax.legend(handles=[grey_patch],\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy-0.2),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "# CBH\n", - "legend_elements = [Line2D([0], [0],color='black',ls='solid',c='white',label='CBH',marker='o',markersize=3,markeredgecolor='k',markerfacecolor='k')]\n", - "lgnd3 = date1_sonde2_ax.legend(handles=legend_elements,\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy-0.4),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "\n", - "\n", - "datestr = dates_lim[0].strftime('%Y/%m/%d')\n", - "\n", - "# Sonde Path\n", - "legend_elements = [Line2D([0], [0],color='brown',ls='solid',label='Sonde Path',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])]\n", - "lgnd4 = date1_sonde2_ax.legend(handles=legend_elements,\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy-0.6),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "\n", - "date1_sonde2_ax.add_artist(lgnd1)\n", - "date1_sonde2_ax.add_artist(lgnd2)\n", - "date1_sonde2_ax.add_artist(lgnd3)\n", - "\n", - "datestr = dates_lim[0].strftime('%Y/%m/%d')\n", - "\n", - "#=======================================================\n", - "# Titles & Labels\n", - "#=======================================================\n", - "#date1_sonde1_ax.text(1.4,1.55,'15 April 2016',color='black',fontsize=Fontsize*1.5,fontweight='bold',transform=date1_sonde1_ax.transAxes,ha='center',va='center')\n", - "#date2_sonde1_ax.text(1.4,1.55,'22-23 May 2016',color='black',fontsize=Fontsize*2.25,fontweight='bold',transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "date1_basta_ref_ax.text(0.5,1.1,'BASTA Reflectivity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date1_basta_ref_ax.transAxes,ha='center',va='center')\n", - "date1_basta_vel_ax.text(0.5,1.1,'BASTA Doppler Velocity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date1_basta_vel_ax.transAxes,ha='center',va='center')\n", - "date1_ceil_ax.text(0.5,1.1,'Univ. of Canterbury Ceilometer $\\\\beta_{att}$',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.5,transform=date1_ceil_ax.transAxes,ha='center',va='center')\n", - "date1_sfc_ax.text(0.5,1.1,'Surface Meteorology',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.5,transform=date1_sfc_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 1 Sonde 1\n", - "dumstr=date1_sonde1_time.strftime('%H%M')\n", - "dumstr2=date1_sonde1_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 1 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date1_sonde1_ax.text(0.5,1.5,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.25,transform=date1_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 1 Sonde 2\n", - "dumstr=date1_sonde2_time.strftime('%H%M')\n", - "dumstr2=date1_sonde2_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 2 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date1_sonde2_ax.text(0.5,1.5,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.25,transform=date1_sonde2_ax.transAxes,ha='center',va='center')\n", - "\n", - "#======================================\n", - "# Misc. Fixes\n", - "#======================================\n", - "date1_sonde1_ax.set_xlim(5,8)\n", - "date1_sonde2_ax.set_xlim(5,8)\n", - "\n", - "\n", - "#======================================\n", - "# Plot Sonde Paths\n", - "#======================================\n", - "\n", - "date1_basta_ref_ax.plot(date1_sonde1_time_long,date1_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date1_basta_ref_ax.plot(date1_sonde2_time_long,date1_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "date1_basta_vel_ax.plot(date1_sonde1_time_long,date1_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date1_basta_vel_ax.plot(date1_sonde2_time_long,date1_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "date1_ceil_ax.plot(date1_sonde1_time_long,date1_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date1_ceil_ax.plot(date1_sonde2_time_long,date1_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "# Locate Soundings\n", - "fac = 1.\n", - "# Date 1\n", - "# Sonde1\n", - "dum = datetime.timedelta(minutes=20)\n", - "dum2 = 0.1\n", - "date1_basta_ref_ax.text(date1_sonde1_time_long[-1]+dum,(date1_sonde1_height[-1]*1.e-3)-dum2,'Sounding 1',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date1_basta_vel_ax.text(date1_sonde1_time_long[-1]+dum,(date1_sonde1_height[-1]*1.e-3)-dum2,'Sounding 1',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date1_ceil_ax.text(date1_sonde1_time_long[-1]+dum,(date1_sonde1_height[-1]*1.e-3)-dum2,'Sounding 1',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "# Sonde2\n", - "date1_basta_ref_ax.text(date1_sonde2_time_long[-1]+dum,(date1_sonde2_height[-1]*1.e-3)-dum2,'Sounding 2',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date1_basta_vel_ax.text(date1_sonde2_time_long[-1]+dum,(date1_sonde2_height[-1]*1.e-3)-dum2,'Sounding 2',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date1_ceil_ax.text(date1_sonde2_time_long[-1]+dum,(date1_sonde2_height[-1]*1.e-3)-dum2,'Sounding 2',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "\n", - "plt.subplots_adjust(wspace=0.6,hspace=0.6)\n", - "\n", - "xpos = -0.1\n", - "ypos = 1.1\n", - "fac = 2\n", - "date1_sonde1_ax.text(xpos-0.3,ypos,'(a)',fontsize=Fontsize*fac,transform=date1_sonde1_ax.transAxes)\n", - "date1_sonde2_ax.text(xpos-0.3,ypos,'(b)',fontsize=Fontsize*fac,transform=date1_sonde2_ax.transAxes)\n", - "date1_basta_ref_ax.text(xpos,ypos,'(c)',fontsize=Fontsize*fac,transform=date1_basta_ref_ax.transAxes)\n", - "date1_basta_vel_ax.text(xpos,ypos,'(d)',fontsize=Fontsize*fac,transform=date1_basta_vel_ax.transAxes)\n", - "date1_ceil_ax.text(xpos,ypos,'(e)',fontsize=Fontsize*fac,transform=date1_ceil_ax.transAxes)\n", - "date1_sfc_ax.text(xpos+0.01,ypos,'(f)',fontsize=Fontsize*fac,transform=date1_sfc_ax.transAxes)\n", - "\n", - "\n", - "#date1_sonde1_ax.text(1.4,1.55,'15 April 2016',color='black',fontsize=Fontsize*1.5,fontweight='bold',transform=date1_sonde1_ax.transAxes,ha='center',va='center')\n", - "plt.figtext(0.5,0.97,'15 April 2016',color='black',fontsize=Fontsize*2.5,fontweight='bold',ha='center',va='center')\n", - "\n", - "fig_path = '/home/mwstanfo/figures/micre_paper/'\n", - "outfile = 'fig_e1.png'\n", - "#outfile = 'fig_b1.eps'\n", - "plt.savefig(fig_path+outfile,dpi=200,bbox_inches='tight')\n", - "#plt.show()\n", - "plt.close()\n", - "print('done')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "2ef10374-da3d-4940-a973-ae2c05e8eedc", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_20949/2336270923.py:169: 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", - " ceil_plot = dum_ceil_ax.pcolormesh(date2_ceil_time,\\\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "done\n" - ] - } - ], - "source": [ - "#---------------------------------------------------\n", - "# Case Study 2\n", - "#---------------------------------------------------\n", - "\n", - "fig = plt.figure(figsize=(12,16))\n", - "gs = GridSpec(5,3) # 5 rows, 4 columns\n", - "Fontsize=12\n", - "dfmt = mdates.DateFormatter('%H:%M')\n", - "\n", - "date2_sonde1_ax = fig.add_subplot(gs[0,0])\n", - "date2_sonde2_ax = fig.add_subplot(gs[0,1])\n", - "\n", - "date2_basta_ref_ax = fig.add_subplot(gs[1,0:3])\n", - "\n", - "date2_basta_vel_ax = fig.add_subplot(gs[2,0:3])\n", - "\n", - "date2_ceil_ax = fig.add_subplot(gs[3,0:3])\n", - "\n", - "date2_sfc_ax = fig.add_subplot(gs[4,0:3])\n", - "\n", - "\n", - "date2_time_axlist = [date2_basta_ref_ax,date2_basta_vel_ax,date2_ceil_ax,date2_sfc_ax]\n", - "\n", - "for ax in date2_time_axlist:\n", - " date = dates[0]\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_xlabel('UTC Time [HH:MM]',fontsize=Fontsize)\n", - " ax.xaxis.set_major_formatter(dfmt)\n", - " ax.set_xlim(target_date_2_start_time,target_date_2_end_time)\n", - "\n", - "\n", - "\n", - "sonde_ax_list = [date2_sonde1_ax,date2_sonde2_ax]\n", - "for ax in sonde_ax_list:\n", - " ax.set_ylim(0,1)\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_ylabel('Height [km]',fontsize=Fontsize)\n", - "\n", - " \n", - "dum_time_delta = datetime.timedelta(seconds=15)\n", - "\n", - "height_axlist = [date2_basta_ref_ax,date2_basta_vel_ax,date2_ceil_ax]\n", - "for ax in height_axlist:\n", - " ax.set_ylabel('Height [km]',fontsize=Fontsize)\n", - " ax.set_ylim(0,1.)\n", - "\n", - "\n", - "#==============================================================\n", - "#==============================================================\n", - "# Date 2\n", - "#==============================================================\n", - "#==============================================================\n", - "dum_ref_ax = date2_basta_ref_ax\n", - "dum_vel_ax = date2_basta_vel_ax\n", - "dum_ceil_ax = date2_ceil_ax\n", - "dum_sfc_ax = date2_sfc_ax\n", - "dum_sonde1_ax = date2_sonde1_ax\n", - "dum_sonde2_ax = date2_sonde2_ax\n", - "\n", - "#--------------------------------------------------------------\n", - "# Sounding\n", - "#--------------------------------------------------------------\n", - "\n", - "# Sonde 1\n", - "dum_sonde1_ax.plot(date2_sonde1_temp-273.15,date2_sonde1_height*1.e-3,lw=2,c='red')\n", - "dum_sonde1_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde1_ax.spines['bottom'].set_color('red')\n", - "dum_sonde1_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde1_twinax = dum_sonde1_ax.twiny()\n", - "dum_sonde1_twinax.plot(date2_sonde1_rh,date2_sonde1_height*1.e-3,lw=2,c='blue')\n", - "dum_sonde1_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde1_twinax.spines['top'].set_color('blue')\n", - "dum_sonde1_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde1_twinax.set_xlim(0,105)\n", - "dum_sonde1_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date2_sonde1_rh))\n", - "dumid = np.where(date2_sonde1_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date2_sonde1_ax.axhspan(date2_sonde1_height[dumid[0]]*1.e-3,date2_sonde1_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "# Sonde 2\n", - "dum_sonde2_ax.plot(date2_sonde2_temp-273.15,date2_sonde2_height*1.e-3,lw=2,c='red')\n", - "dum_sonde2_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde2_ax.spines['bottom'].set_color('red')\n", - "dum_sonde2_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde2_twinax = dum_sonde2_ax.twiny()\n", - "dum_sonde2_twinax.plot(date2_sonde2_rh,date2_sonde2_height*1.e-3,lw=2,c='blue')\n", - "dum_sonde2_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde2_twinax.spines['top'].set_color('blue')\n", - "dum_sonde2_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde2_twinax.set_xlim(0,105)\n", - "dum_sonde2_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date2_sonde2_rh))\n", - "dumid = np.where(date2_sonde2_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date2_sonde2_ax.axhspan(date2_sonde2_height[dumid[0]]*1.e-3,date2_sonde2_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Reflectivity\n", - "#--------------------------------------------------------------\n", - "ref = date2_basta_ref.copy()\n", - "ref[(ref > -999.) & (ref < -40.)] = -40.\n", - "ref[ref > 10.] = 10.\n", - "cmap = matplotlib.cm.get_cmap(\"cividis\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ref_plot = dum_ref_ax.pcolormesh(date2_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " ref,\\\n", - " cmap=cmap,\\\n", - " vmin=-40.1,vmax=10.1,\\\n", - " ) \n", - "dum_ref_ax.set_axisbelow(False)\n", - "dum_ref_ax.grid(True,c='grey',axis='both')\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Doppler Velocity\n", - "#--------------------------------------------------------------\n", - "vel = date2_basta_vel.copy()\n", - "vel[(vel > -999.) & (vel < -2.)] = -2.\n", - "vel[vel > 2.] = 2.\n", - "cmap = matplotlib.cm.get_cmap(\"seismic\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "vel_plot = dum_vel_ax.pcolormesh(date2_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " vel,\\\n", - " cmap=cmap,\\\n", - " vmin=-2.001,vmax=2.001,\\\n", - " ) \n", - "dum_vel_ax.set_axisbelow(False)\n", - "dum_vel_ax.grid(True,c='grey',axis='both')\n", - "\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# CEIL\n", - "#--------------------------------------------------------------\n", - "beta = date2_ceil_backscatter.copy()\n", - "beta[(beta > -999.) & (beta < -8.)] = -8.\n", - "beta[beta > -3.] = 3.\n", - "cmap = matplotlib.cm.get_cmap(\"viridis\").copy()\n", - "#cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ceil_plot = dum_ceil_ax.pcolormesh(date2_ceil_time,\\\n", - " ceil_height/1.e3,\\\n", - " beta.T,\\\n", - " cmap=cmap,\\\n", - " vmin=-8,vmax=-3,\\\n", - " ) \n", - "dum_ceil_ax.set_axisbelow(False)\n", - "dum_ceil_ax.grid(True,c='grey',axis='both')\n", - "\n", - "# Scatterplot of CBH\n", - "dum_ceil_ax.scatter(date2_ceil_time,date2_ceil_cbh/1.e3,0.5,marker='o',c='k')\n", - "dum_ref_ax.scatter(date2_ceil_time,date2_ceil_cbh/1.e3,0.5,marker='o',c='k')\n", - "dum_vel_ax.scatter(date2_ceil_time,date2_ceil_cbh/1.e3,0.5,marker='o',c='k')\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# SFC Met\n", - "#--------------------------------------------------------------\n", - "dum_sfc_ax.plot(date2_sfc_time,date2_sfc_temp,lw=2,c='red')\n", - "dum_sfc_ax.tick_params(axis='y',labelsize=Fontsize,colors='red')\n", - "dum_sfc_ax.set_ylabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sfc_ax.spines['left'].set_color('red')\n", - "\n", - "dum_sfc_twin_ax = dum_sfc_ax.twinx()\n", - "dum_sfc_twin_ax.plot(date2_sfc_time,date2_sfc_rh,lw=2,c='blue')\n", - "dum_sfc_twin_ax.tick_params(axis='y',labelsize=Fontsize,colors='blue')\n", - "dum_sfc_twin_ax.set_ylabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sfc_twin_ax.spines['right'].set_color('blue')\n", - "dum_sfc_twin_ax.spines['left'].set_visible(False)\n", - "dum_sfc_twin_ax.set_ylim(75,100.)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date2_sfc_rh))\n", - "dumid = np.where(date2_sfc_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date2_sfc_ax.axvspan(date2_sfc_time[dumid[0]],date2_sfc_time[dumid[-1]],facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "\n", - "\n", - "#================================================\n", - "# Colorbars\n", - "#================================================\n", - "\n", - "# Fixed Date 2\n", - "date2_xcbar_xstart = 0.91\n", - "date2_xcbar_xwidth = 0.015\n", - "date2_xcbar_ylength = 0.105\n", - "# Variable Date 2\n", - "date2_xcbar_ystart_ref = 0.61\n", - "date2_xcbar_ystart_vel = 0.4425\n", - "date2_xcbar_ystart_ceil = 0.275\n", - "\n", - "\n", - "# Date 1 Reflectivity\n", - "dum_ticks = [-50,-40,-30,-20,-10,0,10,20]\n", - "ref_cbar_ax = fig.add_axes([date2_xcbar_xstart,date2_xcbar_ystart_ref,date2_xcbar_xwidth,date2_xcbar_ylength])\n", - "ref_cbar = fig.colorbar(ref_plot,orientation='vertical',cax=ref_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ref_cbar.ax.set_ylabel('Reflectivity [dBZ]',fontsize=Fontsize)\n", - "ref_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 1 Doppler Velocity\n", - "dum_ticks = [-2.,-1.5,-1.,-0.5,0,0.5,1,1.5,2]\n", - "vel_cbar_ax = fig.add_axes([date2_xcbar_xstart,date2_xcbar_ystart_vel,date2_xcbar_xwidth,date2_xcbar_ylength])\n", - "vel_cbar = fig.colorbar(vel_plot,orientation='vertical',cax=vel_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "vel_cbar.ax.set_ylabel('Doppler Velocity [m s$^{-1}$]',fontsize=Fontsize)\n", - "vel_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 1 CEIL\n", - "dum_ticks = [-8,-7,-6,-5,-4,-3]\n", - "ceil_cbar_ax = fig.add_axes([date2_xcbar_xstart,date2_xcbar_ystart_ceil,date2_xcbar_xwidth,date2_xcbar_ylength])\n", - "ceil_cbar = fig.colorbar(ceil_plot,orientation='vertical',cax=ceil_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ceil_cbar.ax.set_ylabel('$log_{10}(\\\\beta_{att})$ [m$^{-1}$ sr$^{-1}$]',fontsize=Fontsize)\n", - "ceil_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "\n", - "\n", - "#================================================\n", - "# Legends\n", - "#================================================\n", - "#legend_elements = [Line2D([0], [0],color='purple',ls='solid',lw=3,label='RH CTH/CBH')]\n", - "dumx = 1.4\n", - "dumy = 0.85\n", - "fac = 1.1\n", - "# RH > 95% - Sfc Met\n", - "purple_patch = mpatches.Patch(color='purple',alpha=0.25,label='RH > 95%')\n", - "lgnd1 = date2_sonde2_ax.legend(handles=[purple_patch],\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "# Missing/Invalid Data\n", - "grey_patch = mpatches.Patch(color='grey',alpha=1.,label='Missing/Invalid Data')\n", - "lgnd2 = date2_sonde2_ax.legend(handles=[grey_patch],\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy-0.2),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "# CBH\n", - "legend_elements = [Line2D([0], [0],color='black',ls='solid',c='white',label='CBH',marker='o',markersize=3,markeredgecolor='k',markerfacecolor='k')]\n", - "lgnd3 = date2_sonde2_ax.legend(handles=legend_elements,\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy-0.4),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "\n", - "\n", - "datestr = dates_lim[0].strftime('%Y/%m/%d')\n", - "\n", - "# Sonde Path\n", - "legend_elements = [Line2D([0], [0],color='brown',ls='solid',label='Sonde Path',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])]\n", - "lgnd4 = date2_sonde2_ax.legend(handles=legend_elements,\\\n", - " fontsize=Fontsize*fac,\\\n", - " bbox_to_anchor=(dumx,dumy-0.6),\\\n", - " ncol=1,loc='upper left',framealpha=0)\n", - "\n", - "\n", - "date2_sonde2_ax.add_artist(lgnd1)\n", - "date2_sonde2_ax.add_artist(lgnd2)\n", - "date2_sonde2_ax.add_artist(lgnd3)\n", - "\n", - "datestr = dates_lim[0].strftime('%Y/%m/%d')\n", - "\n", - "#=======================================================\n", - "# Titles & Labels\n", - "#=======================================================\n", - "#date2_sonde1_ax.text(1.4,1.55,'15 April 2016',color='black',fontsize=Fontsize*1.5,fontweight='bold',transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "#date2_sonde1_ax.text(1.4,1.55,'22-23 May 2016',color='black',fontsize=Fontsize*2.25,fontweight='bold',transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "date2_basta_ref_ax.text(0.5,1.1,'BASTA Reflectivity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date2_basta_ref_ax.transAxes,ha='center',va='center')\n", - "date2_basta_vel_ax.text(0.5,1.1,'BASTA Doppler Velocity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date2_basta_vel_ax.transAxes,ha='center',va='center')\n", - "date2_ceil_ax.text(0.5,1.1,'Univ. of Canterbury Ceilometer $\\\\beta_{att}$',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.5,transform=date2_ceil_ax.transAxes,ha='center',va='center')\n", - "date2_sfc_ax.text(0.5,1.1,'Surface Meteorology',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.5,transform=date2_sfc_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 1 Sonde 1\n", - "dumstr=date2_sonde1_time.strftime('%H%M')\n", - "dumstr2=date2_sonde1_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 1 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date2_sonde1_ax.text(0.5,1.5,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.25,transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 1 Sonde 2\n", - "dumstr=date2_sonde2_time.strftime('%H%M')\n", - "dumstr2=date2_sonde2_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 2 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date2_sonde2_ax.text(0.5,1.5,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.25,transform=date2_sonde2_ax.transAxes,ha='center',va='center')\n", - "\n", - "#======================================\n", - "# Misc. Fixes\n", - "#======================================\n", - "date2_sonde1_ax.set_xlim(1.75,7)\n", - "date2_sonde2_ax.set_xlim(1.75,7)\n", - "\n", - "\n", - "#======================================\n", - "# Plot Sonde Paths\n", - "#======================================\n", - "\n", - "date2_basta_ref_ax.plot(date2_sonde1_time_long,date2_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_basta_ref_ax.plot(date2_sonde2_time_long,date2_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "date2_basta_vel_ax.plot(date2_sonde1_time_long,date2_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_basta_vel_ax.plot(date2_sonde2_time_long,date2_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "date2_ceil_ax.plot(date2_sonde1_time_long,date2_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_ceil_ax.plot(date2_sonde2_time_long,date2_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "# Locate Soundings\n", - "fac = 1.\n", - "# Date 1\n", - "# Sonde1\n", - "dum = datetime.timedelta(minutes=20)\n", - "dum2 = 0.1\n", - "date2_basta_ref_ax.text(date2_sonde1_time_long[-1]+dum,(date2_sonde1_height[-1]*1.e-3)-dum2,'Sounding 1',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date2_basta_vel_ax.text(date2_sonde1_time_long[-1]+dum,(date2_sonde1_height[-1]*1.e-3)-dum2,'Sounding 1',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date2_ceil_ax.text(date2_sonde1_time_long[-1]+dum,(date2_sonde1_height[-1]*1.e-3)-dum2,'Sounding 1',c='brown',fontsize=Fontsize*fac,ha='left',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "# Sonde2\n", - "date2_basta_ref_ax.text(date2_sonde2_time_long[-1]-dum,(date2_sonde2_height[-1]*1.e-3)-dum2,'Sounding 2',c='brown',fontsize=Fontsize*fac,ha='right',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date2_basta_vel_ax.text(date2_sonde2_time_long[-1]-dum,(date2_sonde2_height[-1]*1.e-3)-dum2,'Sounding 2',c='brown',fontsize=Fontsize*fac,ha='right',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "date2_ceil_ax.text(date2_sonde2_time_long[-1]-dum,(date2_sonde2_height[-1]*1.e-3)-dum2,'Sounding 2',c='brown',fontsize=Fontsize*fac,ha='right',va='center',bbox=dict(facecolor='white', alpha=1,edgecolor='deepskyblue',pad=2),fontweight='bold')\n", - "\n", - "plt.subplots_adjust(wspace=0.6,hspace=0.6)\n", - "\n", - "xpos = -0.1\n", - "ypos = 1.1\n", - "fac = 2\n", - "date2_sonde1_ax.text(xpos-0.3,ypos,'(a)',fontsize=Fontsize*fac,transform=date2_sonde1_ax.transAxes)\n", - "date2_sonde2_ax.text(xpos-0.3,ypos,'(b)',fontsize=Fontsize*fac,transform=date2_sonde2_ax.transAxes)\n", - "date2_basta_ref_ax.text(xpos,ypos,'(c)',fontsize=Fontsize*fac,transform=date2_basta_ref_ax.transAxes)\n", - "date2_basta_vel_ax.text(xpos,ypos,'(d)',fontsize=Fontsize*fac,transform=date2_basta_vel_ax.transAxes)\n", - "date2_ceil_ax.text(xpos,ypos,'(e)',fontsize=Fontsize*fac,transform=date2_ceil_ax.transAxes)\n", - "date2_sfc_ax.text(xpos+0.01,ypos,'(f)',fontsize=Fontsize*fac,transform=date2_sfc_ax.transAxes)\n", - "\n", - "\n", - "#date2_sonde1_ax.text(1.4,1.55,'15 April 2016',color='black',fontsize=Fontsize*1.5,fontweight='bold',transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "plt.figtext(0.5,0.97,'22-23 May 2016',color='black',fontsize=Fontsize*2.5,fontweight='bold',ha='center',va='center')\n", - "\n", - "fig_path = '/home/mwstanfo/figures/micre_paper/'\n", - "outfile = 'fig_e2.png'\n", - "#outfile = 'fig_b1.eps'\n", - "plt.savefig(fig_path+outfile,dpi=200,bbox_inches='tight')\n", - "#plt.show()\n", - "plt.close()\n", - "print('done')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "850cc226-54a6-4b54-b41c-b59c78cc54c6", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e8b107d-b7db-4e9c-ae4e-746cdcedfa63", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b7f01d82-2244-4d8e-8565-e6ce6035dd46", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 90, - "id": "4d608099-fb35-43f6-8435-e6ad570ce960", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/mwstanfo/anaconda3/envs/act_env/lib/python3.7/site-packages/ipykernel_launcher.py:185: 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", - "/home/mwstanfo/anaconda3/envs/act_env/lib/python3.7/site-packages/ipykernel_launcher.py:349: 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" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "done\n" - ] - } - ], - "source": [ - "fig = plt.figure(figsize=(36,38))\n", - "gs = GridSpec(5,4) # 5 rows, 4 columns\n", - "Fontsize=20\n", - "dfmt = mdates.DateFormatter('%H:%M')\n", - "\n", - "date1_sonde1_ax = fig.add_subplot(gs[0,0])\n", - "date1_sonde2_ax = fig.add_subplot(gs[0,1])\n", - "date2_sonde1_ax = fig.add_subplot(gs[0,2])\n", - "date2_sonde2_ax = fig.add_subplot(gs[0,3])\n", - "\n", - "date1_basta_ref_ax = fig.add_subplot(gs[1,0:2])\n", - "date2_basta_ref_ax = fig.add_subplot(gs[1,2:4])\n", - "\n", - "date1_basta_vel_ax = fig.add_subplot(gs[2,0:2])\n", - "date2_basta_vel_ax = fig.add_subplot(gs[2,2:4]) \n", - "\n", - "date1_ceil_ax = fig.add_subplot(gs[3,0:2])\n", - "date2_ceil_ax = fig.add_subplot(gs[3,2:4])\n", - "\n", - "date1_sfc_ax = fig.add_subplot(gs[4,0:2])\n", - "date2_sfc_ax = fig.add_subplot(gs[4,2:4])\n", - "\n", - "\n", - "date1_time_axlist = [date1_basta_ref_ax,date1_basta_vel_ax,date1_ceil_ax,date1_sfc_ax]\n", - "date2_time_axlist = [date2_basta_ref_ax,date2_basta_vel_ax,date2_ceil_ax,date2_sfc_ax]\n", - "\n", - "# Date 1 (Left Side)\n", - "for ax in date1_time_axlist:\n", - " date = dates[0]\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_xlabel('UTC Time [HH:MM]',fontsize=Fontsize)\n", - " ax.xaxis.set_major_formatter(dfmt)\n", - " ax.set_xlim(target_date_1_start_time,target_date_1_end_time)\n", - "\n", - "# Date 2 (Right Side)\n", - "for ax in date2_time_axlist:\n", - " datea = dates[1]\n", - " dateb = dates[2]\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_xlabel('UTC Time [HH:MM]',fontsize=Fontsize)\n", - " ax.xaxis.set_major_formatter(dfmt)\n", - " ax.set_xlim(target_date_2_start_time,target_date_2_end_time)\n", - "\n", - "sonde_ax_list = [date1_sonde1_ax,date1_sonde2_ax,date2_sonde1_ax,date2_sonde2_ax]\n", - "for ax in sonde_ax_list:\n", - " ax.set_ylim(0,1)\n", - " ax.grid(which='both',ls='dotted',lw=1,c='dimgrey')\n", - " ax.tick_params(labelsize=Fontsize)\n", - " ax.set_ylabel('Height [km]',fontsize=Fontsize)\n", - "\n", - " \n", - "dum_time_delta = datetime.timedelta(seconds=15)\n", - "\n", - "height_axlist = [date1_basta_ref_ax,date2_basta_ref_ax,date1_basta_vel_ax,date2_basta_vel_ax,date1_ceil_ax,date2_ceil_ax]\n", - "for ax in height_axlist:\n", - " ax.set_ylabel('Height [km]',fontsize=Fontsize)\n", - " ax.set_ylim(0,1.)\n", - " \n", - " \n", - "#==============================================================\n", - "#==============================================================\n", - "# Date 1\n", - "#==============================================================\n", - "#==============================================================\n", - "dum_ref_ax = date1_basta_ref_ax\n", - "dum_vel_ax = date1_basta_vel_ax\n", - "dum_ceil_ax = date1_ceil_ax\n", - "dum_sfc_ax = date1_sfc_ax\n", - "dum_sonde1_ax = date1_sonde1_ax\n", - "dum_sonde2_ax = date1_sonde2_ax\n", - "\n", - "#--------------------------------------------------------------\n", - "# Sounding\n", - "#--------------------------------------------------------------\n", - "\n", - "# Sonde 1\n", - "dum_sonde1_ax.plot(date1_sonde1_temp-273.15,date1_sonde1_height*1.e-3,lw=3,c='red')\n", - "dum_sonde1_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde1_ax.spines['bottom'].set_color('red')\n", - "dum_sonde1_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde1_twinax = dum_sonde1_ax.twiny()\n", - "dum_sonde1_twinax.plot(date1_sonde1_rh,date1_sonde1_height*1.e-3,lw=3,c='blue')\n", - "dum_sonde1_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde1_twinax.spines['top'].set_color('blue')\n", - "dum_sonde1_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde1_twinax.set_xlim(0,105)\n", - "dum_sonde1_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date1_sonde1_rh))\n", - "dumid = np.where(date1_sonde1_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date1_sonde1_ax.axhspan(date1_sonde1_height[dumid[0]]*1.e-3,date1_sonde1_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "# Sonde 2\n", - "dum_sonde2_ax.plot(date1_sonde2_temp-273.15,date1_sonde2_height*1.e-3,lw=3,c='red')\n", - "dum_sonde2_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde2_ax.spines['bottom'].set_color('red')\n", - "dum_sonde2_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde2_twinax = dum_sonde2_ax.twiny()\n", - "dum_sonde2_twinax.plot(date1_sonde2_rh,date1_sonde2_height*1.e-3,lw=3,c='blue')\n", - "dum_sonde2_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde2_twinax.spines['top'].set_color('blue')\n", - "dum_sonde2_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde2_twinax.set_xlim(0,105)\n", - "dum_sonde2_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date1_sonde2_rh))\n", - "dumid = np.where(date1_sonde2_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date1_sonde2_ax.axhspan(date1_sonde2_height[dumid[0]]*1.e-3,date1_sonde2_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Reflectivity\n", - "#--------------------------------------------------------------\n", - "ref = date1_basta_ref.copy()\n", - "ref[(ref > -999.) & (ref < -50.)] = -50.\n", - "ref[ref > 20.] = 20.\n", - "cmap = matplotlib.cm.get_cmap(\"nipy_spectral\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ref_plot = dum_ref_ax.pcolormesh(date1_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " ref,\\\n", - " cmap=cmap,\\\n", - " vmin=-50.1,vmax=20.1,\\\n", - " ) \n", - "dum_ref_ax.set_axisbelow(False)\n", - "dum_ref_ax.grid(True,c='grey',axis='both')\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Doppler Velocity\n", - "#--------------------------------------------------------------\n", - "vel = date1_basta_vel.copy()\n", - "vel[(vel > -999.) & (vel < -2.)] = -2.\n", - "vel[vel > 2.] = 2.\n", - "cmap = matplotlib.cm.get_cmap(\"seismic\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "vel_plot = dum_vel_ax.pcolormesh(date1_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " vel,\\\n", - " cmap=cmap,\\\n", - " vmin=-2.001,vmax=2.001,\\\n", - " ) \n", - "dum_vel_ax.set_axisbelow(False)\n", - "dum_vel_ax.grid(True,c='grey',axis='both')\n", - "\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# CEIL\n", - "#--------------------------------------------------------------\n", - "beta = date1_ceil_backscatter.copy()\n", - "beta[(beta > -999.) & (beta < -8.)] = -8.\n", - "beta[beta > -3.] = 3.\n", - "cmap = matplotlib.cm.get_cmap(\"jet\").copy()\n", - "#cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ceil_plot = dum_ceil_ax.pcolormesh(date1_ceil_time,\\\n", - " ceil_height/1.e3,\\\n", - " beta.T,\\\n", - " cmap=cmap,\\\n", - " vmin=-8,vmax=-3,\\\n", - " ) \n", - "dum_ceil_ax.set_axisbelow(False)\n", - "dum_ceil_ax.grid(True,c='grey',axis='both')\n", - "\n", - "# Scatterplot of CBH\n", - "dum_ceil_ax.scatter(date1_ceil_time,date1_ceil_cbh/1.e3,5,marker='o',c='k')\n", - "dum_ref_ax.scatter(date1_ceil_time,date1_ceil_cbh/1.e3,5,marker='o',c='k')\n", - "dum_vel_ax.scatter(date1_ceil_time,date1_ceil_cbh/1.e3,5,marker='o',c='k')\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# SFC Met\n", - "#--------------------------------------------------------------\n", - "dum_sfc_ax.plot(date1_sfc_time,date1_sfc_temp,lw=3,c='red')\n", - "dum_sfc_ax.tick_params(axis='y',labelsize=Fontsize,colors='red')\n", - "dum_sfc_ax.set_ylabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sfc_ax.spines['left'].set_color('red')\n", - "\n", - "dum_sfc_twin_ax = dum_sfc_ax.twinx()\n", - "dum_sfc_twin_ax.plot(date1_sfc_time,date1_sfc_rh,lw=3,c='blue')\n", - "dum_sfc_twin_ax.tick_params(axis='y',labelsize=Fontsize,colors='blue')\n", - "dum_sfc_twin_ax.set_ylabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sfc_twin_ax.spines['right'].set_color('blue')\n", - "dum_sfc_twin_ax.spines['left'].set_visible(False)\n", - "dum_sfc_twin_ax.set_ylim(75,100.)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date1_sfc_rh))\n", - "dumid = np.where(date1_sfc_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date1_sfc_ax.axvspan(date1_sfc_time[dumid[0]],date1_sfc_time[dumid[-1]],facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "#==============================================================\n", - "#==============================================================\n", - "# Date 2\n", - "#==============================================================\n", - "#==============================================================\n", - "dum_ref_ax = date2_basta_ref_ax\n", - "dum_vel_ax = date2_basta_vel_ax\n", - "dum_ceil_ax = date2_ceil_ax\n", - "dum_sfc_ax = date2_sfc_ax\n", - "dum_sonde1_ax = date2_sonde1_ax\n", - "dum_sonde2_ax = date2_sonde2_ax\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# Sounding\n", - "#--------------------------------------------------------------\n", - "# Sonde 1\n", - "dum_sonde1_ax.plot(date2_sonde1_temp-273.15,date2_sonde1_height*1.e-3,lw=3,c='red')\n", - "dum_sonde1_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde1_ax.spines['bottom'].set_color('red')\n", - "dum_sonde1_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde1_twinax = dum_sonde1_ax.twiny()\n", - "dum_sonde1_twinax.plot(date2_sonde1_rh,date2_sonde1_height*1.e-3,lw=3,c='blue')\n", - "dum_sonde1_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde1_twinax.spines['top'].set_color('blue')\n", - "dum_sonde1_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde1_twinax.set_xlim(0,105)\n", - "dum_sonde1_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date2_sonde1_rh))\n", - "dumid = np.where(date2_sonde1_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date2_sonde1_ax.axhspan(date2_sonde1_height[dumid[0]]*1.e-3,date2_sonde1_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "# Sonde 2\n", - "dum_sonde2_ax.plot(date2_sonde2_temp-273.15,date2_sonde2_height*1.e-3,lw=3,c='red')\n", - "dum_sonde2_ax.set_xlabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sonde2_ax.spines['bottom'].set_color('red')\n", - "dum_sonde2_ax.tick_params(axis='x',labelsize=Fontsize,colors='red')\n", - "\n", - "dum_sonde2_twinax = dum_sonde2_ax.twiny()\n", - "dum_sonde2_twinax.plot(date2_sonde2_rh,date2_sonde2_height*1.e-3,lw=3,c='blue')\n", - "dum_sonde2_twinax.set_xlabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sonde2_twinax.spines['top'].set_color('blue')\n", - "dum_sonde2_twinax.tick_params(axis='x',labelsize=Fontsize,colors='blue')\n", - "dum_sonde2_twinax.set_xlim(0,105)\n", - "dum_sonde2_twinax.spines['bottom'].set_visible(False)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date2_sonde2_rh))\n", - "dumid = np.where(date2_sonde2_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date2_sonde2_ax.axhspan(date2_sonde2_height[dumid[0]]*1.e-3,date2_sonde2_height[dumid[-1]]*1.e-3,facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "#--------------------------------------------------------------\n", - "# BASTA Reflectivity\n", - "#--------------------------------------------------------------\n", - "ref = date2_basta_ref.copy()\n", - "ref[(ref > -999.) & (ref < -50.)] = -50.\n", - "ref[ref > 20.] = 20.\n", - "cmap = matplotlib.cm.get_cmap(\"nipy_spectral\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ref_plot = dum_ref_ax.pcolormesh(date2_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " ref,\\\n", - " cmap=cmap,\\\n", - " vmin=-50.1,vmax=20.1,\\\n", - " ) \n", - "dum_ref_ax.set_axisbelow(False)\n", - "dum_ref_ax.grid(True,c='grey',axis='both')\n", - "#--------------------------------------------------------------\n", - "# BASTA Doppler Velocity\n", - "#--------------------------------------------------------------\n", - "vel = date2_basta_vel.copy()\n", - "vel[(vel > -999.) & (vel < -2.)] = -2.\n", - "vel[vel > 2.] = 2.\n", - "cmap = matplotlib.cm.get_cmap(\"seismic\").copy()\n", - "cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "vel_plot = dum_vel_ax.pcolormesh(date2_basta_time,\\\n", - " basta_height/1.e3,\\\n", - " vel,\\\n", - " cmap=cmap,\\\n", - " vmin=-2.001,vmax=2.001,\\\n", - " ) \n", - "dum_vel_ax.set_axisbelow(False)\n", - "dum_vel_ax.grid(True,c='grey',axis='both')\n", - "\n", - "#--------------------------------------------------------------\n", - "# CEIL\n", - "#--------------------------------------------------------------\n", - "beta = date2_ceil_backscatter.copy()\n", - "beta[(beta > -999.) & (beta < -8.)] = -8.\n", - "beta[beta > -3.] = 3.\n", - "cmap = matplotlib.cm.get_cmap(\"jet\").copy()\n", - "#cmap.set_under('w')\n", - "cmap.set_bad('grey')\n", - "ceil_plot = dum_ceil_ax.pcolormesh(date2_ceil_time,\\\n", - " ceil_height/1.e3,\\\n", - " beta.T,\\\n", - " cmap=cmap,\\\n", - " vmin=-8,vmax=-3,\\\n", - " ) \n", - "dum_ceil_ax.set_axisbelow(False)\n", - "dum_ceil_ax.grid(True,c='grey',axis='both')\n", - "\n", - "# Scatterplot of CBH\n", - "dum_ceil_ax.scatter(date2_ceil_time,date2_ceil_cbh/1.e3,5,marker='o',c='k')\n", - "dum_ref_ax.scatter(date2_ceil_time,date2_ceil_cbh/1.e3,5,marker='o',c='k')\n", - "dum_vel_ax.scatter(date2_ceil_time,date2_ceil_cbh/1.e3,5,marker='o',c='k')\n", - "\n", - "#--------------------------------------------------------------\n", - "# SFC Met\n", - "#--------------------------------------------------------------\n", - "dum_sfc_ax.plot(date2_sfc_time,date2_sfc_temp,lw=3,c='red')\n", - "dum_sfc_ax.tick_params(axis='y',labelsize=Fontsize,colors='red')\n", - "dum_sfc_ax.set_ylabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize,c='red')\n", - "dum_sfc_ax.spines['left'].set_color('red')\n", - "dum_sfc_twin_ax.spines['right'].set_visible(False)\n", - "\n", - "\n", - "dum_sfc_twin_ax = dum_sfc_ax.twinx()\n", - "dum_sfc_twin_ax.plot(date2_sfc_time,date2_sfc_rh,lw=3,c='blue')\n", - "dum_sfc_twin_ax.tick_params(axis='y',labelsize=Fontsize,colors='blue')\n", - "dum_sfc_twin_ax.set_ylabel('RH [%]',fontsize=Fontsize,c='blue')\n", - "dum_sfc_twin_ax.spines['right'].set_color('blue')\n", - "dum_sfc_twin_ax.spines['left'].set_visible(False)\n", - "dum_sfc_twin_ax.set_ylim(75,100.)\n", - "\n", - "# Find contiguous regions where rh > 95.\n", - "cloud_layer_mask = np.zeros(len(date2_sfc_rh))\n", - "dumid = np.where(date2_sfc_rh >= 95.)\n", - "if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - "cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - "for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " date2_sfc_ax.axvspan(date2_sfc_time[dumid[0]],date2_sfc_time[dumid[-1]],facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "#================================================\n", - "# Colorbars\n", - "#================================================\n", - "\n", - "# Fixed Date 1\n", - "date1_xcbar_xstart = 0.48\n", - "date1_xcbar_xwidth = 0.01\n", - "date1_xcbar_ylength = 0.11\n", - "# Variable Date 1\n", - "date1_xcbar_ystart_ref = 0.61\n", - "date1_xcbar_ystart_vel = 0.4475\n", - "date1_xcbar_ystart_ceil = 0.285\n", - "\n", - "# Fixed Date 2\n", - "date2_xcbar_xstart = 0.91\n", - "date2_xcbar_xwidth = date1_xcbar_xwidth\n", - "date2_xcbar_ylength = date1_xcbar_ylength\n", - "# Variable Date 2\n", - "date2_xcbar_ystart_ref = date1_xcbar_ystart_ref\n", - "date2_xcbar_ystart_vel = date1_xcbar_ystart_vel\n", - "date2_xcbar_ystart_ceil = date1_xcbar_ystart_ceil\n", - "\n", - "\n", - "# Date 1 Reflectivity\n", - "dum_ticks = [-50,-40,-30,-20,-10,0,10,20]\n", - "ref_cbar_ax = fig.add_axes([date1_xcbar_xstart,date1_xcbar_ystart_ref,date1_xcbar_xwidth,date1_xcbar_ylength])\n", - "ref_cbar = fig.colorbar(ref_plot,orientation='vertical',cax=ref_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ref_cbar.ax.set_ylabel('Reflectivity [dBZ]',fontsize=Fontsize)\n", - "ref_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 1 Doppler Velocity\n", - "dum_ticks = [-2.,-1.5,-1.,-0.5,0,0.5,1,1.5,2]\n", - "vel_cbar_ax = fig.add_axes([date1_xcbar_xstart,date1_xcbar_ystart_vel,date1_xcbar_xwidth,date1_xcbar_ylength])\n", - "vel_cbar = fig.colorbar(vel_plot,orientation='vertical',cax=vel_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "vel_cbar.ax.set_ylabel('Doppler Velocity [m s$^{-1}$]',fontsize=Fontsize)\n", - "vel_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 1 CEIL\n", - "dum_ticks = [-8,-7,-6,-5,-4,-3]\n", - "ceil_cbar_ax = fig.add_axes([date1_xcbar_xstart,date1_xcbar_ystart_ceil,date1_xcbar_xwidth,date1_xcbar_ylength])\n", - "ceil_cbar = fig.colorbar(ceil_plot,orientation='vertical',cax=ceil_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ceil_cbar.ax.set_ylabel('$log_{10}(\\\\beta_{att})$ [m$^{-1}$ sr$^{-1}$]',fontsize=Fontsize)\n", - "ceil_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "\n", - "# Date 2 Reflectivity\n", - "dum_ticks = [-50,-40,-30,-20,-10,0,10,20]\n", - "ref_cbar_ax = fig.add_axes([date2_xcbar_xstart,date2_xcbar_ystart_ref,date2_xcbar_xwidth,date2_xcbar_ylength])\n", - "ref_cbar = fig.colorbar(ref_plot,orientation='vertical',cax=ref_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ref_cbar.ax.set_ylabel('Reflectivity [dBZ]',fontsize=Fontsize)\n", - "ref_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 2 Doppler Velocity\n", - "dum_ticks = [-2.,-1.5,-1.,-0.5,0,0.5,1,1.5,2]\n", - "vel_cbar_ax = fig.add_axes([date2_xcbar_xstart,date2_xcbar_ystart_vel,date2_xcbar_xwidth,date2_xcbar_ylength])\n", - "vel_cbar = fig.colorbar(vel_plot,orientation='vertical',cax=vel_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "vel_cbar.ax.set_ylabel('Doppler Velocity [m s$^{-1}$]',fontsize=Fontsize)\n", - "vel_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "# Date 2 CEIL\n", - "dum_ticks = [-8,-7,-6,-5,-4,-3]\n", - "ceil_cbar_ax = fig.add_axes([date2_xcbar_xstart,date2_xcbar_ystart_ceil,date2_xcbar_xwidth,date2_xcbar_ylength])\n", - "ceil_cbar = fig.colorbar(ceil_plot,orientation='vertical',cax=ceil_cbar_ax,\\\n", - " ticks=dum_ticks)\n", - "ceil_cbar.ax.set_ylabel('$log_{10}(\\\\beta_{att})$ [m$^{-1}$ sr$^{-1}$]',fontsize=Fontsize)\n", - "ceil_cbar.ax.tick_params(labelsize=Fontsize) \n", - "\n", - "\n", - "#================================================\n", - "# Legends\n", - "#================================================\n", - "#legend_elements = [Line2D([0], [0],color='purple',ls='solid',lw=3,label='RH CTH/CBH')]\n", - "\n", - "# RH > 95% - Sfc Met\n", - "purple_patch = mpatches.Patch(color='purple',alpha=0.25,label='RH > 95%')\n", - "lgnd1 = date1_sfc_ax.legend(handles=[purple_patch],\\\n", - " fontsize=Fontsize*1.5,\\\n", - " bbox_to_anchor=(1.3,1.3),\\\n", - " ncol=1,loc='upper right',framealpha=0)\n", - "\n", - "# RH > 95% - Sonde\n", - "purple_patch = mpatches.Patch(color='purple',alpha=0.25,label='RH > 95%')\n", - "lgnd2 = date1_sonde2_ax.legend(handles=[purple_patch],\\\n", - " fontsize=Fontsize*1.5,\\\n", - " bbox_to_anchor=(1.75,1.35),\\\n", - " ncol=1,loc='upper right',framealpha=0)\n", - "\n", - "# Missing/Invalid Data\n", - "grey_patch = mpatches.Patch(color='grey',alpha=1.,label='Missing/Invalid Data')\n", - "lgnd3 = date1_basta_ref_ax.legend(handles=[grey_patch],\\\n", - " fontsize=Fontsize*1.5,\\\n", - " bbox_to_anchor=(1.35,1.275),\\\n", - " ncol=1,loc='upper right',framealpha=0)\n", - "\n", - "# CBH\n", - "legend_elements = [Line2D([0], [0],color='black',ls='solid',c='white',label='CBH',marker='o',markersize=10,markeredgecolor='k',markerfacecolor='k')]\n", - "lgnd4 = date1_basta_vel_ax.legend(handles=legend_elements,\\\n", - " fontsize=Fontsize*1.5,\\\n", - " bbox_to_anchor=(1.2,1.4),\\\n", - " ncol=1,loc='upper right',framealpha=0)\n", - "\n", - "\n", - "\n", - "datestr = dates_lim[0].strftime('%Y/%m/%d')\n", - "\n", - "# Sonde Path\n", - "legend_elements = [Line2D([0], [0],color='brown',ls='solid',label='Sonde Path',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])]\n", - "lgnd5 = date1_basta_vel_ax.legend(handles=legend_elements,\\\n", - " fontsize=Fontsize*1.5,\\\n", - " bbox_to_anchor=(1.3,1.275),\\\n", - " ncol=1,loc='upper right',framealpha=0)\n", - "\n", - "date1_basta_vel_ax.add_artist(lgnd4)\n", - "\n", - "datestr = dates_lim[0].strftime('%Y/%m/%d')\n", - "\n", - "#=======================================================\n", - "# Titles & Labels\n", - "#=======================================================\n", - "date1_sonde1_ax.text(1.4,1.55,'15 April 2016',color='black',fontsize=Fontsize*2.25,fontweight='bold',transform=date1_sonde1_ax.transAxes,ha='center',va='center')\n", - "date2_sonde1_ax.text(1.4,1.55,'22-23 May 2016',color='black',fontsize=Fontsize*2.25,fontweight='bold',transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "date1_basta_ref_ax.text(0.5,1.15,'BASTA Reflectivity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.75,transform=date1_basta_ref_ax.transAxes,ha='center',va='center')\n", - "date2_basta_ref_ax.text(0.5,1.15,'BASTA Reflectivity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.75,transform=date2_basta_ref_ax.transAxes,ha='center',va='center')\n", - "date1_basta_vel_ax.text(0.5,1.15,'BASTA Doppler Velocity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.75,transform=date1_basta_vel_ax.transAxes,ha='center',va='center')\n", - "date2_basta_vel_ax.text(0.5,1.15,'BASTA Doppler Velocity',c='dimgrey',fontweight='bold',fontsize=Fontsize*1.75,transform=date2_basta_vel_ax.transAxes,ha='center',va='center')\n", - "date1_ceil_ax.text(0.5,1.15,'Univ. of Canterbury Ceilometer $\\\\beta_{att}$',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.67,transform=date1_ceil_ax.transAxes,ha='center',va='center')\n", - "date2_ceil_ax.text(0.5,1.15,'Univ. of Canterbury Ceilometer $\\\\beta_{att}$',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.75,transform=date2_ceil_ax.transAxes,ha='center',va='center')\n", - "date1_sfc_ax.text(0.5,1.1,'Surface Meteorology',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.67,transform=date1_sfc_ax.transAxes,ha='center',va='center')\n", - "date2_sfc_ax.text(0.5,1.1,'Surface Meteorology',c='dimgrey',\\\n", - " fontweight='bold',fontsize=Fontsize*1.75,transform=date2_sfc_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 1 Sonde 1\n", - "dumstr=date1_sonde1_time.strftime('%H%M')\n", - "dumstr2=date1_sonde1_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 1 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date1_sonde1_ax.text(0.5,1.3,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date1_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 1 Sonde 2\n", - "dumstr=date1_sonde2_time.strftime('%H%M')\n", - "dumstr2=date1_sonde2_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 2 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date1_sonde2_ax.text(0.5,1.3,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date1_sonde2_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 2 Sonde 1\n", - "dumstr=date2_sonde1_time.strftime('%H%M')\n", - "dumstr2=date2_sonde1_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 1 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date2_sonde1_ax.text(0.5,1.3,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date2_sonde1_ax.transAxes,ha='center',va='center')\n", - "\n", - "# Date 2 Sonde 2\n", - "dumstr=date2_sonde2_time.strftime('%H%M')\n", - "dumstr2=date2_sonde2_time.strftime('%m/%d/%Y')\n", - "dumstr='Sounding 2 @ '+dumstr+' UTC\\non '+dumstr2\n", - "date2_sonde2_ax.text(0.5,1.3,dumstr,c='dimgrey',fontweight='bold',fontsize=Fontsize*1.5,transform=date2_sonde2_ax.transAxes,ha='center',va='center')\n", - "\n", - "#======================================\n", - "# Misc. Fixes\n", - "#======================================\n", - "date1_sonde1_ax.set_xlim(5,8)\n", - "date1_sonde2_ax.set_xlim(5,8)\n", - "date2_sonde1_ax.set_xlim(1.75,7)\n", - "date2_sonde2_ax.set_xlim(1.75,7)\n", - "\n", - "\n", - "#======================================\n", - "# Plot Sonde Paths\n", - "#======================================\n", - "import matplotlib.patheffects as pe\n", - "\n", - "date1_basta_ref_ax.plot(date1_sonde1_time_long,date1_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date1_basta_ref_ax.plot(date1_sonde2_time_long,date1_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_basta_ref_ax.plot(date2_sonde1_time_long,date2_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_basta_ref_ax.plot(date2_sonde2_time_long,date2_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "date1_basta_vel_ax.plot(date1_sonde1_time_long,date1_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date1_basta_vel_ax.plot(date1_sonde2_time_long,date1_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_basta_vel_ax.plot(date2_sonde1_time_long,date2_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_basta_vel_ax.plot(date2_sonde2_time_long,date2_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "date1_ceil_ax.plot(date1_sonde1_time_long,date1_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date1_ceil_ax.plot(date1_sonde2_time_long,date1_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_ceil_ax.plot(date2_sonde1_time_long,date2_sonde1_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "date2_ceil_ax.plot(date2_sonde2_time_long,date2_sonde2_height*1.e-3,c='brown',lw=5,path_effects=[pe.Stroke(linewidth=10, foreground='deepskyblue'), pe.Normal()])\n", - "\n", - "# Locate Soundings\n", - "fac = 1.1\n", - "# Date 1\n", - "# Sonde1\n", - "date1_basta_ref_ax.text(date1_sonde1_time_long[-1],(date1_sonde1_height[-1]*1.e-3)+0.05,'Sounding 1',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "date1_basta_vel_ax.text(date1_sonde1_time_long[-1],(date1_sonde1_height[-1]*1.e-3)+0.05,'Sounding 1',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "date1_ceil_ax.text(date1_sonde1_time_long[-1],(date1_sonde1_height[-1]*1.e-3)+0.05,'Sounding 1',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "# Sonde2\n", - "date1_basta_ref_ax.text(date1_sonde2_time_long[-1],(date1_sonde2_height[-1]*1.e-3)+0.05,'Sounding 2',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "date1_basta_vel_ax.text(date1_sonde2_time_long[-1],(date1_sonde2_height[-1]*1.e-3)+0.05,'Sounding 2',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "date1_ceil_ax.text(date1_sonde2_time_long[-1],(date1_sonde2_height[-1]*1.e-3)+0.05,'Sounding 2',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "\n", - "# Date 2\n", - "# Sonde1\n", - "date2_basta_ref_ax.text(date2_sonde1_time_long[-1],(date2_sonde1_height[-1]*1.e-3)+0.05,'Sounding 1',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "date2_basta_vel_ax.text(date2_sonde1_time_long[-1],(date2_sonde1_height[-1]*1.e-3)+0.05,'Sounding 1',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "date2_ceil_ax.text(date2_sonde1_time_long[-1],(date2_sonde1_height[-1]*1.e-3)+0.05,'Sounding 1',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='left',va='center')\n", - "# Sonde2\n", - "date2_basta_ref_ax.text(date2_sonde2_time_long[-1],(date2_sonde2_height[-1]*1.e-3)+0.05,'Sounding 2',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='right',va='center')\n", - "date2_basta_vel_ax.text(date2_sonde2_time_long[-1],(date2_sonde2_height[-1]*1.e-3)+0.05,'Sounding 2',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='right',va='center')\n", - "date2_ceil_ax.text(date2_sonde2_time_long[-1],(date2_sonde2_height[-1]*1.e-3)+0.05,'Sounding 2',c='brown',fontsize=Fontsize*fac,fontweight='bold',ha='right',va='center')\n", - "\n", - "plt.subplots_adjust(wspace=0.6,hspace=0.45)\n", - "\n", - "xpos = 0.025\n", - "ypos = 0.875\n", - "fac = 2.25\n", - "date1_sonde1_ax.text(xpos,ypos,'(a)',fontsize=Fontsize*fac,transform=date1_sonde1_ax.transAxes,fontweight='bold')\n", - "date1_sonde2_ax.text(xpos,ypos,'(b)',fontsize=Fontsize*fac,transform=date1_sonde2_ax.transAxes,fontweight='bold')\n", - "date2_sonde1_ax.text(xpos,ypos,'(c)',fontsize=Fontsize*fac,transform=date2_sonde1_ax.transAxes,fontweight='bold')\n", - "date2_sonde2_ax.text(xpos,ypos,'(d)',fontsize=Fontsize*fac,transform=date2_sonde2_ax.transAxes,fontweight='bold')\n", - "date1_basta_ref_ax.text(xpos,ypos,'(e)',fontsize=Fontsize*fac,transform=date1_basta_ref_ax.transAxes,fontweight='bold')\n", - "date2_basta_ref_ax.text(xpos,ypos,'(f)',fontsize=Fontsize*fac,transform=date2_basta_ref_ax.transAxes,fontweight='bold')\n", - "date1_basta_vel_ax.text(xpos,ypos,'(g)',fontsize=Fontsize*fac,transform=date1_basta_vel_ax.transAxes,fontweight='bold')\n", - "date2_basta_vel_ax.text(xpos,ypos,'(h)',fontsize=Fontsize*fac,transform=date2_basta_vel_ax.transAxes,fontweight='bold')\n", - "date1_ceil_ax.text(xpos,ypos,'(i)',fontsize=Fontsize*fac,transform=date1_ceil_ax.transAxes,fontweight='bold')\n", - "date2_ceil_ax.text(xpos,ypos,'(j)',fontsize=Fontsize*fac,transform=date2_ceil_ax.transAxes,fontweight='bold')\n", - "date1_sfc_ax.text(xpos,ypos,'(k)',fontsize=Fontsize*fac,transform=date1_sfc_ax.transAxes,fontweight='bold')\n", - "date2_sfc_ax.text(xpos,ypos,'(l)',fontsize=Fontsize*fac,transform=date2_sfc_ax.transAxes,fontweight='bold')\n", - "\n", - "fig_path = '/home/mwstanfo/figures/micre_paper/'\n", - "outfile = 'fig_a5.png'\n", - "plt.savefig(fig_path+outfile,dpi=200,bbox_inches='tight')\n", - "#plt.show()\n", - "plt.close()\n", - "print('done')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bfd406d9-a24a-480e-9510-834d4ea70679", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def plot_sfc_met(sfc_met_ax1,sfc_met_ax2,sfc_met_dict,basta_dict):\n", - " \n", - " temperature = sfc_met_dict['native_temperature']\n", - " pressure = sfc_met_dict['native_pressure']\n", - " rh = sfc_met_dict['native_rh']\n", - " time_dt = sfc_met_dict['native_time_dt']\n", - " wind_speed = sfc_met_dict['native_wind_speed']\n", - " wind_dir = sfc_met_dict['native_wind_dir']\n", - " \n", - " \n", - " #--------------------------------------------\n", - " # Temp, RH, Pressure\n", - " #-------------------------------------------- \n", - " sfc_met_ax1.plot(time_dt,temperature,lw=3,c='red')\n", - " sfc_met_ax1.set_ylabel('Temperature [$^{\\\\circ}$C]',fontsize=Fontsize)\n", - " sfc_met_ax1_rh = sfc_met_ax1.twinx()\n", - " sfc_met_ax1_rh.set_ylabel('RH [%]',fontsize=Fontsize)\n", - " sfc_met_ax1_rh.plot(time_dt,rh,lw=3,c='blue')\n", - "\n", - " # deal with axis colors\n", - " sfc_met_ax1.spines['left'].set_color('red')\n", - " sfc_met_ax1_rh.spines['right'].set_color('blue')\n", - " sfc_met_ax1.yaxis.label.set_color('red')\n", - " sfc_met_ax1_rh.yaxis.label.set_color('blue')\n", - " sfc_met_ax1.tick_params(axis='y', colors='red')\n", - " sfc_met_ax1_rh.tick_params(axis='y', labelsize=Fontsize, colors='blue')\n", - " sfc_met_ax1_rh.spines['left'].set_visible(False)\n", - " sfc_met_ax1_rh.set_ylim(0,100)\n", - " \n", - " # add pressure to plot\n", - " sfc_met_ax1_pressure = sfc_met_ax1.twinx()\n", - " sfc_met_ax1_pressure.plot(time_dt,pressure*10.,lw=3,c='black')\n", - " sfc_met_ax1_pressure.set_ylabel('Surface Pressure [hPa]',fontsize=Fontsize)\n", - " sfc_met_ax1_pressure.yaxis.set_label_position(\"right\")\n", - " sfc_met_ax1_pressure.yaxis.set_ticks_position(\"right\")\n", - " sfc_met_ax1_pressure.spines['right'].set_position(('axes', +1.1))\n", - " sfc_met_ax1_pressure.yaxis.label.set_color('black')\n", - " sfc_met_ax1_pressure.tick_params(axis='y',labelsize=Fontsize,colors='black')\n", - " sfc_met_ax1_pressure.spines['right'].set_color('black')\n", - "\n", - " \n", - " # Find contiguous regions where rh > 95.\n", - " cloud_layer_mask = np.zeros(len(rh))\n", - " dumid = np.where(rh >= 95.)\n", - " if np.size(dumid) > 0.:\n", - " cloud_layer_mask[dumid] = 1\n", - " cloud_Objects,num_cloud_objects = ndimage.label(cloud_layer_mask)\n", - "\n", - " #dumy=sfc_met_ax1_rh.get_ylim()\n", - " #dumy = np.arange(dumy[0],dumy[1]+1)\n", - "\n", - " for kk in range(num_cloud_objects):\n", - " dumid = np.where(cloud_Objects == (kk+1))\n", - " dumid = np.squeeze(dumid)\n", - " if np.size(dumid) > 1:\n", - " sfc_met_ax1_rh.axvspan(time_dt[dumid[0]],time_dt[dumid[-1]],facecolor='purple',alpha=0.25)\n", - "\n", - "\n", - "\n", - " #--------------------------------------------\n", - " # Winds\n", - " #-------------------------------------------- \n", - " sfc_met_ax2.plot(time_dt,wind_speed,lw=3,c='black')\n", - " sfc_met_ax2.set_ylabel('Wind Speed [m s$^{-1}$]',fontsize=Fontsize)\n", - " sfc_met_ax2_dir = sfc_met_ax2.twinx()\n", - " sfc_met_ax2_dir.set_ylabel('Wind Direction [$^{\\\\circ}$]',fontsize=Fontsize)\n", - " sfc_met_ax2_dir.scatter(time_dt,wind_dir,s=2,lw=3,c='blue')\n", - " \n", - " # deal with axis colors\n", - " sfc_met_ax2_dir.spines['right'].set_color('blue')\n", - " sfc_met_ax2_dir.yaxis.label.set_color('blue')\n", - " sfc_met_ax2_dir.tick_params(axis='y', labelsize=Fontsize, colors='blue')\n", - " sfc_met_ax2_dir.spines['left'].set_visible(False)\n", - " \n", - " sfc_met_ax1.set_axisbelow(False)\n", - " sfc_met_ax2.set_axisbelow(False)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fbb73c5a-2102-4796-8acb-1069f71f3b21", - "metadata": {}, - "outputs": [], - "source": [ - "# wrapper\n", - "Fontsize=20\n", - "\n", - "\n", - "dum_return = plot_figure(dates_lim,merged_dicts)\n", - "#future = client.submit(plot_figure,date,infile,y_lim)\n", - "#futures.append(future)\n", - "print(aaaa)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59065e20-c3a0-45cb-b43f-ffe6987c449b", - "metadata": {}, - "outputs": [], - "source": [ - "#cluster = LocalCluster(n_workers=8,threads_per_worker=1,memory_limit='4GB',processes=True)\n", - "#cluster" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e048c244-53a3-41d1-bf72-b56c12f9634c", - "metadata": {}, - "outputs": [], - "source": [ - "#client = Client(cluster)\n", - "#client" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -}