In [2]:
#This notebook can post-process a QUALTX output file
#and plot water quality profiles along all the modeled reaches
#ET 20160514
#Enter the location of the QUALTX output file
#This program can parse both urls and local paths
QUALTXoutfile = r'https://raw.githubusercontent.com/Harefoot/TurboQUALTX/master/RHOTRUNC.OUT'
In [3]:
#Import python packages
import pandas as pd
pd.options.mode.chained_assignment = None # default='warn'
import os
import sys
#sys.path.insert(0,r'M:\Library\Python\Packages')
import ET_Utils.QUALTX_Utils
import numpy as np
import bokeh
from bokeh.plotting import figure, show
from bokeh.models import HoverTool, BoxSelectTool
from bokeh.io import output_notebook
output_notebook()
In [4]:
#Parse the QUALTX output file
Scenario = QUALTXoutfile
DOstd = 4#[5,4.8]
#WQC_of_interest = ['DO_MG/L','BOD_MG/L','NH3_MG/L','NO3+2_MG/L','PHOS_MG/L']
WQC_of_interest = ['DO_MG/L','BOD_MG/L','NH3_MG/L']#,'NO3+2_MG/L','PHOS_MG/L']
StreamNames, Rdf, Hdf, AllWQdf = ET_Utils.QUALTX_Utils.Process_QUALTX(QUALTXoutfile,
Scenario,DOstd = DOstd,
WQC_of_interest = WQC_of_interest,
loc = 1,plot_pdf = 0)
In [5]:
#Set plotting parameters
plot_width=900
plot_height=600
y_label = 'Concentration (mg/L)'
x_label = 'Distance (km)'
#Set line width
lws = np.zeros(len(WQC_of_interest))+2
#Set line colors
plot_colors = ['blue','black','green','cyan','orange']
#Set line symbols
plot_symbols = ['-','-','-','-','-']
#Set marker sizes
markersizes = np.zeros(len(WQC_of_interest))+1
#Set label sizes
x_labelsize = 15
y_labelsize = 15
In [6]:
# Loop through each stream and plot the WQ profile plot
TOOLS="hover,box_zoom,wheel_zoom,pan,reset"
for StreamName in StreamNames:
WQdf = AllWQdf[AllWQdf['Stream']==StreamName].copy()
SRdf = Rdf[Rdf['StreamName']==StreamName].reset_index()
x_range = [max(WQdf['ENDING_DIST'])*1.025,min(WQdf['ENDING_DIST'])]
#Determine range of y-axis
maxy = []
for tempWQC in WQC_of_interest:
maxy.append(max(WQdf[tempWQC]))
y_range = [0,round(max(maxy))]#*1.5)]
p = figure(title=StreamName, tools=TOOLS,x_range = x_range,y_range=y_range,plot_width=plot_width, plot_height=plot_height)
if StreamName == StreamNames[0]:
hover = p.select(dict(type=HoverTool))
hover.tooltips = [
# format text in tooltip
("Conc ", "$y mg/L"),
]
p.xaxis.axis_label = x_label
p.yaxis.axis_label = y_label
for k in range(0,len(WQC_of_interest)):
# add a line renderer
p.line(np.asarray(WQdf['ENDING_DIST']),np.asarray(WQdf[WQC_of_interest[k]]),
legend=WQC_of_interest[k], line_width= lws[k],
color = plot_colors[k],name = WQC_of_interest[k])
#Overplot reach start and end points of each reach
if len(SRdf) > 0:
Points1 = list(SRdf['BEGIN NAME'])
Rkms1 = list(SRdf['BEGIN REACH KM'])
if len(SRdf) > 1:
Points2 = [SRdf['END NAME'][SRdf.index[-1]]]
Rkms2 = [SRdf['END REACH KM'][SRdf.index[-1]]]
else:
Points2 = list(SRdf['END NAME'])
Rkms2 = list(SRdf['END REACH KM'])
Points = Points1 + Points2
#Rkms = Rkms1.append(Rkms2)
Rkms = Rkms1+Rkms2
#p1.text([65,65,65],[65,65,65], text=[ str(i) for i in x], alpha=0.5, text_font_size="5pt", text_baseline="middle",
#text_align="center")
for i in range(0,len(Points)):
#print Points[i]
p.line([Rkms[i],Rkms[i]],[-999,999],'..',line_dash = 'dotted',color = 'grey')
p.text([Rkms[i]],[np.mean(y_range)],text = [Points[i]],text_align = 'center',
angle = 3.14159265/2,text_font_size = '9pt',text_color = 'grey')
if DOstd != np.nan:
DOstds = [DOstd,DOstd-0.2]
vas = ['bottom','top']
for i in range(len(DOstds)):
p.line([-999,999],[DOstds[i],DOstds[i]],'..',line_dash = 'dotted',color = 'red')
p.text([np.mean(x_range)],[DOstds[i]],["DO std = "+"{:4.1f}".format(DOstds[i])+" mg/L"],
text_baseline = vas[i],text_font_size = '9pt',text_color = 'red')
pass
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
show(p)
In [ ]: