In [1]:
import numpy as np
from matplotlib import pyplot as plt
import os
import warnings
warnings.filterwarnings("ignore",category=FutureWarning)
import xarray as xr
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
warnings.filterwarnings("ignore",message='invalid value encountered in less_equal')
%matplotlib inline
In [2]:
savePath = '/Users/danstechman/GoogleDrive/School/Research/PECAN/Microphysics/plots/vertical_profiles'
fType = 'pdf'
noDispSave = False
plotSepSprls = True
plotZoneCmp = False
plotRH = False
plotNt = False
plotTWC = False
plotDmm = False
plotARat = False
plotARatRH = True
plotRE = False
plotRjcR = False
# Define temp bin interval
binIntvl = 1.0
# flights = ['20150617','20150620','20150701','20150702','20150706','20150709']
flights = ['20150620']
tzFill = 'darkkhaki'
tzLine = '#5F5B36'
esrFill = 'mediumslateblue'
esrLine = '#3D3477'
arFill = 'darkcyan'
arLine = '#005757'
In [3]:
tempLim = (22,-18.5)
rhLim = (0,120)
NtLim = (1e-6,1)
twcLim = (1e-5,10)
DmmLim = (0,5) #** Outliers (otherwise upper-end can be ~2.5)
ARatLim = (0.2,0.85)
reLim = (0.01,0.19) #** Outliers (otherwise upper-end can be 0.12)
RjcrLim = (0,1)
In [5]:
# Define temperature bin edges and determine bin midpoints
edgeMin = -19.0 - (binIntvl/2.)
edgeMax = 20.5 + (binIntvl/2.)
edgesTemp = np.arange(edgeMin,edgeMax,binIntvl)
bin_mid = (edgesTemp[0:-1] + edgesTemp[1:])/2
numBins = len(edgesTemp)-1
for flight in flights:
print('Working on {}...'.format(flight))
figSavePath = '{}/{}'.format(savePath,flight)
if not os.path.exists(figSavePath):
os.makedirs(figSavePath)
# Dictionaries to hold all spiral data in each zone for a given flight
tzAll = {'tempC': [],'rh': [],'Nt': [],'twc': [],'Dmm': [],'ar': [],'re': [],'rjctRatio': []}
srAll = {'tempC': [],'rh': [],'Nt': [],'twc': [],'Dmm': [],'ar': [],'re': [],'rjctRatio': []}
arAll = {'tempC': [],'rh': [],'Nt': [],'twc': [],'Dmm': [],'ar': [],'re': [],'rjctRatio': []}
cipFile = '/Users/danstechman/GoogleDrive/PECAN-Data/mp-data/' + flight + '/' + flight + '_CIPfit-spirals-10s1sAvg.nc'
pecanPrmF = '/Users/danstechman/GoogleDrive/PECAN-Data/' + flight + '_PECANparams.nc'
# Pull out any PECAN parameters
pecanPrms = xr.open_dataset(pecanPrmF,decode_times=False)
mlBotTemp = pecanPrms.mlBotTemp.data
mlTopTemp = pecanPrms.mlTopTemp.data
# Pull out any global variables/attributes from the netcdf file
cipData_root = xr.open_dataset(cipFile)
sprlZone = str(cipData_root.sprlZone.data,'utf-8')
mcsType = str(cipData_root.mcsType.data,'utf-8')
numSprls = len(sprlZone)
# Loop over each spiral for the current flight
for ix in np.arange(0,numSprls):
print('\tAnalyzing Spiral {}'.format(ix+1))
######### Dicitionaries to hold spiral zone data for current spiral
sprlData = {'tempC': [],'rh': [],'Nt': [],'twc': [],'Dmm': [],'ar': [],'re': [],'rjctRatio': []}
# Open the group associated with the current spiral
cipData = xr.open_dataset(cipFile,group='spiral_' + str(ix+1))
sprlData['tempC'].append(cipData.tempC_10s.data.tolist())
sprlData['rh'].append(cipData.rh_10s.data.tolist())
sprlData['Nt'].append(cipData.cipNt_hybrid_igf.data.tolist())
sprlData['twc'].append(cipData.cipTWC_hybrid_igf_mlr.data.tolist())
sprlData['Dmm'].append(cipData.cipDmm_hybrid_igf_mlr.data.tolist())
sprlData['ar'].append(cipData.areaRatio_10s.data.tolist())
sprlData['re'].append(cipData.efctvRadius_10s_mlr.data.tolist())
sprlData['rjctRatio'].append(cipData.rjctRatio_10s.data.tolist())
if sprlZone[ix] == 'T':
tzAll['tempC'].append(cipData.tempC_10s.data.tolist())
tzAll['rh'].append(cipData.rh_10s.data.tolist())
tzAll['Nt'].append(cipData.cipNt_hybrid_igf.data.tolist())
tzAll['twc'].append(cipData.cipTWC_hybrid_igf_mlr.data.tolist())
tzAll['Dmm'].append(cipData.cipDmm_hybrid_igf_mlr.data.tolist())
tzAll['ar'].append(cipData.areaRatio_10s.data.tolist())
tzAll['re'].append(cipData.efctvRadius_10s_mlr.data.tolist())
tzAll['rjctRatio'].append(cipData.rjctRatio_10s.data.tolist())
if sprlZone[ix] == 'S':
srAll['tempC'].append(cipData.tempC_10s.data.tolist())
srAll['rh'].append(cipData.rh_10s.data.tolist())
srAll['Nt'].append(cipData.cipNt_hybrid_igf.data.tolist())
srAll['twc'].append(cipData.cipTWC_hybrid_igf_mlr.data.tolist())
srAll['Dmm'].append(cipData.cipDmm_hybrid_igf_mlr.data.tolist())
srAll['ar'].append(cipData.areaRatio_10s.data.tolist())
srAll['re'].append(cipData.efctvRadius_10s_mlr.data.tolist())
srAll['rjctRatio'].append(cipData.rjctRatio_10s.data.tolist())
if sprlZone[ix] == 'A':
arAll['tempC'].append(cipData.tempC_10s.data.tolist())
arAll['rh'].append(cipData.rh_10s.data.tolist())
arAll['Nt'].append(cipData.cipNt_hybrid_igf.data.tolist())
arAll['twc'].append(cipData.cipTWC_hybrid_igf_mlr.data.tolist())
arAll['Dmm'].append(cipData.cipDmm_hybrid_igf_mlr.data.tolist())
arAll['ar'].append(cipData.areaRatio_10s.data.tolist())
arAll['re'].append(cipData.efctvRadius_10s_mlr.data.tolist())
arAll['rjctRatio'].append(cipData.rjctRatio_10s.data.tolist())
# Pull out all the data for each variable and place within a single list
sprlData['tempC'] = [i for sublist in sprlData['tempC'] for i in sublist]
sprlData['rh'] = [i for sublist in sprlData['rh'] for i in sublist]
sprlData['Nt'] = [i for sublist in sprlData['Nt'] for i in sublist]
sprlData['twc'] = [i for sublist in sprlData['twc'] for i in sublist]
sprlData['Dmm'] = [i for sublist in sprlData['Dmm'] for i in sublist]
sprlData['ar'] = [i for sublist in sprlData['ar'] for i in sublist]
sprlData['re'] = [i for sublist in sprlData['re'] for i in sublist]
sprlData['rjctRatio'] = [i for sublist in sprlData['rjctRatio'] for i in sublist]
# Convert the lists in each dictionary to numpy arrays
sprlData = {key: np.array(val) for key, val in sprlData.items()}
# Change units as desired for any variables
sprlData['re'] = sprlData['re']/1000 # Convert from um to mm
# Set 0's to NaNs in variables where the 0's cause issues
# with the fill plotting (and where a 0 vs. a NaN do not
# make a difference scientifically in my case)
sprlData['Dmm'][sprlData['Dmm'] == 0] = np.nan
sprlData['Nt'][sprlData['Nt'] == 0] = np.nan
sprlData['twc'][sprlData['twc'] == 0] = np.nan
########### Initialize temperature bins and create empty variables for our stats
# Determine which bins each of the temperatures correspond to within each MCS zone
whichBinTemp_sprl = np.digitize(sprlData['tempC'],edgesTemp)
# Define arrays filled with NaNs to hold the min/max/mean/quantiles
# for each variable and at each temperature bin
binRH_min_sprl, binRH_max_sprl, binRH_mean_sprl, binRH_median_sprl, binRH_10pct_sprl, binRH_25pct_sprl, binRH_75pct_sprl, binRH_90pct_sprl, \
binNt_min_sprl, binNt_max_sprl, binNt_mean_sprl, binNt_median_sprl, binNt_10pct_sprl, binNt_25pct_sprl, binNt_75pct_sprl, binNt_90pct_sprl, \
binTWC_min_sprl, binTWC_max_sprl, binTWC_mean_sprl, binTWC_median_sprl, binTWC_10pct_sprl, binTWC_25pct_sprl, binTWC_75pct_sprl, binTWC_90pct_sprl, \
binDmm_min_sprl, binDmm_max_sprl, binDmm_mean_sprl, binDmm_median_sprl, binDmm_10pct_sprl, binDmm_25pct_sprl, binDmm_75pct_sprl, binDmm_90pct_sprl, \
binARat_min_sprl, binARat_max_sprl, binARat_mean_sprl, binARat_median_sprl, binARat_10pct_sprl, binARat_25pct_sprl, binARat_75pct_sprl, binARat_90pct_sprl, \
binRE_min_sprl, binRE_max_sprl, binRE_mean_sprl, binRE_median_sprl, binRE_10pct_sprl, binRE_25pct_sprl, binRE_75pct_sprl, binRE_90pct_sprl, \
binRjcR_min_sprl, binRjcR_max_sprl, binRjcR_mean_sprl, binRjcR_median_sprl, binRjcR_10pct_sprl, binRjcR_25pct_sprl, binRjcR_75pct_sprl, binRjcR_90pct_sprl, \
= [np.full(numBins,np.nan) for i in range(56)]
########### Bin data by temperature and calculate stats
# Loop through the temperature bins and determine the indices of the
# temperature variable corresponding to temps within said bin
# Then, use these indices to refer to the appropriate values in each of
# our variables of interest
with warnings.catch_warnings():
# Many of our variables have temp bins with all NaNs which will
# throw runtime warnings everytime we try to use nan*math functions
# Here we just tell python to ignore these specific warnings to unclutter
# the output
warnings.filterwarnings('ignore', 'All-NaN (slice|axis) encountered')
warnings.filterwarnings('ignore', 'Mean of empty slice')
for ib in range(0,numBins):
binMatch_sprl = np.squeeze(np.where(whichBinTemp_sprl == ib))
binRH_sprl = sprlData['rh'][binMatch_sprl]
binNt_sprl = sprlData['Nt'][binMatch_sprl]
binTWC_sprl = sprlData['twc'][binMatch_sprl]
binDmm_sprl = sprlData['Dmm'][binMatch_sprl]
binARat_sprl = sprlData['ar'][binMatch_sprl]
binRE_sprl = sprlData['re'][binMatch_sprl]
binRjcR_sprl = sprlData['rjctRatio'][binMatch_sprl]
if np.any(binMatch_sprl):
binRH_min_sprl[ib] = np.nanmin(binRH_sprl)
binRH_max_sprl[ib] = np.nanmax(binRH_sprl)
binRH_mean_sprl[ib] = np.nanmean(binRH_sprl)
binRH_median_sprl[ib] = np.nanmedian(binRH_sprl)
binRH_10pct_sprl[ib] = np.nanpercentile(binRH_sprl,10)
binRH_25pct_sprl[ib] = np.nanpercentile(binRH_sprl,25)
binRH_75pct_sprl[ib] = np.nanpercentile(binRH_sprl,75)
binRH_90pct_sprl[ib] = np.nanpercentile(binRH_sprl,90)
binNt_min_sprl[ib] = np.nanmin(binNt_sprl)
binNt_max_sprl[ib] = np.nanmax(binNt_sprl)
binNt_mean_sprl[ib] = np.nanmean(binNt_sprl)
binNt_median_sprl[ib] = np.nanmedian(binNt_sprl)
binNt_10pct_sprl[ib] = np.nanpercentile(binNt_sprl,10)
binNt_25pct_sprl[ib] = np.nanpercentile(binNt_sprl,25)
binNt_75pct_sprl[ib] = np.nanpercentile(binNt_sprl,75)
binNt_90pct_sprl[ib] = np.nanpercentile(binNt_sprl,90)
binTWC_min_sprl[ib] = np.nanmin(binTWC_sprl)
binTWC_max_sprl[ib] = np.nanmax(binTWC_sprl)
binTWC_mean_sprl[ib] = np.nanmean(binTWC_sprl)
binTWC_median_sprl[ib] = np.nanmedian(binTWC_sprl)
binTWC_10pct_sprl[ib] = np.nanpercentile(binTWC_sprl,10)
binTWC_25pct_sprl[ib] = np.nanpercentile(binTWC_sprl,25)
binTWC_75pct_sprl[ib] = np.nanpercentile(binTWC_sprl,75)
binTWC_90pct_sprl[ib] = np.nanpercentile(binTWC_sprl,90)
binDmm_min_sprl[ib] = np.nanmin(binDmm_sprl)
binDmm_max_sprl[ib] = np.nanmax(binDmm_sprl)
binDmm_mean_sprl[ib] = np.nanmean(binDmm_sprl)
binDmm_median_sprl[ib] = np.nanmedian(binDmm_sprl)
binDmm_10pct_sprl[ib] = np.nanpercentile(binDmm_sprl,10)
binDmm_25pct_sprl[ib] = np.nanpercentile(binDmm_sprl,25)
binDmm_75pct_sprl[ib] = np.nanpercentile(binDmm_sprl,75)
binDmm_90pct_sprl[ib] = np.nanpercentile(binDmm_sprl,90)
binARat_min_sprl[ib] = np.nanmin(binARat_sprl)
binARat_max_sprl[ib] = np.nanmax(binARat_sprl)
binARat_mean_sprl[ib] = np.nanmean(binARat_sprl)
binARat_median_sprl[ib] = np.nanmedian(binARat_sprl)
binARat_10pct_sprl[ib] = np.nanpercentile(binARat_sprl,10)
binARat_25pct_sprl[ib] = np.nanpercentile(binARat_sprl,25)
binARat_75pct_sprl[ib] = np.nanpercentile(binARat_sprl,75)
binARat_90pct_sprl[ib] = np.nanpercentile(binARat_sprl,90)
binRE_min_sprl[ib] = np.nanmin(binRE_sprl)
binRE_max_sprl[ib] = np.nanmax(binRE_sprl)
binRE_mean_sprl[ib] = np.nanmean(binRE_sprl)
binRE_median_sprl[ib] = np.nanmedian(binRE_sprl)
binRE_10pct_sprl[ib] = np.nanpercentile(binRE_sprl,10)
binRE_25pct_sprl[ib] = np.nanpercentile(binRE_sprl,25)
binRE_75pct_sprl[ib] = np.nanpercentile(binRE_sprl,75)
binRE_90pct_sprl[ib] = np.nanpercentile(binRE_sprl,90)
binRjcR_min_sprl[ib] = np.nanmin(binRjcR_sprl)
binRjcR_max_sprl[ib] = np.nanmax(binRjcR_sprl)
binRjcR_mean_sprl[ib] = np.nanmean(binRjcR_sprl)
binRjcR_median_sprl[ib] = np.nanmedian(binRjcR_sprl)
binRjcR_10pct_sprl[ib] = np.nanpercentile(binRjcR_sprl,10)
binRjcR_25pct_sprl[ib] = np.nanpercentile(binRjcR_sprl,25)
binRjcR_75pct_sprl[ib] = np.nanpercentile(binRjcR_sprl,75)
binRjcR_90pct_sprl[ib] = np.nanpercentile(binRjcR_sprl,90)
######### Set plot-title-specific strings
if mcsType[ix] == 'F':
typStr = 'Trailing Strat. (formative)'
if mcsType[ix] == 'M':
typStr = 'Trailing Strat. (mature)'
if mcsType[ix] == 'P':
typStr = 'Parallel Strat.'
if mcsType[ix] == 'L':
typStr = 'Leading Strat.'
if mcsType[ix] == 'C':
typStr = 'Cluster MCS'
if sprlZone[ix] == 'T':
zoneStr = 'Transition Zone'
if sprlZone[ix] == 'S':
zoneStr = 'Enh. Strat. Rain Region'
if sprlZone[ix] == 'A':
zoneStr = 'Anvil Region'
# RIJ spirals (all but #3 and #6 from 20 June)
# (Remember that ix is 0-based, i.e., ix=2 is actually spiral 3)
if flight == '20150620':
if ix in [0,1]:
rijStr = ' - RIJ Notch'
elif ix in [3,4,6]:
rijStr = ' - RIJ'
else:
rijStr = ''
else:
rijStr = ''
########### Single Spiral Plotting ###########
if plotSepSprls:
if plotRH:
fig, ax = plt.subplots(figsize=(16,20))
ax.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax.plot(sprlData['rh'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax.invert_yaxis()
ax.set_xlim(rhLim)
ax.set_ylim(tempLim)
ax.set_xlabel('Relative Humidity (%)',fontsize=24)
ax.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax.tick_params(axis='both', which='major', labelsize=22)
ax.set_title('{} - RH - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.grid(which='both')
ax.legend(loc='lower left',fontsize=18)
# Save the output figure
saveStr = '{}/{}_RH_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig.savefig(saveStr,bbox_inches='tight')
plt.close(fig)
if plotNt:
fig2, ax2 = plt.subplots(figsize=(16,20))
ax2.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax2.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax2.plot(sprlData['Nt'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax2.invert_yaxis()
ax2.set_xlim(NtLim)
ax2.set_ylim(tempLim)
ax2.set_xscale('log',nonposx='mask')
ax2.set_xlabel('Total Number Concentration ($cm^{-3}$)',fontsize=24)
ax2.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax2.tick_params(axis='both', which='major', labelsize=22)
ax2.set_title('{} - $N_t$ - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax2.grid(which='both')
ax2.legend(loc='upper left',fontsize=18)
# Save the output figure
saveStr = '{}/{}_Nt_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig2.savefig(saveStr,bbox_inches='tight')
plt.close(fig2)
if plotTWC:
fig3, ax3 = plt.subplots(figsize=(16,20))
ax3.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax3.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax3.plot(sprlData['twc'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax3.invert_yaxis()
ax3.set_xscale('log',nonposx='mask')
ax3.set_xlim(twcLim)
ax3.set_ylim(tempLim)
ax3.set_xlabel('Total Water Content ($g\ m^{-3}$)',fontsize=24)
ax3.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax3.tick_params(axis='both', which='major', labelsize=22)
ax3.set_title('{} - TWC - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax3.grid(which='both')
ax3.legend(loc='upper left',fontsize=18)
# Save the output figure
saveStr = '{}/{}_TWC_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig3.savefig(saveStr,bbox_inches='tight')
plt.close(fig3)
if plotDmm:
fig4, ax4 = plt.subplots(figsize=(16,20))
ax4.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax4.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax4.plot(sprlData['Dmm'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax4.invert_yaxis()
ax4.set_xlim(DmmLim)
ax4.set_ylim(tempLim)
ax4.set_xlabel('Median Mass Diameter (mm)',fontsize=24)
ax4.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax4.tick_params(axis='both', which='major', labelsize=22)
ax4.set_title('{} - $D_{{mm}}$ - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax4.xaxis.set_minor_locator(MultipleLocator(0.25))
ax4.grid(which='both')
ax4.legend(loc='upper right',fontsize=18)
# Save the output figure
saveStr = '{}/{}_Dmm_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig4.savefig(saveStr,bbox_inches='tight')
plt.close(fig4)
if plotARat:
fig5, ax5 = plt.subplots(figsize=(16,20))
ax5.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax5.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax5.plot(sprlData['ar'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax5.invert_yaxis()
ax5.set_xlim(ARatLim)
ax5.set_ylim(tempLim)
ax5.set_xlabel('Area Ratio (%)',fontsize=24)
ax5.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax5.tick_params(axis='both', which='major', labelsize=22)
ax5.set_title('{} - Area Ratio - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax5.xaxis.set_minor_locator(MultipleLocator(0.05))
ax5.grid(which='both')
ax5.legend(loc='upper right',fontsize=18)
# Save the output figure
saveStr = '{}/{}_ARatio_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig5.savefig(saveStr,bbox_inches='tight')
plt.close(fig5)
if plotARatRH:
fig8, ax8 = plt.subplots(figsize=(16,20))
ax8.plot(sprlData['ar'],sprlData['rh'],color='b',linewidth=3)
ax8.set_xlim(ARatLim)
ax8.set_ylim(rhLim)
ax8.set_xlabel('Area Ratio (%)',fontsize=24)
ax8.set_ylabel('RH (%)',fontsize=24)
ax8.tick_params(axis='both', which='major', labelsize=22)
ax8.set_title('{} - Area Ratio - Spiral {}'.format(flight,ix+1),fontsize=26)
ax8.xaxis.set_minor_locator(MultipleLocator(0.05))
ax8.grid(which='both')
# Save the output figure
saveStr = '{}/{}_ARatioRH_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig8.savefig(saveStr,bbox_inches='tight')
plt.close(fig8)
if plotRE:
fig6, ax6 = plt.subplots(figsize=(16,20))
ax6.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax6.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax6.plot(sprlData['re'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax6.invert_yaxis()
ax6.set_xlim(reLim)
ax6.set_ylim(tempLim)
ax6.set_xlabel('Effective Radius (mm)',fontsize=24)
ax6.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax6.tick_params(axis='both', which='major', labelsize=22)
ax6.set_title('{} - $R_e$ - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax6.xaxis.set_minor_locator(MultipleLocator(0.01))
ax6.grid(which='both')
ax6.legend(loc='upper right',fontsize=18)
# Save the output figure
saveStr = '{}/{}_RE_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig6.savefig(saveStr,bbox_inches='tight')
plt.close(fig6)
if plotRjcR:
fig7, ax7 = plt.subplots(figsize=(16,20))
ax7.axhline(y=mlTopTemp[ix],color='black',linestyle='--',linewidth=3,label='ML Top')
ax7.axhline(y=mlBotTemp[ix],color='red',linestyle='--',linewidth=3,label='ML Bottom')
ax7.plot(sprlData['rjctRatio'],sprlData['tempC'],'bo',markeredgecolor='white',markeredgewidth=1,markersize=12)
ax7.invert_yaxis()
ax7.set_xlim(RjcrLim)
ax7.set_ylim(tempLim)
ax7.set_xlabel('Reject Ratio (%)',fontsize=24)
ax7.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax7.tick_params(axis='both', which='major', labelsize=22)
ax7.set_title('{} - Reject Ratio - Spiral {}\n{} - {}{}'.format(flight,ix+1,typStr,zoneStr,rijStr),fontsize=26)
ax7.xaxis.set_minor_locator(MultipleLocator(0.05))
ax7.grid(which='both')
ax7.legend(loc='upper right',fontsize=18)
# Save the output figure
saveStr = '{}/{}_RjcR_sprl{:02d}.{}'.format(figSavePath,flight,ix+1,fType)
if noDispSave:
fig7.savefig(saveStr,bbox_inches='tight')
plt.close(fig7)
##### Pull out all the data for each full-flight variable and place within a single list
tzAll['tempC'] = [i for sublist in tzAll['tempC'] for i in sublist]
tzAll['rh'] = [i for sublist in tzAll['rh'] for i in sublist]
tzAll['Nt'] = [i for sublist in tzAll['Nt'] for i in sublist]
tzAll['twc'] = [i for sublist in tzAll['twc'] for i in sublist]
tzAll['Dmm'] = [i for sublist in tzAll['Dmm'] for i in sublist]
tzAll['ar'] = [i for sublist in tzAll['ar'] for i in sublist]
tzAll['re'] = [i for sublist in tzAll['re'] for i in sublist]
tzAll['rjctRatio'] = [i for sublist in tzAll['rjctRatio'] for i in sublist]
srAll['tempC'] = [i for sublist in srAll['tempC'] for i in sublist]
srAll['rh'] = [i for sublist in srAll['rh'] for i in sublist]
srAll['Nt'] = [i for sublist in srAll['Nt'] for i in sublist]
srAll['twc'] = [i for sublist in srAll['twc'] for i in sublist]
srAll['Dmm'] = [i for sublist in srAll['Dmm'] for i in sublist]
srAll['ar'] = [i for sublist in srAll['ar'] for i in sublist]
srAll['re'] = [i for sublist in srAll['re'] for i in sublist]
srAll['rjctRatio'] = [i for sublist in srAll['rjctRatio'] for i in sublist]
arAll['tempC'] = [i for sublist in arAll['tempC'] for i in sublist]
arAll['rh'] = [i for sublist in arAll['rh'] for i in sublist]
arAll['Nt'] = [i for sublist in arAll['Nt'] for i in sublist]
arAll['twc'] = [i for sublist in arAll['twc'] for i in sublist]
arAll['Dmm'] = [i for sublist in arAll['Dmm'] for i in sublist]
arAll['ar'] = [i for sublist in arAll['ar'] for i in sublist]
arAll['re'] = [i for sublist in arAll['re'] for i in sublist]
arAll['rjctRatio'] = [i for sublist in arAll['rjctRatio'] for i in sublist]
# Convert the lists in each dictionary to numpy arrays
tzAll = {key: np.array(val) for key, val in tzAll.items()}
srAll = {key: np.array(val) for key, val in srAll.items()}
arAll = {key: np.array(val) for key, val in arAll.items()}
# Change units as desired for any variables
tzAll['re'] = tzAll['re']/1000 # Convert from um to mm
srAll['re'] = srAll['re']/1000
arAll['re'] = arAll['re']/1000
# Set 0's to NaNs in variables where the 0's cause issues
# with the fill plotting (and where a 0 vs. a NaN do not
# make a difference scientifically in my case)
tzAll['Dmm'][tzAll['Dmm'] == 0] = np.nan
srAll['Dmm'][srAll['Dmm'] == 0] = np.nan
arAll['Dmm'][arAll['Dmm'] == 0] = np.nan
tzAll['Nt'][tzAll['Nt'] == 0] = np.nan
srAll['Nt'][srAll['Nt'] == 0] = np.nan
arAll['Nt'][arAll['Nt'] == 0] = np.nan
tzAll['twc'][tzAll['twc'] == 0] = np.nan
srAll['twc'][srAll['twc'] == 0] = np.nan
arAll['twc'][arAll['twc'] == 0] = np.nan
####### Initialize temperature bins and create empty variables for our stats
whichBinTemp_TZall = np.digitize(tzAll['tempC'],edgesTemp)
whichBinTemp_SRall = np.digitize(srAll['tempC'],edgesTemp)
whichBinTemp_ARall = np.digitize(arAll['tempC'],edgesTemp)
# Define arrays filled with NaNs to hold the min/max/mean/quantiles
binRH_min_TZall, binRH_max_TZall, binRH_mean_TZall, binRH_median_TZall, binRH_10pct_TZall, binRH_25pct_TZall, binRH_75pct_TZall, binRH_90pct_TZall, \
binNt_min_TZall, binNt_max_TZall, binNt_mean_TZall, binNt_median_TZall, binNt_10pct_TZall, binNt_25pct_TZall, binNt_75pct_TZall, binNt_90pct_TZall, \
binTWC_min_TZall, binTWC_max_TZall, binTWC_mean_TZall, binTWC_median_TZall, binTWC_10pct_TZall, binTWC_25pct_TZall, binTWC_75pct_TZall, binTWC_90pct_TZall, \
binDmm_min_TZall, binDmm_max_TZall, binDmm_mean_TZall, binDmm_median_TZall, binDmm_10pct_TZall, binDmm_25pct_TZall, binDmm_75pct_TZall, binDmm_90pct_TZall, \
binARat_min_TZall, binARat_max_TZall, binARat_mean_TZall, binARat_median_TZall, binARat_10pct_TZall, binARat_25pct_TZall, binARat_75pct_TZall, binARat_90pct_TZall, \
binRE_min_TZall, binRE_max_TZall, binRE_mean_TZall, binRE_median_TZall, binRE_10pct_TZall, binRE_25pct_TZall, binRE_75pct_TZall, binRE_90pct_TZall, \
binRjcR_min_TZall, binRjcR_max_TZall, binRjcR_mean_TZall, binRjcR_median_TZall, binRjcR_10pct_TZall, binRjcR_25pct_TZall, binRjcR_75pct_TZall, binRjcR_90pct_TZall, \
= [np.full(numBins,np.nan) for i in range(56)]
binRH_min_SRall, binRH_max_SRall, binRH_mean_SRall, binRH_median_SRall, binRH_10pct_SRall, binRH_25pct_SRall, binRH_75pct_SRall, binRH_90pct_SRall, \
binNt_min_SRall, binNt_max_SRall, binNt_mean_SRall, binNt_median_SRall, binNt_10pct_SRall, binNt_25pct_SRall, binNt_75pct_SRall, binNt_90pct_SRall, \
binTWC_min_SRall, binTWC_max_SRall, binTWC_mean_SRall, binTWC_median_SRall, binTWC_10pct_SRall, binTWC_25pct_SRall, binTWC_75pct_SRall, binTWC_90pct_SRall, \
binDmm_min_SRall, binDmm_max_SRall, binDmm_mean_SRall, binDmm_median_SRall, binDmm_10pct_SRall, binDmm_25pct_SRall, binDmm_75pct_SRall, binDmm_90pct_SRall, \
binARat_min_SRall, binARat_max_SRall, binARat_mean_SRall, binARat_median_SRall, binARat_10pct_SRall, binARat_25pct_SRall, binARat_75pct_SRall, binARat_90pct_SRall, \
binRE_min_SRall, binRE_max_SRall, binRE_mean_SRall, binRE_median_SRall, binRE_10pct_SRall, binRE_25pct_SRall, binRE_75pct_SRall, binRE_90pct_SRall, \
binRjcR_min_SRall, binRjcR_max_SRall, binRjcR_mean_SRall, binRjcR_median_SRall, binRjcR_10pct_SRall, binRjcR_25pct_SRall, binRjcR_75pct_SRall, binRjcR_90pct_SRall, \
= [np.full(numBins,np.nan) for i in range(56)]
binRH_min_ARall, binRH_max_ARall, binRH_mean_ARall, binRH_median_ARall, binRH_10pct_ARall, binRH_25pct_ARall, binRH_75pct_ARall, binRH_90pct_ARall, \
binNt_min_ARall, binNt_max_ARall, binNt_mean_ARall, binNt_median_ARall, binNt_10pct_ARall, binNt_25pct_ARall, binNt_75pct_ARall, binNt_90pct_ARall, \
binTWC_min_ARall, binTWC_max_ARall, binTWC_mean_ARall, binTWC_median_ARall, binTWC_10pct_ARall, binTWC_25pct_ARall, binTWC_75pct_ARall, binTWC_90pct_ARall, \
binDmm_min_ARall, binDmm_max_ARall, binDmm_mean_ARall, binDmm_median_ARall, binDmm_10pct_ARall, binDmm_25pct_ARall, binDmm_75pct_ARall, binDmm_90pct_ARall, \
binARat_min_ARall, binARat_max_ARall, binARat_mean_ARall, binARat_median_ARall, binARat_10pct_ARall, binARat_25pct_ARall, binARat_75pct_ARall, binARat_90pct_ARall, \
binRE_min_ARall, binRE_max_ARall, binRE_mean_ARall, binRE_median_ARall, binRE_10pct_ARall, binRE_25pct_ARall, binRE_75pct_ARall, binRE_90pct_ARall, \
binRjcR_min_ARall, binRjcR_max_ARall, binRjcR_mean_ARall, binRjcR_median_ARall, binRjcR_10pct_ARall, binRjcR_25pct_ARall, binRjcR_75pct_ARall, binRjcR_90pct_ARall, \
= [np.full(numBins,np.nan) for i in range(56)]
####### Bin data by temperature and calculate stats
with warnings.catch_warnings():
warnings.filterwarnings('ignore', 'All-NaN (slice|axis) encountered')
warnings.filterwarnings('ignore', 'Mean of empty slice')
for ib in range(0,numBins):
binMatch_TZall = np.squeeze(np.where(whichBinTemp_TZall == ib))
binMatch_SRall = np.squeeze(np.where(whichBinTemp_SRall == ib))
binMatch_ARall = np.squeeze(np.where(whichBinTemp_ARall == ib))
binRH_TZall = tzAll['rh'][binMatch_TZall]
binRH_SRall = srAll['rh'][binMatch_SRall]
binRH_ARall = arAll['rh'][binMatch_ARall]
binNt_TZall = tzAll['Nt'][binMatch_TZall]
binNt_SRall = srAll['Nt'][binMatch_SRall]
binNt_ARall = arAll['Nt'][binMatch_ARall]
binTWC_TZall = tzAll['twc'][binMatch_TZall]
binTWC_SRall = srAll['twc'][binMatch_SRall]
binTWC_ARall = arAll['twc'][binMatch_ARall]
binDmm_TZall = tzAll['Dmm'][binMatch_TZall]
binDmm_SRall = srAll['Dmm'][binMatch_SRall]
binDmm_ARall = arAll['Dmm'][binMatch_ARall]
binARat_TZall = tzAll['ar'][binMatch_TZall]
binARat_SRall = srAll['ar'][binMatch_SRall]
binARat_ARall = arAll['ar'][binMatch_ARall]
binRE_TZall = tzAll['re'][binMatch_TZall]
binRE_SRall = srAll['re'][binMatch_SRall]
binRE_ARall = arAll['re'][binMatch_ARall]
binRjcR_TZall = tzAll['rjctRatio'][binMatch_TZall]
binRjcR_SRall = srAll['rjctRatio'][binMatch_SRall]
binRjcR_ARall = arAll['rjctRatio'][binMatch_ARall]
if np.any(binMatch_TZall):
binRH_min_TZall[ib] = np.nanmin(binRH_TZall)
binRH_max_TZall[ib] = np.nanmax(binRH_TZall)
binRH_mean_TZall[ib] = np.nanmean(binRH_TZall)
binRH_median_TZall[ib] = np.nanmedian(binRH_TZall)
binRH_10pct_TZall[ib] = np.nanpercentile(binRH_TZall,10)
binRH_25pct_TZall[ib] = np.nanpercentile(binRH_TZall,25)
binRH_75pct_TZall[ib] = np.nanpercentile(binRH_TZall,75)
binRH_90pct_TZall[ib] = np.nanpercentile(binRH_TZall,90)
binNt_min_TZall[ib] = np.nanmin(binNt_TZall)
binNt_max_TZall[ib] = np.nanmax(binNt_TZall)
binNt_mean_TZall[ib] = np.nanmean(binNt_TZall)
binNt_median_TZall[ib] = np.nanmedian(binNt_TZall)
binNt_10pct_TZall[ib] = np.nanpercentile(binNt_TZall,10)
binNt_25pct_TZall[ib] = np.nanpercentile(binNt_TZall,25)
binNt_75pct_TZall[ib] = np.nanpercentile(binNt_TZall,75)
binNt_90pct_TZall[ib] = np.nanpercentile(binNt_TZall,90)
binTWC_min_TZall[ib] = np.nanmin(binTWC_TZall)
binTWC_max_TZall[ib] = np.nanmax(binTWC_TZall)
binTWC_mean_TZall[ib] = np.nanmean(binTWC_TZall)
binTWC_median_TZall[ib] = np.nanmedian(binTWC_TZall)
binTWC_10pct_TZall[ib] = np.nanpercentile(binTWC_TZall,10)
binTWC_25pct_TZall[ib] = np.nanpercentile(binTWC_TZall,25)
binTWC_75pct_TZall[ib] = np.nanpercentile(binTWC_TZall,75)
binTWC_90pct_TZall[ib] = np.nanpercentile(binTWC_TZall,90)
binDmm_min_TZall[ib] = np.nanmin(binDmm_TZall)
binDmm_max_TZall[ib] = np.nanmax(binDmm_TZall)
binDmm_mean_TZall[ib] = np.nanmean(binDmm_TZall)
binDmm_median_TZall[ib] = np.nanmedian(binDmm_TZall)
binDmm_10pct_TZall[ib] = np.nanpercentile(binDmm_TZall,10)
binDmm_25pct_TZall[ib] = np.nanpercentile(binDmm_TZall,25)
binDmm_75pct_TZall[ib] = np.nanpercentile(binDmm_TZall,75)
binDmm_90pct_TZall[ib] = np.nanpercentile(binDmm_TZall,90)
binARat_min_TZall[ib] = np.nanmin(binARat_TZall)
binARat_max_TZall[ib] = np.nanmax(binARat_TZall)
binARat_mean_TZall[ib] = np.nanmean(binARat_TZall)
binARat_median_TZall[ib] = np.nanmedian(binARat_TZall)
binARat_10pct_TZall[ib] = np.nanpercentile(binARat_TZall,10)
binARat_25pct_TZall[ib] = np.nanpercentile(binARat_TZall,25)
binARat_75pct_TZall[ib] = np.nanpercentile(binARat_TZall,75)
binARat_90pct_TZall[ib] = np.nanpercentile(binARat_TZall,90)
binRE_min_TZall[ib] = np.nanmin(binRE_TZall)
binRE_max_TZall[ib] = np.nanmax(binRE_TZall)
binRE_mean_TZall[ib] = np.nanmean(binRE_TZall)
binRE_median_TZall[ib] = np.nanmedian(binRE_TZall)
binRE_10pct_TZall[ib] = np.nanpercentile(binRE_TZall,10)
binRE_25pct_TZall[ib] = np.nanpercentile(binRE_TZall,25)
binRE_75pct_TZall[ib] = np.nanpercentile(binRE_TZall,75)
binRE_90pct_TZall[ib] = np.nanpercentile(binRE_TZall,90)
binRjcR_min_TZall[ib] = np.nanmin(binRjcR_TZall)
binRjcR_max_TZall[ib] = np.nanmax(binRjcR_TZall)
binRjcR_mean_TZall[ib] = np.nanmean(binRjcR_TZall)
binRjcR_median_TZall[ib] = np.nanmedian(binRjcR_TZall)
binRjcR_10pct_TZall[ib] = np.nanpercentile(binRjcR_TZall,10)
binRjcR_25pct_TZall[ib] = np.nanpercentile(binRjcR_TZall,25)
binRjcR_75pct_TZall[ib] = np.nanpercentile(binRjcR_TZall,75)
binRjcR_90pct_TZall[ib] = np.nanpercentile(binRjcR_TZall,90)
if np.any(binMatch_SRall):
binRH_min_SRall[ib] = np.nanmin(binRH_SRall)
binRH_max_SRall[ib] = np.nanmax(binRH_SRall)
binRH_mean_SRall[ib] = np.nanmean(binRH_SRall)
binRH_median_SRall[ib] = np.nanmedian(binRH_SRall)
binRH_10pct_SRall[ib] = np.nanpercentile(binRH_SRall,10)
binRH_25pct_SRall[ib] = np.nanpercentile(binRH_SRall,25)
binRH_75pct_SRall[ib] = np.nanpercentile(binRH_SRall,75)
binRH_90pct_SRall[ib] = np.nanpercentile(binRH_SRall,90)
binNt_min_SRall[ib] = np.nanmin(binNt_SRall)
binNt_max_SRall[ib] = np.nanmax(binNt_SRall)
binNt_mean_SRall[ib] = np.nanmean(binNt_SRall)
binNt_median_SRall[ib] = np.nanmedian(binNt_SRall)
binNt_10pct_SRall[ib] = np.nanpercentile(binNt_SRall,10)
binNt_25pct_SRall[ib] = np.nanpercentile(binNt_SRall,25)
binNt_75pct_SRall[ib] = np.nanpercentile(binNt_SRall,75)
binNt_90pct_SRall[ib] = np.nanpercentile(binNt_SRall,90)
binTWC_min_SRall[ib] = np.nanmin(binTWC_SRall)
binTWC_max_SRall[ib] = np.nanmax(binTWC_SRall)
binTWC_mean_SRall[ib] = np.nanmean(binTWC_SRall)
binTWC_median_SRall[ib] = np.nanmedian(binTWC_SRall)
binTWC_10pct_SRall[ib] = np.nanpercentile(binTWC_SRall,10)
binTWC_25pct_SRall[ib] = np.nanpercentile(binTWC_SRall,25)
binTWC_75pct_SRall[ib] = np.nanpercentile(binTWC_SRall,75)
binTWC_90pct_SRall[ib] = np.nanpercentile(binTWC_SRall,90)
binDmm_min_SRall[ib] = np.nanmin(binDmm_SRall)
binDmm_max_SRall[ib] = np.nanmax(binDmm_SRall)
binDmm_mean_SRall[ib] = np.nanmean(binDmm_SRall)
binDmm_median_SRall[ib] = np.nanmedian(binDmm_SRall)
binDmm_10pct_SRall[ib] = np.nanpercentile(binDmm_SRall,10)
binDmm_25pct_SRall[ib] = np.nanpercentile(binDmm_SRall,25)
binDmm_75pct_SRall[ib] = np.nanpercentile(binDmm_SRall,75)
binDmm_90pct_SRall[ib] = np.nanpercentile(binDmm_SRall,90)
binARat_min_SRall[ib] = np.nanmin(binARat_SRall)
binARat_max_SRall[ib] = np.nanmax(binARat_SRall)
binARat_mean_SRall[ib] = np.nanmean(binARat_SRall)
binARat_median_SRall[ib] = np.nanmedian(binARat_SRall)
binARat_10pct_SRall[ib] = np.nanpercentile(binARat_SRall,10)
binARat_25pct_SRall[ib] = np.nanpercentile(binARat_SRall,25)
binARat_75pct_SRall[ib] = np.nanpercentile(binARat_SRall,75)
binARat_90pct_SRall[ib] = np.nanpercentile(binARat_SRall,90)
binRE_min_SRall[ib] = np.nanmin(binRE_SRall)
binRE_max_SRall[ib] = np.nanmax(binRE_SRall)
binRE_mean_SRall[ib] = np.nanmean(binRE_SRall)
binRE_median_SRall[ib] = np.nanmedian(binRE_SRall)
binRE_10pct_SRall[ib] = np.nanpercentile(binRE_SRall,10)
binRE_25pct_SRall[ib] = np.nanpercentile(binRE_SRall,25)
binRE_75pct_SRall[ib] = np.nanpercentile(binRE_SRall,75)
binRE_90pct_SRall[ib] = np.nanpercentile(binRE_SRall,90)
binRjcR_min_SRall[ib] = np.nanmin(binRjcR_SRall)
binRjcR_max_SRall[ib] = np.nanmax(binRjcR_SRall)
binRjcR_mean_SRall[ib] = np.nanmean(binRjcR_SRall)
binRjcR_median_SRall[ib] = np.nanmedian(binRjcR_SRall)
binRjcR_10pct_SRall[ib] = np.nanpercentile(binRjcR_SRall,10)
binRjcR_25pct_SRall[ib] = np.nanpercentile(binRjcR_SRall,25)
binRjcR_75pct_SRall[ib] = np.nanpercentile(binRjcR_SRall,75)
binRjcR_90pct_SRall[ib] = np.nanpercentile(binRjcR_SRall,90)
if np.any(binMatch_ARall):
binRH_min_ARall[ib] = np.nanmin(binRH_ARall)
binRH_max_ARall[ib] = np.nanmax(binRH_ARall)
binRH_mean_ARall[ib] = np.nanmean(binRH_ARall)
binRH_median_ARall[ib] = np.nanmedian(binRH_ARall)
binRH_10pct_ARall[ib] = np.nanpercentile(binRH_ARall,10)
binRH_25pct_ARall[ib] = np.nanpercentile(binRH_ARall,25)
binRH_75pct_ARall[ib] = np.nanpercentile(binRH_ARall,75)
binRH_90pct_ARall[ib] = np.nanpercentile(binRH_ARall,90)
binNt_min_ARall[ib] = np.nanmin(binNt_ARall)
binNt_max_ARall[ib] = np.nanmax(binNt_ARall)
binNt_mean_ARall[ib] = np.nanmean(binNt_ARall)
binNt_median_ARall[ib] = np.nanmedian(binNt_ARall)
binNt_10pct_ARall[ib] = np.nanpercentile(binNt_ARall,10)
binNt_25pct_ARall[ib] = np.nanpercentile(binNt_ARall,25)
binNt_75pct_ARall[ib] = np.nanpercentile(binNt_ARall,75)
binNt_90pct_ARall[ib] = np.nanpercentile(binNt_ARall,90)
binTWC_min_ARall[ib] = np.nanmin(binTWC_ARall)
binTWC_max_ARall[ib] = np.nanmax(binTWC_ARall)
binTWC_mean_ARall[ib] = np.nanmean(binTWC_ARall)
binTWC_median_ARall[ib] = np.nanmedian(binTWC_ARall)
binTWC_10pct_ARall[ib] = np.nanpercentile(binTWC_ARall,10)
binTWC_25pct_ARall[ib] = np.nanpercentile(binTWC_ARall,25)
binTWC_75pct_ARall[ib] = np.nanpercentile(binTWC_ARall,75)
binTWC_90pct_ARall[ib] = np.nanpercentile(binTWC_ARall,90)
binDmm_min_ARall[ib] = np.nanmin(binDmm_ARall)
binDmm_max_ARall[ib] = np.nanmax(binDmm_ARall)
binDmm_mean_ARall[ib] = np.nanmean(binDmm_ARall)
binDmm_median_ARall[ib] = np.nanmedian(binDmm_ARall)
binDmm_10pct_ARall[ib] = np.nanpercentile(binDmm_ARall,10)
binDmm_25pct_ARall[ib] = np.nanpercentile(binDmm_ARall,25)
binDmm_75pct_ARall[ib] = np.nanpercentile(binDmm_ARall,75)
binDmm_90pct_ARall[ib] = np.nanpercentile(binDmm_ARall,90)
binARat_min_ARall[ib] = np.nanmin(binARat_ARall)
binARat_max_ARall[ib] = np.nanmax(binARat_ARall)
binARat_mean_ARall[ib] = np.nanmean(binARat_ARall)
binARat_median_ARall[ib] = np.nanmedian(binARat_ARall)
binARat_10pct_ARall[ib] = np.nanpercentile(binARat_ARall,10)
binARat_25pct_ARall[ib] = np.nanpercentile(binARat_ARall,25)
binARat_75pct_ARall[ib] = np.nanpercentile(binARat_ARall,75)
binARat_90pct_ARall[ib] = np.nanpercentile(binARat_ARall,90)
binRE_min_ARall[ib] = np.nanmin(binRE_ARall)
binRE_max_ARall[ib] = np.nanmax(binRE_ARall)
binRE_mean_ARall[ib] = np.nanmean(binRE_ARall)
binRE_median_ARall[ib] = np.nanmedian(binRE_ARall)
binRE_10pct_ARall[ib] = np.nanpercentile(binRE_ARall,10)
binRE_25pct_ARall[ib] = np.nanpercentile(binRE_ARall,25)
binRE_75pct_ARall[ib] = np.nanpercentile(binRE_ARall,75)
binRE_90pct_ARall[ib] = np.nanpercentile(binRE_ARall,90)
binRjcR_min_ARall[ib] = np.nanmin(binRjcR_ARall)
binRjcR_max_ARall[ib] = np.nanmax(binRjcR_ARall)
binRjcR_mean_ARall[ib] = np.nanmean(binRjcR_ARall)
binRjcR_median_ARall[ib] = np.nanmedian(binRjcR_ARall)
binRjcR_10pct_ARall[ib] = np.nanpercentile(binRjcR_ARall,10)
binRjcR_25pct_ARall[ib] = np.nanpercentile(binRjcR_ARall,25)
binRjcR_75pct_ARall[ib] = np.nanpercentile(binRjcR_ARall,75)
binRjcR_90pct_ARall[ib] = np.nanpercentile(binRjcR_ARall,90)
####### Whole-flight Plotting ########
if plotZoneCmp:
if plotRH:
fig, ax = plt.subplots(figsize=(16,20))
# Plot the spreads
ax.fill_betweenx(bin_mid,binRH_25pct_TZall,binRH_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax.fill_betweenx(bin_mid,binRH_25pct_TZall,binRH_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax.fill_betweenx(bin_mid,binRH_25pct_SRall,binRH_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax.fill_betweenx(bin_mid,binRH_25pct_SRall,binRH_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax.fill_betweenx(bin_mid,binRH_25pct_ARall,binRH_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax.fill_betweenx(bin_mid,binRH_25pct_ARall,binRH_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax.plot(binRH_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax.plot(binRH_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax.plot(binRH_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax.invert_yaxis()
ax.set_xlim(rhLim)
ax.set_ylim(tempLim)
ax.legend(loc='lower left',fontsize=18)
ax.set_xlabel('Relative Humidity (%)',fontsize=24)
ax.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax.tick_params(axis='both', which='major', labelsize=22)
ax.set_title('{} - RH - All Spirals'.format(flight),fontsize=26)
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.grid(which='both')
# Save the output figure
saveStr = '{}/{}_RH-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig.savefig(saveStr,bbox_inches='tight')
plt.close(fig)
if plotNt:
fig2, ax2 = plt.subplots(figsize=(16,20))
# Plot the spreads
ax2.fill_betweenx(bin_mid,binNt_25pct_TZall,binNt_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax2.fill_betweenx(bin_mid,binNt_25pct_TZall,binNt_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax2.fill_betweenx(bin_mid,binNt_25pct_SRall,binNt_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax2.fill_betweenx(bin_mid,binNt_25pct_SRall,binNt_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax2.fill_betweenx(bin_mid,binNt_25pct_ARall,binNt_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax2.fill_betweenx(bin_mid,binNt_25pct_ARall,binNt_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax2.plot(binNt_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax2.plot(binNt_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax2.plot(binNt_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax2.invert_yaxis()
ax2.set_xlim(NtLim)
ax2.set_ylim(tempLim)
ax2.set_xscale('log',nonposx='mask')
ax2.legend(loc='upper left',fontsize=18)
ax2.set_xlabel('Total Number Concentration ($cm^{-3}$)',fontsize=24)
ax2.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax2.tick_params(axis='both', which='major', labelsize=22)
ax2.set_title('{} - $N_t$ - All Spirals'.format(flight),fontsize=26)
ax2.grid()
# Save the output figure
saveStr = '{}/{}_Nt-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig2.savefig(saveStr,bbox_inches='tight')
plt.close(fig2)
if plotTWC:
fig3, ax3 = plt.subplots(figsize=(16,20))
# Plot the spreads
ax3.fill_betweenx(bin_mid,binTWC_25pct_TZall,binTWC_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax3.fill_betweenx(bin_mid,binTWC_25pct_TZall,binTWC_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax3.fill_betweenx(bin_mid,binTWC_25pct_SRall,binTWC_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax3.fill_betweenx(bin_mid,binTWC_25pct_SRall,binTWC_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax3.fill_betweenx(bin_mid,binTWC_25pct_ARall,binTWC_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax3.fill_betweenx(bin_mid,binTWC_25pct_ARall,binTWC_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax3.plot(binTWC_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax3.plot(binTWC_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax3.plot(binTWC_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax3.invert_yaxis()
ax3.set_xlim(twcLim)
ax3.set_ylim(tempLim)
ax3.set_xscale('log',nonposx='mask')
ax3.legend(loc='upper left',fontsize=18)
ax3.set_xlabel('Total Water Content ($g\ m^{-3}$)',fontsize=24)
ax3.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax3.tick_params(axis='both', which='major', labelsize=22)
ax3.set_title('{} - TWC - All Spirals'.format(flight),fontsize=26)
ax3.grid()
# Save the output figure
saveStr = '{}/{}_TWC-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig3.savefig(saveStr,bbox_inches='tight')
plt.close(fig3)
if plotDmm:
fig4, ax4 = plt.subplots(figsize=(16,20))
# Plot the spreads
ax4.fill_betweenx(bin_mid,binDmm_25pct_TZall,binDmm_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax4.fill_betweenx(bin_mid,binDmm_25pct_TZall,binDmm_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax4.fill_betweenx(bin_mid,binDmm_25pct_SRall,binDmm_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax4.fill_betweenx(bin_mid,binDmm_25pct_SRall,binDmm_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax4.fill_betweenx(bin_mid,binDmm_25pct_ARall,binDmm_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax4.fill_betweenx(bin_mid,binDmm_25pct_ARall,binDmm_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax4.plot(binDmm_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax4.plot(binDmm_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax4.plot(binDmm_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax4.invert_yaxis()
ax4.set_xlim(0, 3.2)
ax4.set_ylim(tempLim)
ax4.legend(loc='upper right',fontsize=18)
ax4.set_xlabel('Median Mass Diameter (mm)',fontsize=24)
ax4.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax4.tick_params(axis='both', which='major', labelsize=22)
ax4.set_title('{} - $D_{{mm}}$ - All Spirals'.format(flight),fontsize=26)
ax4.xaxis.set_minor_locator(MultipleLocator(0.25))
ax4.grid(which='both')
# Save the output figure
saveStr = '{}/{}_Dmm-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig4.savefig(saveStr,bbox_inches='tight')
plt.close(fig4)
if plotARat:
fig5, ax5 = plt.subplots(figsize=(16,20))
# Plot the spreads
ax5.fill_betweenx(bin_mid,binARat_25pct_TZall,binARat_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax5.fill_betweenx(bin_mid,binARat_25pct_TZall,binARat_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax5.fill_betweenx(bin_mid,binARat_25pct_SRall,binARat_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax5.fill_betweenx(bin_mid,binARat_25pct_SRall,binARat_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax5.fill_betweenx(bin_mid,binARat_25pct_ARall,binARat_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax5.fill_betweenx(bin_mid,binARat_25pct_ARall,binARat_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax5.plot(binARat_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax5.plot(binARat_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax5.plot(binARat_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax5.invert_yaxis()
ax5.set_xlim(ARatLim)
ax5.set_ylim(tempLim)
ax5.legend(loc='upper left',fontsize=18)
ax5.set_xlabel('Area Ratio (%)',fontsize=24)
ax5.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax5.tick_params(axis='both', which='major', labelsize=22)
ax5.set_title('{} - Area Ratio - All Spirals'.format(flight),fontsize=26)
ax5.xaxis.set_minor_locator(MultipleLocator(0.05))
ax5.grid(which='both')
# Save the output figure
saveStr = '{}/{}_ARatio-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig5.savefig(saveStr,bbox_inches='tight')
plt.close(fig5)
if plotRE:
fig6, ax6 = plt.subplots(figsize=(16,20))
# Plot the spreads
ax6.fill_betweenx(bin_mid,binRE_25pct_TZall,binRE_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax6.fill_betweenx(bin_mid,binRE_25pct_TZall,binRE_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax6.fill_betweenx(bin_mid,binRE_25pct_SRall,binRE_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax6.fill_betweenx(bin_mid,binRE_25pct_SRall,binRE_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax6.fill_betweenx(bin_mid,binRE_25pct_ARall,binRE_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax6.fill_betweenx(bin_mid,binRE_25pct_ARall,binRE_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax6.plot(binRE_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax6.plot(binRE_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax6.plot(binRE_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax6.invert_yaxis()
ax6.set_xlim(0,0.07)
ax6.set_ylim(tempLim)
ax6.legend(loc='upper right',fontsize=18)
ax6.set_xlabel('Effective Radius (mm)',fontsize=24)
ax6.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax6.tick_params(axis='both', which='major', labelsize=22)
ax6.set_title('{} - $R_e$ - All Spirals'.format(flight),fontsize=26)
ax6.xaxis.set_minor_locator(MultipleLocator(0.01))
ax6.grid(which='both')
# Save the output figure
saveStr = '{}/{}_RE-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig6.savefig(saveStr,bbox_inches='tight')
plt.close(fig6)
if plotRjcR:
fig7, ax7 = plt.subplots(figsize=(16,20))
# Plot the spreads
ax7.fill_betweenx(bin_mid,binRjcR_25pct_TZall,binRjcR_75pct_TZall,
alpha=0.5,facecolor=tzFill,
edgecolor='none',linewidth=0,label='TZ $P_{25-75}$')
ax7.fill_betweenx(bin_mid,binRjcR_25pct_TZall,binRjcR_75pct_TZall,
facecolor='none',linestyle =(0.5,[10,5]),
edgecolor=tzLine,linewidth=2,zorder=5)
ax7.fill_betweenx(bin_mid,binRjcR_25pct_SRall,binRjcR_75pct_SRall,
alpha=0.5,facecolor=esrFill,
edgecolor='none',linewidth=0,label='ESR $P_{25-75}$')
ax7.fill_betweenx(bin_mid,binRjcR_25pct_SRall,binRjcR_75pct_SRall,
facecolor='none',linestyle =(0.5,[25,5,4,4,4,4,4,4]),
edgecolor=esrLine,linewidth=2,zorder=5)
ax7.fill_betweenx(bin_mid,binRjcR_25pct_ARall,binRjcR_75pct_ARall,
alpha=0.5,facecolor=arFill,
edgecolor='none',linewidth=0,label='AR $P_{25-75}$')
ax7.fill_betweenx(bin_mid,binRjcR_25pct_ARall,binRjcR_75pct_ARall,
facecolor='none',linestyle =(0.5,[20,10]),
edgecolor=arLine,linewidth=2,zorder=5)
# Plot medians
ax7.plot(binRjcR_median_TZall,bin_mid,color=tzLine,alpha=0.5,linewidth=3,label='TZ Median')
ax7.plot(binRjcR_median_SRall,bin_mid,color=esrLine,alpha=0.5,linewidth=3,label='ESR Median')
ax7.plot(binRjcR_median_ARall,bin_mid,color=arLine,alpha=0.5,linewidth=3,label='AR Median')
ax7.invert_yaxis()
ax7.set_xlim(RjcrLim)
ax7.set_ylim(tempLim)
ax7.legend(loc='upper right',fontsize=18)
ax7.set_xlabel('Reject Ratio (%)',fontsize=24)
ax7.set_ylabel('Temperature ($^{\circ}$C)',fontsize=24)
ax7.tick_params(axis='both', which='major', labelsize=22)
ax7.set_title('{} - Reject Ratio - All Spirals'.format(flight),fontsize=26)
ax7.xaxis.set_minor_locator(MultipleLocator(0.05))
ax7.grid(which='both')
# Save the output figure
saveStr = '{}/{}_RjcR-spread_25-75.{}'.format(figSavePath,flight,fType)
if noDispSave:
fig7.savefig(saveStr,bbox_inches='tight')
plt.close(fig7)