Plot diagnostics time series

master
Dan Howe 3 years ago
parent 1e8a2b5714
commit f66e83be64

@ -475,17 +475,18 @@ def process(beach_name, beach_scenario, n_runs, start_year, end_year,
xp=profile_volume[valid_idx], xp=profile_volume[valid_idx],
fp=profile_chainage[valid_idx]) fp=profile_chainage[valid_idx])
fig, ax = plt.subplots(9,
len(output_years),
figsize=(16, 24),
sharey='row')
# Check whether to save probabilistic diagnostics # Check whether to save probabilistic diagnostics
output_diagnostics = False
for _, bp in pd.DataFrame(diagnostics).iterrows(): for _, bp in pd.DataFrame(diagnostics).iterrows():
if ((str(prof['block']) == str(bp['block'])) if ((str(prof['block']) == str(bp['block']))
and (prof['profile'] == bp['profile'])): and (prof['profile'] == bp['profile'])):
output_diagnostics = True output_diagnostics = True
fig, ax = plt.subplots(9,
len(output_years),
figsize=(16, 24),
sharey='row')
# Loop through years # Loop through years
pbar_year = tqdm(output_years, leave=False) pbar_year = tqdm(output_years, leave=False)
for j, year in enumerate(pbar_year): for j, year in enumerate(pbar_year):
@ -682,6 +683,7 @@ def process(beach_name, beach_scenario, n_runs, start_year, end_year,
'diagnostics', 'diagnostics',
'{} {} {}.csv'.format(beach_scenario, year, '{} {} {}.csv'.format(beach_scenario, year,
profile_type)) profile_type))
dump_df = dump_df[::100] # Only output every 100th row
dump_df.to_csv(csv_name, float_format='%g') dump_df.to_csv(csv_name, float_format='%g')
for i, c in enumerate(dump_df.columns[3:]): for i, c in enumerate(dump_df.columns[3:]):
@ -714,6 +716,115 @@ def process(beach_name, beach_scenario, n_runs, start_year, end_year,
plt.savefig(figname, bbox_inches='tight', dpi=300) plt.savefig(figname, bbox_inches='tight', dpi=300)
plt.close(fig) plt.close(fig)
# Plot time series figure
fig, ax = plt.subplots(4,
2,
figsize=(12, 16),
sharey='row',
gridspec_kw={
'wspace': 0.05,
'width_ratios': [3, 1]
})
ax[0, 0].plot(years, slr[:, :100], c='#aaaaaa', lw=0.2)
ax[0, 0].plot(years,
slr[:, 1],
c='C0',
label='Sample simulation')
ax[0, 1].hist(slr[-1, :],
bins=100,
fc='#cccccc',
ec='#aaaaaa',
orientation='horizontal')
ax[1, 0].plot(years, (slr * bf)[:, :100], c='#aaaaaa', lw=0.2)
ax[1, 0].plot(years, (slr * bf)[:, 1], c='C0')
ax[1, 1].hist((slr * bf)[-1, :],
bins=100,
fc='#cccccc',
ec='#aaaaaa',
orientation='horizontal')
ax[2, 0].plot(years, ur[:, :100], c='#aaaaaa', lw=0.2)
ax[2, 0].plot(years, ur[:, 1], c='C0')
ax[2, 1].hist(ur[-1, :],
bins=100,
fc='#cccccc',
ec='#aaaaaa',
orientation='horizontal')
ax[3, 0].plot(years, r[:, :100], c='#aaaaaa', lw=0.2)
ax[3, 0].plot(years, r[:, 1], c='C0', zorder=3)
ax[3, 1].hist(r[-1, :],
bins=100,
fc='#cccccc',
ec='#aaaaaa',
orientation='horizontal')
baseline = r[:, 1]
sdd = storm_demand_dist[:, 1]
for i in range(len(slr)):
pe = [
matplotlib.patheffects.Stroke(linewidth=5,
foreground='#ffffff',
capstyle='butt'),
matplotlib.patheffects.Normal()
]
ax[3, 0].plot([years[i], years[i]],
[baseline[i], baseline[i] + sdd[i]],
c='C0',
path_effects=pe)
# Maximum recession encountered
r_max = (baseline + sdd).max()
ax[3, 0].axhline(y=r_max, c='C3', linestyle=':')
i = len(years) - 1
for a in ax[:, 0]:
a.set_xlim(right=years[-1])
# Add line at zero
for a in ax[:-1, 0]:
a.spines['bottom'].set_position(('data', 0))
a.set_xticklabels([])
for a in ax[:, 1]:
a.xaxis.set_visible(False)
a.spines['bottom'].set_visible(False)
ax[3, 0].annotate(
'Most eroded beach state encountered in planning period',
(years[0], r_max),
xytext=(0, 20),
textcoords='offset pixels')
ax[0, 0].legend()
ax[0, 0].set_title((f'Probabilistic trajectories\n'
f'(first 100 out of {n_runs:,} runs)'))
ax[0, 1].set_title(
f'Probability\ndistribution\nin year {years[i]}')
ax[0, 0].set_ylabel('Sea level (m)', labelpad=10)
ax[1, 0].set_ylabel('Bruun recession (m)', labelpad=10)
ax[2, 0].set_ylabel('Underlying recession (m)', labelpad=10)
ax[3, 0].set_ylabel('Shoreline displacement (m)', labelpad=10)
ax[3, 0].set_title(('Bruun recession'
'+ underlying recession'
'+ storm demand'),
y=0.9)
for a in ax.ravel():
a.spines['top'].set_visible(False)
a.spines['right'].set_visible(False)
figname = os.path.join(
'diagnostics',
f'{beach_scenario} {profile_type} timeseries.png')
plt.savefig(figname, bbox_inches='tight', dpi=300)
plt.close(fig)
def main(): def main():

Loading…
Cancel
Save