You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
386 lines
15 KiB
Python
386 lines
15 KiB
Python
5 years ago
|
# -*- coding: utf-8 -*-
|
||
|
#==========================================================#
|
||
|
#Last Updated - June 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')
|
||
|
|
||
|
#==========================================================#
|
||
|
#Input parameters
|
||
|
#==========================================================#
|
||
|
#set scenario codes and beginning and end years and corresponding scenario code
|
||
|
fs=['Hwq003', 'Hwq005']
|
||
|
scenario_real_names = ['Present', 'Far_Future']
|
||
|
|
||
|
variable = 'elev' #depth or vel
|
||
|
|
||
|
startyear=1999
|
||
|
endyear=1999
|
||
|
#year=range(startyear, endyear+1)
|
||
|
|
||
|
#set directory path for output files
|
||
|
output_directory = 'H:/WRL_Projects/Hunter_CC_Modeling/Module_6/03_Results/Output/Postprocessed/Figures'
|
||
|
|
||
|
#set input directories and data
|
||
|
#postprocessed RMA results
|
||
|
RMA_data_csv = 'H:/WRL_Projects/Hunter_CC_Modeling/Module_6/03_Results/Output/Postprocessed/Compound_data/Scn__Hwq003_Hwq005_WQ_sal_1999_1999compound.csv'
|
||
|
#tidal boundary data
|
||
|
tides_csv='C:/Users/z5025317/OneDrive - UNSW/Hunter_CC_Modeling/07_Modelling/01_Input/Tide Generator/Tidal Simulation Python Script (BMM)/Tides_1990_2010.csv'
|
||
|
#CSV file of mesh nodes and corresponding chainages
|
||
|
nodes_csv = 'H:/WRL_Projects/Hunter_CC_Modeling/Module_6/03_Results/Chainages/Hunter_nodes.csv'
|
||
|
#River flow boundary
|
||
|
Flow_csv = 'H:/WRL_Projects/Hunter_CC_Modeling/Module_6/01_Input/BCGeneration/Scenarios/Calibration/Calibration_Greta.csv'
|
||
|
#==========================================================#
|
||
|
|
||
|
#==========================================================#
|
||
|
#set plot parameters
|
||
|
ALPHA_figs = 1
|
||
|
font = {'family' : 'sans-serif',
|
||
|
'weight' : 'normal',
|
||
|
'size' : 14}
|
||
|
matplotlib.rc('font', **font)
|
||
|
#==========================================================#
|
||
|
|
||
|
|
||
|
#========================================================#
|
||
|
#automated part of the code doing the data extraction
|
||
|
#==========================================================
|
||
|
|
||
|
#read csv file with extracted RMA data
|
||
|
RMA.df = pd.read_csv(RMA_data_csv, parse_dates=True, index_col=0)
|
||
|
|
||
|
#read csv file with nodes to extract data from
|
||
|
node = pd.read_csv(nodes_csv)['Hunter'].values
|
||
|
chainages = pd.read_csv(nodes_csv)['x_km'].values
|
||
|
|
||
|
#Load boundary flow data
|
||
|
Flow_df = pd.read_csv(Flow_csv, parse_dates=True, index_col=0)['Q[ML/d]']
|
||
|
Flow_df.columns = ['Q[ML/d]']
|
||
|
Flow_df = Flow_df[datetime.strptime(str(startyear) + ' 07 13', '%Y %m %d').date():datetime.strptime(str(2005) + ' 07 19', '%Y %m %d').date()]
|
||
|
flowannual = Flow_df.resample('A').mean()
|
||
|
Flow_df.resample('A').mean().plot()
|
||
|
|
||
|
#Load tide boundary data
|
||
|
tides_df = pd.read_csv(tides_csv, parse_dates=True, index_col=0)
|
||
|
tides_df.columns = ['tide']
|
||
|
|
||
|
|
||
|
#append to summary data frame
|
||
|
if f in ['HCC010', 'HCC042']:
|
||
|
scname = 'Present'
|
||
|
if f == 'HCC011':
|
||
|
scname = 'Near_Future'
|
||
|
df.index = df.index - (datetime.strptime('2025 01 01', '%Y %m %d').date() - datetime.strptime('1995 01 01', '%Y %m %d').date())
|
||
|
if f == 'HCC012':
|
||
|
scname = 'Far_Future'
|
||
|
df.index = df.index - (datetime.strptime('2065 01 01', '%Y %m %d').date() - datetime.strptime('1995 01 01', '%Y %m %d').date())
|
||
|
if f in ['HCC040', 'HCC041']:
|
||
|
scname = 'Present_Resto'
|
||
|
df.columns = df.columns+'_'+ scname
|
||
|
|
||
|
#cut down the summary df to common years
|
||
|
Summary_df = Summary_df[datetime.strptime(str(startyear) + ' 07 13', '%Y %m %d').date():datetime.strptime(str(endyear) + ' 07 19', '%Y %m %d').date()]
|
||
|
Summary_df.tail()
|
||
|
#Summary_df.columns = chainages
|
||
|
#type(Summary_df.index)
|
||
|
|
||
|
#cut down the summary df to common years
|
||
|
Summary_df = Summary_df[datetime.strptime(str(startyear) + ' 01 05', '%Y %m %d').date():datetime.strptime(str(endyear) + ' 12 31', '%Y %m %d').date()]
|
||
|
Summary_df.tail()
|
||
|
|
||
|
|
||
|
variables = ['Sal']
|
||
|
|
||
|
Present_df = Summary_df.filter(regex='Present')
|
||
|
Present_df.columns
|
||
|
|
||
|
Far_future_df = Summary_df.filter(regex='Far')
|
||
|
Far_future_df.columns
|
||
|
|
||
|
|
||
|
|
||
|
#==========================================================#
|
||
|
#Tidal analysis
|
||
|
#==========================================================#
|
||
|
#read in tide data
|
||
|
Plot_scenario = 'Flood'
|
||
|
ylims = [-1.1,8]
|
||
|
tides_df = tides_df[datetime.strptime(str(startyear) + ' 07 13', '%Y %m %d').date():datetime.strptime(str(endyear) + ' 07 19', '%Y %m %d').date()]
|
||
|
|
||
|
central_tides_df = tides_df[datetime.strptime(str(startyear) + ' 07 16', '%Y %m %d').date():datetime.strptime(str(endyear) + ' 07 16', '%Y %m %d').date()]
|
||
|
maxtide_index = central_tides_df['tide'].idxmax()
|
||
|
tides_df['tide'].max()
|
||
|
end_maxtide_index = maxtide_index + timedelta(days=0.4)
|
||
|
beg_maxtide_index = maxtide_index - timedelta(days=0.2)
|
||
|
short_tides_df = tides_df[beg_maxtide_index: end_maxtide_index]
|
||
|
short_tides_df.plot(cmap='viridis', legend=True)
|
||
|
mintide_index = short_tides_df['tide'].idxmin()
|
||
|
|
||
|
#plot the minimum and maximum elevation along the estuary occuring within a single tidal cycle
|
||
|
Short_tide_elev_df = Summary_df[min(short_tides_df.index):max(short_tides_df.index)]
|
||
|
max_min_1cycle_elev_0slr = pd.concat([Short_tide_elev_df.filter(regex='Present').max(), Short_tide_elev_df.filter(regex='Present').min()], axis=1, join='inner')
|
||
|
max_min_1cycle_elev_09slr = pd.concat([Short_tide_elev_df.filter(regex='Far').max(), Short_tide_elev_df.filter(regex='Far').min()], axis=1, join='inner')
|
||
|
max_min_1cycle_elev_0slr.index = chainages
|
||
|
max_min_1cycle_elev_09slr.index = chainages
|
||
|
max_min_1cycle_elev = pd.concat([max_min_1cycle_elev_0slr, max_min_1cycle_elev_09slr], axis=1, join='outer')
|
||
|
max_min_1cycle_elev.columns = ['MaxElev 0 SLR','MinElev 0 SLR','MaxElev 0.9 SLR','MinElev 0.9 SLR' ]
|
||
|
max_min_1cycle_elev.plot(cmap='viridis', legend=True)
|
||
|
|
||
|
#plot the elevation along the estuary at exactly the time of high and low tide
|
||
|
max_min_extime_elev_0slr = pd.concat([Summary_df.filter(regex='Present').loc[maxtide_index], Summary_df.filter(regex='Present').loc[mintide_index]], axis=1, join='outer')
|
||
|
max_min_extime_elev_09slr = pd.concat([Summary_df.filter(regex='Far').loc[maxtide_index], Summary_df.filter(regex='Far').loc[mintide_index]], axis=1, join='outer')
|
||
|
max_min_extime_elev_0slr.index = chainages
|
||
|
max_min_extime_elev_09slr.index = chainages
|
||
|
max_min_extime_elev = pd.concat([max_min_extime_elev_0slr, max_min_extime_elev_09slr], axis=1, join='outer')
|
||
|
max_min_extime_elev.columns = ['HigT Elev 0SLR','LowT Elev 0SLR','HigT Elev 0.9 SLR','LowT Elev 0.9 SLR' ]
|
||
|
max_min_extime_elev.plot(cmap='viridis', legend=True)
|
||
|
|
||
|
png_out_name = png_output_directory + variable + '_high_low_tide_analysis_' + Plot_scenario + '.pdf'
|
||
|
fig = plt.figure(figsize=(17,20))
|
||
|
ax=plt.subplot(3,1,1)
|
||
|
plt.title('Max and min water surface elevation along the estuary over one tidal cycle')
|
||
|
ax.set_prop_cycle(color=['slateblue', 'slateblue', 'tomato', 'tomato'], linestyle=['--', '-', '--', '-'], lw=[2,2,2,2])
|
||
|
max_min_1cycle_elev.plot( legend=False, ax=ax)
|
||
|
plt.axhline(y=0, color='slateblue', linestyle='--', lw=1, alpha=0.5)
|
||
|
plt.axhline(y=0.9, color='tomato', linestyle='--', lw=1, alpha=0.5)
|
||
|
plt.ylim(ylims)
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
plt.xlabel("Distance from ocean boundary [km]")
|
||
|
# Put a legend to the right of the current axis
|
||
|
#lgd = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
|
||
|
ax.legend()
|
||
|
#plot tides
|
||
|
ax=plt.subplot(3,1,2)
|
||
|
plt.title('Max and min water surface elevation along the estuary at time of high & low tide')
|
||
|
ax.set_prop_cycle(color=['slateblue', 'slateblue', 'tomato', 'tomato'], linestyle=['--', '-', '--', '-'], lw=[2,2,2,2])
|
||
|
max_min_extime_elev.plot(legend=False, ax=ax)
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
plt.ylim(ylims)
|
||
|
plt.xlabel("Distance from ocean boundary [km]")
|
||
|
#lgd = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
|
||
|
ax.legend()
|
||
|
#plot tides
|
||
|
ax=plt.subplot(3,1,3)
|
||
|
plt.ylim(ylims)
|
||
|
plt.title('Tide at open ocean boundary')
|
||
|
short_tides_df.plot(cmap='viridis', legend=False, ax=ax)
|
||
|
ax.axvline(maxtide_index, color='black', linestyle='--')
|
||
|
ax.axvline(mintide_index, color='black', linestyle='-')
|
||
|
plt.xlabel("Time")
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
#lgd = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
|
||
|
ax.legend()
|
||
|
fig.tight_layout()
|
||
|
fig.savefig(png_out_name)
|
||
|
plt.close()
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#==========================================================#
|
||
|
#animate 2 tidal cycles baseline scenario:
|
||
|
#==========================================================#
|
||
|
Six_day_tide_elev_df = Summary_df.filter(regex='Present')[maxtide_index - timedelta(days=2): maxtide_index + timedelta(days=3)]
|
||
|
Six_day_tide_elev_df.columns = chainages
|
||
|
Six_day_tides_df = tides_df[maxtide_index - timedelta(days=2): maxtide_index + timedelta(days=3)]
|
||
|
Six_day_tides_df.plot(cmap='viridis', legend=True)
|
||
|
|
||
|
Six_day_flow_df = Flow_df[maxtide_index - timedelta(days=2): maxtide_index + timedelta(days=3)]
|
||
|
Six_day_flow_df = pd.concat([Six_day_tides_df, Six_day_flow_df], axis=1, join='outer')['Q[ML/d]'].interpolate()
|
||
|
Six_day_flow_df.plot(cmap='viridis', legend=True)
|
||
|
|
||
|
|
||
|
ii=1
|
||
|
for index in Six_day_tide_elev_df.index:
|
||
|
#index = Six_day_tide_elev_df.index[1]
|
||
|
png_out_path = output_directory + '/TidalCycle_' + variable + '_' + Plot_scenario + '3/'
|
||
|
if not os.path.exists(png_out_path):
|
||
|
os.makedirs(png_out_path)
|
||
|
#png_out_name = png_out_path + str(index) + 'longitudinalXS.png'
|
||
|
png_out_name = png_out_path + str(ii) + variable + '_longitudinalXS.png'
|
||
|
fig = plt.figure(figsize=(17,20))
|
||
|
ax=plt.subplot(3,1,1)
|
||
|
plt.title('Water surface elevation along the estuary')
|
||
|
Six_day_tide_elev_df.loc[index].plot(color='blue', legend=False)
|
||
|
#plt.axhline(y=0, color='r', linestyle='--', lw=1, alpha=0.5)
|
||
|
plt.axhline(tides_df.loc[index].values, color='black',lw=0.5, linestyle='--')
|
||
|
plt.ylim(ylims)
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
plt.xlabel("Distance from ocean boundary [km]")
|
||
|
#plot tides
|
||
|
ax=plt.subplot(3,1,2)
|
||
|
plt.ylim(-1.1,1.3)
|
||
|
plt.title('Tide at open ocean boundary')
|
||
|
Six_day_tides_df.plot(cmap='viridis', legend=False, ax=ax)
|
||
|
ax.axvline(index, color='green', linestyle='--')
|
||
|
plt.xlabel("Time")
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
|
||
|
ax=plt.subplot(3,1,3)
|
||
|
#plt.ylim(ylims)
|
||
|
plt.title('Tide at open ocean boundary')
|
||
|
Six_day_flow_df.plot(color='black', legend=False, ax=ax)
|
||
|
ax.axvline(index, color='green', linestyle='--')
|
||
|
plt.xlabel("Time")
|
||
|
plt.ylabel("Hunter Inflow [ML/day]")
|
||
|
|
||
|
fig.tight_layout()
|
||
|
fig.savefig(png_out_name)
|
||
|
plt.close()
|
||
|
ii=ii+1
|
||
|
|
||
|
|
||
|
#==========================================================#
|
||
|
#animate 2 tidal cycles baseline + SLR scenario:
|
||
|
#==========================================================#
|
||
|
Six_day_tide_elev_df_0slr = Summary_df.filter(regex='Present')[maxtide_index - timedelta(days=1): maxtide_index + timedelta(days=1)]
|
||
|
Six_day_tide_elev_df_0slr.columns = chainages
|
||
|
Six_day_tide_elev_df_09slr = Summary_df.filter(regex='Far')[maxtide_index - timedelta(days=1): maxtide_index + timedelta(days=1)]
|
||
|
Six_day_tide_elev_df_09slr.columns = chainages
|
||
|
Six_day_tides_df = tides_df[maxtide_index - timedelta(days=1): maxtide_index + timedelta(days=1.5)]
|
||
|
Six_day_tides_df.plot(cmap='viridis', legend=True)
|
||
|
|
||
|
ii=0
|
||
|
for index in Six_day_tide_elev_df_0slr.index:
|
||
|
ii=ii+1
|
||
|
#index = Six_day_tide_elev_df.index[1]
|
||
|
png_out_path = output_directory + '/TidalCycle_SLR_' + variable + '_' + Plot_scenario + '/'
|
||
|
if not os.path.exists(png_out_path):
|
||
|
os.makedirs(png_out_path)
|
||
|
#png_out_name = png_out_path + str(index) + 'longitudinalXS.png'
|
||
|
png_out_name = png_out_path + str(ii) + variable + '_longitudinalXS.png'
|
||
|
max_min_extime_elev_both = pd.concat([Six_day_tide_elev_df_0slr.loc[index], Six_day_tide_elev_df_09slr.loc[index]], axis=1, join='outer')
|
||
|
max_min_extime_elev_both.columns = ['Present Day','0.9m SLR']
|
||
|
|
||
|
fig = plt.figure(figsize=(17,12))
|
||
|
ax=plt.subplot(2,1,1)
|
||
|
plt.ylim(ylims)
|
||
|
plt.title('Water surface elevation along the estuary')
|
||
|
ax.set_prop_cycle(color=['slateblue','tomato'], linestyle=['-', '-'], lw=[2,2])
|
||
|
max_min_extime_elev_both.plot(ax=ax)
|
||
|
ax.legend(loc=1)
|
||
|
plt.axhline(y=0, color='r', linestyle='--', lw=1, alpha=0.5)
|
||
|
plt.ylim(-1.1,2.5)
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
plt.xlabel("Distance from ocean boundary [km]")
|
||
|
|
||
|
#plot tides
|
||
|
ax=plt.subplot(2,1,2)
|
||
|
plt.ylim(-1.1,1.5)
|
||
|
plt.title('Tide at open ocean boundary')
|
||
|
Six_day_tides_df.plot(cmap='viridis', legend=False, ax=ax)
|
||
|
ax.axvline(index, color='green', linestyle='--')
|
||
|
plt.xlabel("Time")
|
||
|
plt.ylabel("Water level [m AHD]")
|
||
|
fig.tight_layout()
|
||
|
fig.savefig(png_out_name)
|
||
|
plt.close()
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
for NODE in node:
|
||
|
NODE = str(NODE)
|
||
|
#=========#
|
||
|
#comparison time series plot at node
|
||
|
#=========#
|
||
|
#out name
|
||
|
png_out_file_name = comparison_code + '_' + variable + '_' + NODE + '_time_series.png'
|
||
|
png_out_path = png_output_directory + '/' + png_out_file_name
|
||
|
#
|
||
|
plotin_df = Summary_df.filter(regex=NODE)
|
||
|
#prepare data frame for plot
|
||
|
fig = plt.figure(figsize=(14,18))
|
||
|
ax=plt.subplot(4,1,1)
|
||
|
#start and end dat of plots
|
||
|
plt.title(variable + '_' + NODE + ' - time series')
|
||
|
start_date = datetime(int('1996'), int('02'), int('01'))
|
||
|
end_date = datetime(int('1996'), int('02'), int('5'))
|
||
|
plotin_df1=plotin_df[start_date:end_date]
|
||
|
ymin = min(plotin_df1.min()) - 0.01 *min(plotin_df1.min())
|
||
|
ymax = max(plotin_df1.max()) + 0.01 *max(plotin_df1.max())
|
||
|
plotin_df1.plot(ylim=(ymin,ymax) ,legend=False, ax=ax)
|
||
|
#plt.legend( loc=1)
|
||
|
plt.xticks([])
|
||
|
|
||
|
ax=plt.subplot(4,1,2)
|
||
|
start_date = datetime(int('1996'), int('02'), int('01'))
|
||
|
end_date = datetime(int('1996'), int('02'), int('3'))
|
||
|
plotin_df2=plotin_df[start_date:end_date]
|
||
|
ymin = min(plotin_df2.min()) - 0.1 *min(plotin_df2.min())
|
||
|
ymax = max(plotin_df2.max()) + 0.1 *max(plotin_df2.max())
|
||
|
plotin_df2.plot(ylim=(ymin,ymax),legend=False, ax=ax)
|
||
|
#plt.legend( loc=1)
|
||
|
ax.xaxis.grid(False)
|
||
|
|
||
|
ax=plt.subplot(4,1,3)
|
||
|
plt.title(variable + '_' + NODE + ' - monthly maximum')
|
||
|
Monthly_max = plotin_df.resample('M').max()
|
||
|
Monthly_max.plot(ax=ax,legend=False)
|
||
|
plt.legend( loc=1)
|
||
|
ax.xaxis.grid(False)
|
||
|
|
||
|
ax=plt.subplot(4,1,4)
|
||
|
plt.title(variable + '_' + NODE + ' - monthly mean')
|
||
|
Monthly_mean = plotin_df.resample('M').mean()
|
||
|
Monthly_mean.plot(ax=ax)
|
||
|
#plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
|
||
|
# ncol=2, mode="expand", borderaxespad=0.)
|
||
|
#plt.legend( loc=1)
|
||
|
ax.xaxis.grid(False)
|
||
|
|
||
|
#ax.patch.set_alpha(ALPHA_figs)
|
||
|
fig.patch.set_alpha(ALPHA_figs)
|
||
|
fig.tight_layout()
|
||
|
fig.savefig(png_out_path)
|
||
|
plt.close()
|
||
|
#=========#
|
||
|
|
||
|
|
||
|
|