Swat
Intense Rainfall Events
Date
Amman
Petra
ERA5
Weather-Type
Weather-Type
Cumulative Rainfall
Code
# -*- coding: utf-8 -*-
import matplotlib
matplotlib . use ( 'Agg' ) # Must be before importing matplotlib.pyplot or pylab!
import matplotlib.pyplot as P
from mpl_toolkits.basemap import Basemap , maskoceans
from netCDF4 import Dataset , num2date
from scipy.io import netcdf
import numpy as N
import datetime
from matplotlib.offsetbox import AnchoredText
import string
params = { 'legend.fontsize' : 8 , 'font.family' : 'serif' }
P . rcParams . update ( params )
P . style . use ( 'seaborn-talk' )
def ma ( a , n = 3 ):
ret = N . cumsum ( a , dtype = float )
ret [ n :] = ret [ n :] - ret [: - n ]
return ret [ n - 1 :] / n
orte = { 'amman' : '320359' , 'petra' : '304356' }
amm = N . genfromtxt ( '../data/swat/amman/weatherdata-320359.csv' , names = True , delimiter = ',' , dtype = None , encoding = None )
pet = N . genfromtxt ( '../data/swat/petra/weatherdata-304356.csv' , names = True , delimiter = ',' , dtype = None , encoding = None )
era = N . genfromtxt ( '../data/era5/iera5_prcp_daily_35-37E_31-33N_n_5lan_su_max.dat' , usecols = ( 0 , 1 ), delimiter = ';' , dtype = None , encoding = None , comments = '#' )
gwl = N . genfromtxt ( '../data/gwls/jor.txt' , usecols = ( 0 , 1 ), delimiter = ';' , dtype = None , encoding = None )
gwls = {}
for g in list ( set ( gwl [:, 1 ])):
gwls [ g ] = []
rint = {}
for i in N . arange ( 5 , 65 , 5 ):
i = ' %02i ' % i
rint [ i ] = []
names = amm . dtype . names
date0 = []
for d in amm [ "Date" ]:
d = d . replace ( '"' , '' )
d = d . split ( '/' )
date0 . append ( ' %4i - %02i - %02i ' % ( int ( d [ 2 ]), int ( d [ 0 ]), int ( d [ 1 ])))
date0 = N . array ( date0 )
date1 = []
for d in pet [ "Date" ]:
d = d . replace ( '"' , '' )
d = d . split ( '/' )
date1 . append ( ' %4i - %02i - %02i ' % ( int ( d [ 2 ]), int ( d [ 0 ]), int ( d [ 1 ])))
date1 = N . array ( date1 )
date2 = []
jahr2 = []
for d in era :
d = str ( d [ 0 ])
date2 . append ( ' %4s - %2s - %2s ' % ( d [ 0 : 4 ], d [ 4 : 6 ], d [ 6 : 8 ]))
jahr2 . append ( int ( d [ 0 : 4 ]))
date2 = N . array ( date2 )
jahr2 = N . array ( jahr2 )
date3 = []
for d in gwl :
d = d [ 0 ]
d = d . split ( '-' )
date3 . append ( ' %4i - %02i - %02i ' % ( int ( d [ 0 ]), int ( d [ 1 ]), int ( d [ 2 ])))
date3 = N . array ( date3 )
nd = len ( date2 )
f = open ( './include/rx30.md' , 'w' )
f . write ( 'Date|Amman|Petra|ERA5|Weather-Type \n ' )
f . write ( '---|---|---|---|--- \n ' )
for d in range ( nd ):
print ( date2 [ d ])
id = N . where ( date2 [ d ] == date0 )[ 0 ]
if ( len ( id ) == 1 ):
nied0 = amm [ "Precipitation" ][ id [ 0 ]]
nied0 = float ( nied0 . replace ( '"' , '' ))
else :
nied0 = - 999.9
id = N . where ( date2 [ d ] == date1 )[ 0 ]
if ( len ( id ) == 1 ):
nied1 = pet [ "Precipitation" ][ id [ 0 ]]
nied1 = float ( nied1 . replace ( '"' , '' ))
else :
nied1 = - 999.9
nied2 = era [ d ][ 1 ]
id = N . where ( date2 [ d ] == date3 )[ 0 ]
if ( len ( id ) == 1 ):
gwl4 = gwl [ id [ 0 ], 1 ]
gwls [ gwl4 ] . append ( nied2 )
for g in rint :
if (( nied1 >= int ( g )) & ( nied1 < ( int ( g ) + 2 ))):
rint [ g ] . append ( gwl4 )
else :
gwl4 = '---'
if (( nied0 > 30. ) | ( nied1 > 30 )):
f . write ( ' %s | %04.1f | %04.1f | %04.1f | %s \n ' % ( date2 [ d ], nied0 , nied1 , nied2 , gwl4 ))
f . close ()
Plotting
P . figure ( figsize = ( 8 , 5 ))
ax = P . subplot ( 111 )
gws = list ( gwls . keys ())
diag = { 'x' :[], 'y' :[]}
for rs in rint :
tmp = []
for gw in gws :
id = N . where ( N . array ( rint [ rs ]) == gw )[ 0 ]
tmp . append ( len ( id ))
tmp = N . array ( tmp )
ind = N . argsort ( tmp )
id = N . where ( tmp > 0 )[ 0 ]
diag [ 'x' ] . append ( int ( rs ))
diag [ 'y' ] . append ( len ( id ))
k = - 1
for i in id :
k = k + 1
if ( k > ( len ( id ) - 2 )):
P . text ( int ( rs ) + 1.5 , 0.3 + k , gws [ i ], fontsize = 8 , color = 'w' , horizontalalignment = 'center' , weight = 'bold' )
else :
P . text ( int ( rs ) + 1.5 , 0.3 + k , gws [ i ], fontsize = 8 , color = 'w' , horizontalalignment = 'center' )
P . bar ( N . array ( diag [ 'x' ]) + 2.5 , diag [ 'y' ], 5 , color = 'dodgerblue' , ec = 'k' , lw = 1.0 )
P . xticks ([ 5 , 10 , 15 , 20 , 25 , 30 , 35 , 40 , 45 , 50 , 55 , 60 ])
P . xlim ( 0 , 70 )
P . yticks ([ 0 , 2 , 4 , 6 , 8 , 10 ])
P . ylim ( 0 , 10 )
P . xlabel ( 'Daily Rainfall Intensity (mm/d)' , fontsize = 14 , weight = 'bold' )
P . ylabel ( 'Number of Contributing Weather-Types' , fontsize = 12 , weight = 'bold' )
at = AnchoredText ( 'Amman' , prop = dict ( size = 14 ), frameon = True , loc = 'upper right' )
at . patch . set_boxstyle ( "round,pad=0.,rounding_size=0.2" )
ax . add_artist ( at )
P . savefig ( './img/swat.png' , dpi = 160 , bbox_inches = 'tight' )
Cumulative
jo = N . arange ( 1981 , 2022 , 1 )
nj = len ( jo )
do = N . arange ( 1 , 366 , 1 )
nd = len ( do )
nied2 = []
for d in era :
nied2 . append ( d [ 1 ])
nied2 = N . array ( nied2 )
tmp = N . zeros (( nj , nd ), float )
tmp [:,:] = N . nan
for j in range ( nj ):
id = N . where ( jahr2 == jo [ j ])[ 0 ]
if ( len ( id ) < nd ): nd = len ( id )
id = id [: nd ]
tmp [ j ,: nd ] = nied2 [ id ]
P . figure ( figsize = ( 9 , 5 ))
ax = P . subplot ( 111 )
P . bar ( ma ( do , 7 ), ma ( N . nanmax ( tmp , 0 ), 7 ), 3 , color = 'dodgerblue' , ec = 'k' , alpha = 0.5 , zorder = 5 )
P . ylabel ( 'Max. Rainfall (mm/d)' , fontsize = 14 , weight = 'bold' )
P . yticks ([ 0 , 20 , 40 , 60 , 80 , 100 , 120 ], fontsize = 12 , weight = 'bold' )
P . ylim ( 0 , 120 )
P . twinx ()
for j in range ( nj ):
if ( jo [ j ] == 2021 ):
P . plot ( do , N . cumsum ( tmp [ j ,:]), 'k' , lw = 0.7 , zorder = 10 )
else :
P . plot ( do , N . cumsum ( tmp [ j ,:]), 'k' , alpha = 0.3 , lw = 0.7 , zorder = 10 )
P . ylabel ( 'Cum. Rainfall (mm)' , fontsize = 14 , weight = 'bold' )
P . xticks ([ 1 , 31 , 61 , 91 , 121 , 151 , 181 , 211 , 241 , 271 , 301 , 331 ],[ '1.Jan' , '1.Feb' , '1.Mar' , '1.Apr' , '1.May' , '1.Jun' , '1.Jul' , '1.Aug' , '1.Sep' , '1.Oct' , '1.Nov' , '1.Dec' ], fontsize = 10 , weight = 'bold' )
P . yticks ([ 0 , 200 , 400 , 600 , 800 , 1000 , 1200 ], fontsize = 12 , weight = 'bold' )
P . xlim ( 1 , 365 )
P . ylim ( 0 , 1200 )
at = AnchoredText ( 'ERA5: Jordan' , prop = dict ( size = 14 ), frameon = True , loc = 'upper left' )
at . patch . set_boxstyle ( "round,pad=0.,rounding_size=0.2" )
ax . add_artist ( at )
P . savefig ( './img/cum.png' , dpi = 160 , bbox_inches = 'tight' )