#next step for NACRLIM cc deviation plots
parent
b2dd285534
commit
b2fc7135d9
@ -0,0 +1,187 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#####################################----------------------------------
|
||||
#Last Updated - March 2018
|
||||
#@author: z5025317 Valentin Heimhuber
|
||||
#code for creating climate prioritization plots for NARCLIM variables.
|
||||
#Inputs: Uses CSV files that contain all 12 NARCLIM model runs time series for 1 grid cell created with: P1_NARCliM_NC_to_CSV_CCRC_SS.py
|
||||
#####################################----------------------------------
|
||||
#Load packages
|
||||
#####################################----------------------------------
|
||||
import numpy as np
|
||||
import os
|
||||
import pandas as pd
|
||||
import glob
|
||||
import matplotlib
|
||||
import matplotlib.pyplot as plt
|
||||
from datetime import datetime
|
||||
from datetime import timedelta
|
||||
from matplotlib.backends.backend_pdf import PdfPages
|
||||
from ggplot import *
|
||||
matplotlib.style.use('ggplot')
|
||||
#plt.rcParams.update(plt.rcParamsDefault)
|
||||
#
|
||||
# Set working direcotry (where postprocessed NARClIM data is located)
|
||||
os.chdir('C:/Users/z5025317/WRL_Postdoc/Projects/Paper#1/')
|
||||
#
|
||||
#####################################----------------------------------
|
||||
#set input parameters
|
||||
Base_period_start = '1986-01-01'
|
||||
Base_period_end = '2005-01-01' #use last day that's not included in period as < is used for subsetting
|
||||
Estuary = 'Tweed' # 'Belongil'
|
||||
Clim_var_type = "*" # '*' will create pdf for all variables in folder
|
||||
Clim_var_type = "tasmax*" # '*' will create pdf for all variables in folder
|
||||
Present_Day_Clim_Var = 'Rainfall'
|
||||
#####################################----------------------------------
|
||||
|
||||
#set directory path for output files
|
||||
output_directory = 'Output/Clim_Deviation_Plots/'+ Estuary
|
||||
#output_directory = 'J:/Project wrl2016032/NARCLIM_Raw_Data/Extracted'
|
||||
if not os.path.exists(output_directory):
|
||||
os.makedirs(output_directory)
|
||||
print('-------------------------------------------')
|
||||
print("output directory folder didn't exist and was generated")
|
||||
print('-------------------------------------------')
|
||||
print('-------------------')
|
||||
Clim_Var_CSVs = glob.glob('./Output/' + Estuary + '/' + Estuary + '_' + Clim_var_type + '*')
|
||||
#read CSV file
|
||||
for clim_var_csv_path in Clim_Var_CSVs:
|
||||
Filename = os.path.basename(os.path.normpath(clim_var_csv_path))
|
||||
Clim_var_type = Filename.split('_', 2)[1]
|
||||
print(Clim_var_type)
|
||||
Ensemble_Delta_full_df = pd.read_csv(clim_var_csv_path, index_col=0, parse_dates = True)
|
||||
#Ensemble_Delta_full_df = pd.to_numeric(Ensemble_Delta_full_df)
|
||||
|
||||
#load present day climate data for the same variable
|
||||
Present_day_Var_CSV = glob.glob('./Data/Wheather_Station_Data/**/' + Estuary + '_' + Present_Day_Clim_Var + '*csv')
|
||||
Present_day_df = pd.read_csv(Present_day_Var_CSV[0])
|
||||
if Clim_var_type == 'evspsblmean':
|
||||
Dates = pd.to_datetime(Present_day_df.Date)
|
||||
Present_day_df.index = Dates
|
||||
Present_day_df = Present_day_df.iloc[:,1]
|
||||
Present_day_df = Present_day_df.replace(r'\s+', np.nan, regex=True)
|
||||
Present_day_df = pd.to_numeric(Present_day_df)
|
||||
|
||||
else:
|
||||
Dates = pd.to_datetime(Present_day_df.Year*10000+Present_day_df.Month*100+Present_day_df.Day,format='%Y%m%d')
|
||||
Present_day_df.index = Dates
|
||||
Present_day_df = Present_day_df.iloc[:,5]
|
||||
#create seasonal sums etc.
|
||||
if (Clim_var_type == 'pracc' or Clim_var_type == 'evspsblmean' or Clim_var_type == 'potevpmean'
|
||||
or Clim_var_type == 'pr1Hmaxtstep' or Clim_var_type == 'wss1Hmaxtstep'):
|
||||
Present_day_df_annual = Present_day_df.resample('A').sum()
|
||||
Present_day_df_annual = Present_day_df_annual.replace(0, np.nan)
|
||||
Present_day_df_monthly = Present_day_df.resample('M').sum()
|
||||
Present_day_df_monthly = Present_day_df_monthly.replace(0, np.nan)
|
||||
Present_day_df_weekly = Present_day_df.resample('W').sum()
|
||||
Present_day_df_weekly = Present_day_df_weekly.replace(0, np.nan)
|
||||
Fdf_Seas_means = Present_day_df.resample('Q-NOV').sum() #seasonal means
|
||||
Fdf_Seas_means = Fdf_Seas_means.replace(0, np.nan)
|
||||
else:
|
||||
Present_day_df_annual = Present_day_df.resample('A').mean()
|
||||
Present_day_df_monthly = Present_day_df.resample('M').mean()
|
||||
Present_day_df_weekly = Present_day_df.resample('W').mean()
|
||||
Fdf_Seas_means = Present_day_df.resample('Q-NOV').mean() #seasonal means
|
||||
|
||||
#Loop through annual and seasons and create a deviation plot for each.
|
||||
times = ['annual', 'DJF', 'MAM', 'JJA','SON']
|
||||
fig = plt.figure(figsize=(14,8))
|
||||
delta_all_df = pd.DataFrame()
|
||||
i=1
|
||||
for temp in times:
|
||||
#subset the ensemble dataframe for the period used:
|
||||
if temp == 'annual':
|
||||
Ensemble_Delta_df = Ensemble_Delta_full_df.iloc[:,range(0,2)]
|
||||
#
|
||||
Present_Day_ref_df = Present_day_df_annual
|
||||
else:
|
||||
Ensemble_Delta_df = Ensemble_Delta_full_df.filter(regex= temp)
|
||||
Ensemble_Delta_df.columns = ['near', 'far']
|
||||
if temp == 'DJF':
|
||||
Mean_df = Fdf_Seas_means[Fdf_Seas_means.index.quarter==1]
|
||||
Column_names = ['DJF_near', 'DJF_far']
|
||||
if temp == 'MAM':
|
||||
Mean_df = Fdf_Seas_means[Fdf_Seas_means.index.quarter==2]
|
||||
Column_names = ['MAM_near', 'MAM_far']
|
||||
if temp == 'JJA':
|
||||
Mean_df = Fdf_Seas_means[Fdf_Seas_means.index.quarter==3]
|
||||
Column_names = ['JJA_near', 'JJA_far']
|
||||
if temp == 'SON':
|
||||
Mean_df = Fdf_Seas_means[Fdf_Seas_means.index.quarter==4]
|
||||
Present_Day_ref_df = Mean_df
|
||||
print(Ensemble_Delta_df.columns.values)
|
||||
#Subset to present day variability period
|
||||
Present_Day_ref_df = pd.DataFrame(Present_Day_ref_df.loc[(Present_Day_ref_df.index >= Base_period_start) & (Present_Day_ref_df.index <= Base_period_end)])
|
||||
Present_Day_Mean = np.percentile(Present_Day_ref_df, 50)
|
||||
Present_Day_SD = np.std(Present_Day_ref_df)
|
||||
#create data frame for floating stacked barplots
|
||||
index=['-2std', '-1std', 'Med', '1std', '2std']
|
||||
columns = ['present','near future', 'far future']
|
||||
Plot_in_df = pd.DataFrame(index=index, columns =columns)
|
||||
#
|
||||
Plot_in_df['present'] = [float(Present_Day_Mean-2*Present_Day_SD),float(Present_Day_Mean-Present_Day_SD), float(Present_Day_Mean),
|
||||
float(Present_Day_Mean+Present_Day_SD), float(Present_Day_Mean+2*Present_Day_SD)]
|
||||
Plot_in_df['near future'] = [float(Present_Day_Mean + Ensemble_Delta_df.near[-3:][0]),np.NaN, float(Present_Day_Mean + Ensemble_Delta_df.near[-3:][1]),
|
||||
np.NaN, float(Present_Day_Mean + Ensemble_Delta_df.near[-3:][2])]
|
||||
Plot_in_df['far future'] = [float(Present_Day_Mean + Ensemble_Delta_df.far[-3:][0]),np.NaN, float(Present_Day_Mean + Ensemble_Delta_df.far[-3:][1]),
|
||||
np.NaN, float(Present_Day_Mean + Ensemble_Delta_df.far[-3:][2])]
|
||||
#Create a second data frame that has the values in a way that they can be stacked up in bars with the correct absolute values
|
||||
Plot_in_df2 = pd.DataFrame(index=index, columns =columns )
|
||||
|
||||
Plot_in_df2['present'] = [float(Present_Day_Mean-2*Present_Day_SD),float(Present_Day_SD), float(Present_Day_SD),
|
||||
float(Present_Day_SD), float(Present_Day_SD)]
|
||||
Plot_in_df2['near future'] = [float(Present_Day_Mean + Ensemble_Delta_df.near[-3:][0]),np.NaN, float(Ensemble_Delta_df.near[-3:][1]-Ensemble_Delta_df.near[-3:][0]),
|
||||
np.NaN, float(Ensemble_Delta_df.near[-3:][2]-Ensemble_Delta_df.near[-3:][1])]
|
||||
Plot_in_df2['far future'] = [float(Present_Day_Mean + Ensemble_Delta_df.far[-3:][0]),np.NaN, float(Ensemble_Delta_df.far[-3:][1]-Ensemble_Delta_df.far[-3:][0]),
|
||||
np.NaN, float(Ensemble_Delta_df.far[-3:][2]-Ensemble_Delta_df.far[-3:][1])]
|
||||
#transpose the data frame
|
||||
Plot_in_df_tp = Plot_in_df2.transpose()
|
||||
#do the individual plots
|
||||
if temp == 'annual':
|
||||
xmin = int(min(Plot_in_df.min(axis=1))-1)
|
||||
xmax = int(max(Plot_in_df.max(axis=1))+2)
|
||||
else:
|
||||
xmin = int(min(Plot_in_df.min(axis=1))-1)
|
||||
xmax = int(max(Plot_in_df.max(axis=1))+2)
|
||||
#define colour scheme
|
||||
#likert_colors = ['none', 'firebrick','firebrick','lightcoral','lightcoral']
|
||||
likert_colors = ['none', 'darkblue', 'darkblue','cornflowerblue','cornflowerblue']
|
||||
#plot the stacked barplot
|
||||
ax=plt.subplot(2,3,i)
|
||||
Plot_in_df_tp.plot.bar(stacked=True, color=likert_colors, edgecolor='none', legend=False, ax=ax)
|
||||
z = plt.axhline(float(Present_Day_Mean-2*Present_Day_SD), linestyle='-', color='black', alpha=.5)
|
||||
z.set_zorder(-1)
|
||||
z = plt.axhline(float(Present_Day_Mean+2*Present_Day_SD), linestyle='-', color='black', alpha=.5)
|
||||
z.set_zorder(-1)
|
||||
z = plt.axhline(float(Present_Day_Mean-Present_Day_SD), linestyle='--', color='black', alpha=.5)
|
||||
z.set_zorder(-1)
|
||||
z = plt.axhline(float(Present_Day_Mean+Present_Day_SD), linestyle='--', color='black', alpha=.5)
|
||||
z.set_zorder(-1)
|
||||
plt.ylim(xmin, xmax)
|
||||
plt.title(Clim_var_type + ' ' + temp )
|
||||
ax.grid(False)
|
||||
for tick in ax.get_xticklabels():
|
||||
tick.set_rotation(0)
|
||||
fig.tight_layout()
|
||||
#reset i to i+1 for next step
|
||||
if temp == 'MAM':
|
||||
i=i+2
|
||||
else:
|
||||
i=i+1
|
||||
print(i)
|
||||
plt.show()
|
||||
out_file_name = Estuary + '_' + Clim_var_type + '_CC_prio_plot.png'
|
||||
out_path = output_directory + '/' + out_file_name
|
||||
fig.savefig(out_path)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue