Skip to content

Commit

Permalink
Merge pull request #401 from jnsebgosselin/fix_yearly_avg_buget_calcu…
Browse files Browse the repository at this point in the history
…lation

PR: Fix yearly average buget calculation
  • Loading branch information
jnsebgosselin committed Feb 22, 2022
2 parents bdbd628 + f3e677c commit 6e945bc
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 22 deletions.
43 changes: 25 additions & 18 deletions gwhat/gwrecharge/gwrecharge_plot_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ def setup_stack(self):

self.stack = QTabWidget()
self.stack.addTab(fig_rechg_glue, 'Recharge')
self.stack.addTab(fig_watbudg_glue, 'Yearly Budget')
self.stack.addTab(fig_avg_yearly_budg, 'Yearly Avg. Budget')
self.stack.addTab(fig_avg_monthly_budg, 'Monthly Avg. Budget')
self.stack.addTab(fig_watbudg_glue, 'Yearly Budget (GLUE50)')
self.stack.addTab(fig_avg_yearly_budg, 'Yearly Avg. Budget (GLUE50)')
self.stack.addTab(fig_avg_monthly_budg, 'Monthly Avg. Budget (GLUE50)')
self.stack.currentChanged.connect(self.plot_results)

def set_gluedf(self, gluedf):
Expand Down Expand Up @@ -1428,23 +1428,29 @@ def __init__(self, setp={}):
self.setp['ylabel size'] = 16

def __plot__(self, glue_df):
avg_yrly = {
'evapo': np.nanmean(glue_df['yearly budget']['evapo']),
'runoff': np.nanmean(glue_df['yearly budget']['runoff']),
'recharge': np.nanmean(glue_df['yearly budget']['recharge']),
'precip': np.nanmean(glue_df['yearly budget']['precip'])}
glue50_avg_yrly = {
'evapo': np.nanmean(
glue_df['hydrol yearly budget']['evapo'][:, 2]),
'runoff': np.nanmean(
glue_df['hydrol yearly budget']['runoff'][:, 2]),
'recharge': np.nanmean(
glue_df['hydrol yearly budget']['recharge'][:, 2]),
'precip': np.nanmean(glue_df['hydrol yearly budget']['precip'])
}

# Plot the results.
offset = mpl.transforms.ScaledTranslation(
0, 3/72, self.figure.dpi_scale_trans)
self.bar_handles = []
self.notes = []
for i, varname in enumerate(avg_yrly.keys()):
l, = self.ax0.bar(i+1, avg_yrly[varname], 0.65, align='center',
color=COLORS[varname])
for i, varname in enumerate(glue50_avg_yrly.keys()):
l, = self.ax0.bar(
i + 1, glue50_avg_yrly[varname], 0.65, align='center',
color=COLORS[varname])
self.bar_handles.append(l)
self.notes.append(self.ax0.text(
i+1, avg_yrly[varname], "%d" % avg_yrly[varname],
i + 1, glue50_avg_yrly[varname],
'{:0.0f}'.format(glue50_avg_yrly[varname]),
ha='center', va='bottom',
transform=self.ax0.transData + offset,
fontsize=self.setp['notes size']))
Expand All @@ -1454,8 +1460,8 @@ def __plot__(self, glue_df):
self.setp['ymin'] = 0
if 'ymax' not in self.setp.keys():
self.setp['ymax'] = np.max([
avg_yrly['recharge'], avg_yrly['evapo'],
avg_yrly['runoff'], avg_yrly['precip']
glue50_avg_yrly['recharge'], glue50_avg_yrly['evapo'],
glue50_avg_yrly['runoff'], glue50_avg_yrly['precip']
]) + 100
if 'yscl' not in self.setp.keys():
self.setp['yscl'] = 250
Expand Down Expand Up @@ -1537,7 +1543,7 @@ def __init__(self, setp={}):

def __plot__(self, glue_df):
"""Plot the results."""
avg_mly = {
glue50_avg_mly = {
'evapo': np.nanmean(
glue_df['monthly budget']['evapo'][:, :, 2], axis=0),
'runoff': np.nanmean(
Expand All @@ -1549,17 +1555,18 @@ def __plot__(self, glue_df):

# Plot the results.
months = np.arange(1, 13)
for i, varname in enumerate(avg_mly.keys()):
for i, varname in enumerate(glue50_avg_mly.keys()):
hl, = self.ax0.plot(
months, avg_mly[varname], marker='o', mec='white',
months, glue50_avg_mly[varname], marker='o', mec='white',
clip_on=False, lw=2, color=COLORS[varname], zorder=3)
self.lg_handles.append(hl)

# Setup the axis limits.
if 'ymin' not in self.setp.keys():
self.setp['ymin'] = 0
if 'ymax' not in self.setp.keys():
self.setp['ymax'] = np.max([x for x in avg_mly.values()]) + 10
self.setp['ymax'] = np.max(
[x for x in glue50_avg_mly.values()]) + 10
if 'yscl' not in self.setp.keys():
self.setp['yscl'] = 50
if 'yscl minor' not in self.setp.keys():
Expand Down
42 changes: 38 additions & 4 deletions gwhat/gwrecharge/tests/test_gwrecharge_plot.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@

# ---- Standard library imports
import os.path as osp
from shutil import copyfile

# ---- Third party imports
import numpy as np
import pytest
from PyQt5.QtGui import QImage
from PyQt5.QtCore import Qt
Expand All @@ -27,11 +29,13 @@
# ---- Pytest Fixtures
# =============================================================================
@pytest.fixture
def project():
projectfile = osp.join(
def project(tmp_path):
fsrc = osp.join(
__rootdir__, 'gwrecharge', 'tests', 'test_gwrecharge_project.gwt')
project = ProjetReader(projectfile)
return project
fdst = osp.join(
tmp_path, 'test_gwrecharge_project.gwt')
copyfile(fsrc, fdst)
return ProjetReader(fdst)


@pytest.fixture()
Expand Down Expand Up @@ -62,6 +66,36 @@ def test_figstackmanager(figstackmanager, project):
figstackmanager.stack.setCurrentIndex(index)


def test_hydrological_budget_calculs(figstackmanager, project):
"""
Test that the yearly values of the hydrological budget are calculated
as expected
"""
wldset = project.get_wldset('3040002_15min')
glue_df = wldset.get_glue_at(-1)
figstackmanager.set_gluedf(glue_df)

# Assert the average yearly recharge values are calculated as expected in
# FigYearlyRechgGLUE.
figstackmanager.stack.setCurrentIndex(0)
figcanvas = figstackmanager.figmanagers[0].figcanvas
assert '(GLUE 5) 363 mm/y' in figcanvas.txt_yearly_avg.get_text()
assert '(GLUE 25) 415 mm/y' in figcanvas.txt_yearly_avg.get_text()
assert '(GLUE 50) 484 mm/y' in figcanvas.txt_yearly_avg.get_text()
assert '(GLUE 75) 578 mm/y' in figcanvas.txt_yearly_avg.get_text()
assert '(GLUE 95) 709 mm/y' in figcanvas.txt_yearly_avg.get_text()

# Assert the values are calculated as expected of the average
# yearly water budget in FigAvgYearlyBudget.
figstackmanager.stack.setCurrentIndex(2)
figcanvas = figstackmanager.figmanagers[2].figcanvas

assert figcanvas.notes[0].get_text() == '421'
assert figcanvas.notes[1].get_text() == '226'
assert figcanvas.notes[2].get_text() == '484'
assert figcanvas.notes[3].get_text() == '1131'


def test_copy_to_clipboard(qtbot, figstackmanager, project):
"""
Test that copying figures to the clipboard works as expected.
Expand Down

0 comments on commit 6e945bc

Please sign in to comment.