3 Created on Tue May 4 10:11:19 2021
9 import matplotlib.pyplot
as plt
10 from matplotlib.ticker
import FormatStrFormatter
11 import efo.functions
as fnc
17 idxName = np.full(T.dateTime.size, name)
19 cfs2af = network[0].constants.cfs2af
20 hypso = network[0].hypso
21 stor = network[0].stor
22 elevPrdo = hypso.stor2elev(stor)
23 rlsCtrl = network[0].rlsCtrl
24 rlsTot = network[0].qOut
25 rlsSpill = network[0].outletUnCtrl.rlsOutlet
26 rlsMax = network[0].rlsMax
27 qHop = network[2].qOut
28 cols = [
'stor_mendo',
'elev_mendo',
'rls_ctrl',
'rls_tot',
'rls_max',
'spill',
'q_hop']
29 dfIndices = [idxName, T.dateTime]
30 dfMultiIdx = pd.MultiIndex.from_arrays(dfIndices, names=(
'name_scenario',
'date_time'))
31 resultsDf = pd.DataFrame({
'stor_mendo': stor,
32 'elev_mendo': elevPrdo,
38 columns = cols, index=dfMultiIdx)
80 def plot_time_series(*, ax, df, col, parameter=None, legend=None, title=None, scenarios=[],
81 fontSz=9, yMin=0, yMax=None, xMin=None, xMax=None, lineWidth=1.5, legendLoc='best', lineStyle='-',
82 lineColor=plt.rcParams['axes.prop_cycle'].by_key()[
'color']):
83 isLegend =[
False]*len(legend)
84 for i, curLegend
in enumerate(legend):
85 isLegend[i]=
True if legend[i]
else False
86 maxY = ax.get_ylim()[1]
90 ax=ax, legend=isLegend, label=legend, fontsize=fontSz,
91 color=lineColor[0], linewidth=lineWidth, linestyle=lineStyle)
94 for i, curScen
in enumerate(scenarios):
95 df.xs(curScen)[col].plot(
96 ax=ax, legend=isLegend[i], label=legend[i], fontsize=fontSz,
97 color=lineColor[i], linewidth=lineWidth, linestyle=lineStyle)
98 maxY = max(df.xs(curScen)[col].max(), maxY)
99 if isLegend[i]: ax.legend(prop=dict(size=fontSz), loc=legendLoc)
105 ax.set_ylim(top=yMax)
107 ax.set_ylim(top=maxY+maxY*0.05)
109 xMin = df.xs(scenarios[0]).index[0]
if scenarios
else df.index[0]
111 xMax = df.xs(scenarios[0]).index[-1]
if scenarios
else df.index[-1]
112 ax.set_xlim(xMin, xMax)
113 ax.set_ylim(bottom=yMin)
114 if title
is not None: ax.set_title(title, fontsize=fontSz+1)
115 if parameter
is not None: ax.set_ylabel(parameter, fontsize=fontSz)
117 x_axis = ax.axes.get_xaxis()
118 x_label = x_axis.get_label()
119 x_label.set_visible(
False)
120 ax.xaxis.grid(
True, which=
'major', linestyle=
'-')
121 ax.yaxis.grid(
True, which=
'major', linestyle=
'-')
122 ax.xaxis.grid(
True, which=
'minor', linestyle=
':', linewidth=0.5)
155 fontSz=9, yMin=0, yMax=None, xMin=None, xMax=None, lineWidth=1.5, legendLoc='best'):
172 def stor2elev(x):
return np.interp(x, hypso.stor, hypso.elev)
173 def elev2stor(x):
return np.interp(x, hypso.elev, hypso.stor)
174 axElev = ax.secondary_yaxis(
'right', functions=(stor2elev, elev2stor))
175 elevTicks = hypso.stor2elev(ax.get_yticks())
176 axElev.set_yticks(elevTicks)
177 axElev.yaxis.set_major_formatter(FormatStrFormatter(
'%.1f'))
178 plt.setp(axElev.get_yticklabels(), fontsize=fontSz)
179 axElev.set_ylabel(
'elevation (ft)', fontsize=fontSz)
184 def plot_exceedance(*, ax, df, col, legend, scenarios=[None], parameter=None, title=None,
185 fontSz=9, yMin=0, yMax=None, lineWidth=1.5, legendLoc='best', lineStyle='-',
186 lineColor=plt.rcParams['axes.prop_cycle'].by_key()[
'color'],
187 xAxisScale=
'linear', yAxisScale=
'linear'):
192 legend=[
'_nolegend_']*len(scenarios)
194 for i, curScen
in enumerate(scenarios):
195 if curScen
is not None:
196 curArr = df.xs(curScen)[col].to_numpy()
if isinstance(df, pd.DataFrame)
else df.xs(curScen).to_numpy()
198 curArr = df[col].to_numpy()
if isinstance(df, pd.DataFrame)
else df.xs(curScen).to_numpy()
199 maxY = max(curArr.max(), maxY)
200 exc, arrSort = fnc.exc_prob(arr=curArr)
201 ax.plot(exc, arrSort, label=legend[i], color=lineColor[i], linewidth=lineWidth, linestyle=lineStyle)
202 ax.set_xscale(xAxisScale)
203 ax.set_yscale(yAxisScale)
204 if xAxisScale ==
'log':
206 ax.set_xlim(min(exc), 1)
209 ax.set_ylim(bottom=yMin)
211 ax.set_ylim(top=yMax)
213 ax.set_ylim(top=maxY+maxY*0.05)
214 if title
is not None: ax.set_title(title, fontsize=fontSz+1)
215 if parameter
is not None: ax.set_ylabel(parameter, fontsize=fontSz)
216 ax.set_xlabel(
'exceedance probability', fontsize=fontSz)
217 ax.legend(prop=dict(size=fontSz), loc=legendLoc)
221 plt.setp(ax.get_xticklabels(), fontsize=fontSz)
222 plt.setp(ax.get_yticklabels(), fontsize=fontSz)
226 title=None, parameter=None, fontSz=9, yMin=0, yMax=None, lineWidth=1.5,
227 yAxisScale='linear'):
228 nScenarios = len(scenarios)
230 dataArr = np.zeros(shape=([len(df.xs(scenarios[0])), nScenarios]))
231 for i, curScen
in enumerate(scenarios):
232 dataArr[:, i] = df.xs(curScen)[col].to_numpy()
if isinstance(df, pd.DataFrame)
else df.xs(curScen).to_numpy()
233 boxPlot = ax.boxplot(dataArr, labels=legend, whis=[0, 100], showmeans=
True)
234 boxColors = plt.rcParams[
'axes.prop_cycle'].by_key()[
'color']
235 for i
in range(0, nScenarios):
236 plt.setp(boxPlot[
'boxes'][i], color=boxColors[i], linewidth=lineWidth)
237 plt.setp(boxPlot[
'caps'][2*i], color=boxColors[i], linewidth=lineWidth)
238 plt.setp(boxPlot[
'caps'][2*i+1], color=boxColors[i], linewidth=lineWidth)
239 plt.setp(boxPlot[
'fliers'][i], color=boxColors[i], linewidth=lineWidth)
240 plt.setp(boxPlot[
'means'][i], color=boxColors[i],
241 marker=
'D', markerfacecolor=boxColors[i], markeredgecolor=boxColors[i])
242 plt.setp(boxPlot[
'medians'][i], color=boxColors[i], linewidth=lineWidth)
243 plt.setp(boxPlot[
'whiskers'][2*i], color=boxColors[i], linewidth=lineWidth)
244 plt.setp(boxPlot[
'whiskers'][2*i+1], color=boxColors[i], linewidth=lineWidth)
245 maxY = np.max(dataArr)
246 ax.set_yscale(yAxisScale)
248 ax.set_ylim(top=yMax)
250 ax.set_ylim(top=maxY+maxY*0.05)
251 ax.set_ylim(bottom=yMin)
252 if title
is not None: ax.set_title(title, fontsize=fontSz+1)
253 if parameter
is not None: ax.set_ylabel(parameter, fontsize=fontSz)
255 plt.setp(ax.get_xticklabels(), fontsize=fontSz)
256 plt.setp(ax.get_yticklabels(), fontsize=fontSz)
260 title=None, fontSz=9, yMin=0, yMax=None, lineWidth=1.5, legendLoc='best',
261 xAxisScale='linear', yAxisScale='linear'):
262 fig = plt.figure(figsize=(6.5, 4), dpi=200, constrained_layout=
True)
263 gs = fig.add_gridspec(ncols=8, nrows=1)
265 ax1 = fig.add_subplot(gs[0, :5])
276 xAxisScale=xAxisScale,
277 yAxisScale=yAxisScale)
279 ax2 = fig.add_subplot(gs[0, 5:9])
288 yAxisScale=yAxisScale)
289 ax2.set_yticklabels([])
290 if title
is not None: fig.suptitle(title, fontsize=fontSz+1)