def make_PCO2_vs_Month_plots(sitesDir, siteList=None, siteFile=None, classFile=''): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print("Making plot for: "+site) #Read out data into shorter variable names T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality good_values = get_good_indicies([T_C,CO2]) T_C = T_C[good_values] CO2 = CO2[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2/K_H sample_month = PCO2.index.month figure() #semilogy(sample_month, PCO2, 'o', color=this_color) plot(sample_month, PCO2, 'o', color=this_color) xlabel('Month') ylabel('PCO2 (atm)') savefig(os.path.join(plotsDir,site+'-PCO2_vs_Month.pdf'))
def make_PCO2_vs_Month_plots(sitesDir, siteList=None, siteFile=None, classFile=''): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in list(sitePanelDict.keys()): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print(("Making plot for: "+site)) #Read out data into shorter variable names T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality good_values = get_good_indicies([T_C,CO2]) T_C = T_C[good_values] CO2 = CO2[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2/K_H sample_month = PCO2.index.month figure() #semilogy(sample_month, PCO2, 'o', color=this_color) plot(sample_month, PCO2, 'o', color=this_color) xlabel('Month') ylabel('PCO2 (atm)') savefig(os.path.join(plotsDir,site+'-PCO2_vs_Month.pdf'))
def make_saturation_ratio_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True): sitePanelDict, sitePhreeqcDict = loadSiteListData( processedSitesDir=sitesDir, loadPhreeqc=True) rs = [] ps = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): print("Making plot for: " + site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality Ca = sitePhreeqcDict[site]['Ca'] #Filter out nan values #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN good_values = get_good_indicies([Q, T_C, CO2, Ca]) Q = Q[good_values] T_C = T_C[good_values] CO2 = CO2[good_values] Ca = Ca[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2 / K_H #Calculate Equilibrium Ca concentration CaEq = concCaEqFromPCO2(PCO2, T_C=T_C) #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) #Make Discharge vs. Saturation Ratio Plot figure() loglog(Q, Ca / CaEq, 'o') xlabel('Discharge (cfs)') ylabel('Saturation Ratio $[Ca]/[Ca]_{eq}$') savefig(os.path.join(plotsDir, site + '-Q_vs_SatRatio.pdf')) #Calculate correlation coefficient and regression slope, intercept, r, p, stderr = linregress(log10(Q), Ca / CaEq) rs.append(r) ps.append(p) slopes.append(slope) if makeHistograms: figure() hist(Ca / CaEq, normed=True) xlabel('Saturation Ratio $[Ca]/[Ca]_{eq}$') ylabel('Frequency') savefig(os.path.join(plotsDir, site + '-SatRatioHist.pdf')) #Make histogram of pearson r values figure() hist(rs, normed=True) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir, 'PearsonR_Q_SatRatio.pdf'))
def make_saturation_ratio_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) rs = [] ps = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): print("Making plot for: "+site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality Ca = sitePhreeqcDict[site]['Ca'] #Filter out nan values #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN good_values = get_good_indicies([Q,T_C,CO2,Ca]) Q = Q[good_values] T_C = T_C[good_values] CO2 = CO2[good_values] Ca = Ca[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2/K_H #Calculate Equilibrium Ca concentration CaEq = concCaEqFromPCO2(PCO2, T_C=T_C) #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) #Make Discharge vs. Saturation Ratio Plot figure() loglog(Q, Ca/CaEq, 'o') xlabel('Discharge (cfs)') ylabel('Saturation Ratio $[Ca]/[Ca]_{eq}$') savefig(os.path.join(plotsDir,site+'-Q_vs_SatRatio.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(log10(Q), Ca/CaEq) rs.append(r) ps.append(p) slopes.append(slope) if makeHistograms: figure() hist(Ca/CaEq, normed=True) xlabel('Saturation Ratio $[Ca]/[Ca]_{eq}$') ylabel('Frequency') savefig(os.path.join(plotsDir,site+'-SatRatioHist.pdf')) #Make histogram of pearson r values figure() hist(rs,normed=True) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_Q_SatRatio.pdf'))
def make_PCO2_vs_Q_plots(sitesDir, siteList=None, siteFile=None, classFile='', makeHistograms=True): sitePanelDict, sitePhreeqcDict = loadSiteListData( processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1', index_col=1, names=['name', 'site', 'recharge', 'age']) rs = [] ps = [] site_class = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): if classFile != '': #read in classification for this site this_class = class_xls['recharge'][site] this_color = class_colors[this_class] site_class.append(this_class) else: this_color = 'black' print("Making plot for: " + site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality Ca = sitePhreeqcDict[site]['Ca'] #Filter out nan values #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN good_values = get_good_indicies([Q, T_C, CO2, Ca]) Q = Q[good_values] T_C = T_C[good_values] CO2 = CO2[good_values] Ca = Ca[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2 / K_H figure() loglog(Q, PCO2, 'o', color=this_color) xlabel('Discharge (cfs)') ylabel('PCO2 (atm)') savefig(os.path.join(plotsDir, site + '-PCO2_vs_Q.pdf'))
def make_saturation_index_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True): sitePanelDict, sitePhreeqcDict = loadSiteListData( processedSitesDir=sitesDir, loadPhreeqc=True) rs = [] ps = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): print("Making plot for: " + site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] SI = sitePhreeqcDict[site].SI_Calcite #Filter out nan values good_values = get_good_indicies([Q, SI]) Q = Q[good_values] SI = SI[good_values] check_plots_dir(sitesDir) #Make Discharge vs. Saturation Index Plot figure() semilogx(Q, SI, 'o') xlabel('Discharge (cfs)') ylabel('$SI_{calcite}$') savefig(os.path.join(plotsDir, site + '-Q_vs_SI.pdf')) #Calculate correlation coefficient and regression slope, intercept, r, p, stderr = linregress(log10(Q), SI) rs.append(r) ps.append(p) slopes.append(slope) if makeHistograms: figure() hist(SI, normed=True) xlabel('$SI_{calcite}$') ylabel('Frequency') savefig(os.path.join(plotsDir, site + '-SIHist.pdf')) #Make histogram of pearson r values figure() hist(rs, normed=True) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir, 'PearsonR_Q_SIRatio.pdf'))
def make_saturation_index_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) rs = [] ps = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): print("Making plot for: "+site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] SI = sitePhreeqcDict[site].SI_Calcite #Filter out nan values good_values = get_good_indicies([Q,SI]) Q = Q[good_values] SI = SI[good_values] check_plots_dir(sitesDir) #Make Discharge vs. Saturation Index Plot figure() semilogx(Q, SI, 'o') xlabel('Discharge (cfs)') ylabel('$SI_{calcite}$') savefig(os.path.join(plotsDir,site+'-Q_vs_SI.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(log10(Q), SI) rs.append(r) ps.append(p) slopes.append(slope) if makeHistograms: figure() hist(SI, normed=True) xlabel('$SI_{calcite}$') ylabel('Frequency') savefig(os.path.join(plotsDir,site+'-SIHist.pdf')) #Make histogram of pearson r values figure() hist(rs,normed=True) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_Q_SIRatio.pdf'))
def make_PCO2_vs_Q_plots(sitesDir, siteList=None, siteFile=None, classFile='', makeHistograms=True): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) rs = [] ps = [] site_class = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print("Making plot for: "+site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality Ca = sitePhreeqcDict[site]['Ca'] #Filter out nan values #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN good_values = get_good_indicies([Q,T_C,CO2,Ca]) Q = Q[good_values] T_C = T_C[good_values] CO2 = CO2[good_values] Ca = Ca[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2/K_H figure() loglog(Q, PCO2, 'o', color=this_color) xlabel('Discharge (cfs)') ylabel('PCO2 (atm)') savefig(os.path.join(plotsDir,site+'-PCO2_vs_Q.pdf'))
def make_pwp_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] rs =[] ps = [] spp = [] spr = [] slopes= [] plotsDir = os.path.join(sitesDir, 'plots/') #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) for site in list(sitePanelDict.keys()): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print(("Making plot for: "+site)) Q = sitePanelDict[site].data['Stream flow, mean. daily'] pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site]) pwp_rates = pwp_to_mm_yr(pwp_rates) df = DataFrame({'Q':Q, 'pwp':pwp_rates}) df = df.dropna() Qposids = df.Q>0 df = df[Qposids] #Calculate fitting function parameters fit_converged = True if df.Q.values.size>5: try: opt_params, pcov = curve_fit(pwp_Q_fit, df['Q'], df['pwp'], p0=[1.,1.,1.]) k = opt_params[0] a = opt_params[1] beta = opt_params[2] except RuntimeError as e: fit_converged = False print(e) else: fit_converged = False #Make Discharge vs. Saturation Ratio Plot figure() if plotloglog: if bracket_charge_balance: loglog(df.Q, df.pwp, '.', ms=0, color=this_color) else: loglog(df.Q, df.pwp, '.', color=this_color) else: if bracket_charge_balance: semilogx(df.Q, df.pwp, '.', color=this_color, ms=0) else: semilogx(df.Q, df.pwp, '.', color=this_color) #plot fitting function if fit_converged: Q_fit = linspace(df.Q.min(), df.Q.max(), 1000) pwp_fit = pwp_Q_fit(Q_fit, k, a, beta) plot(Q_fit, pwp_fit, '-k') xlabel('Discharge (cfs)') ylabel('PWP Dissolution Rate (mm/yr)') if bracket_charge_balance: #Load charge bracket data df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0) df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0) pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk)) pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca)) delta_alk = df.pwp - pwp_alk delta_ca = df.pwp - pwp_ca delta_upper = zeros(delta_ca.size) delta_lower = zeros(delta_ca.size) for i, delta in enumerate(delta_ca): if delta<0: delta_upper[i] = abs(delta_ca[i]) delta_lower[i] = abs(delta_alk[i]) elif delta>0: delta_lower[i] = abs(delta_ca[i]) delta_upper[i] = abs(delta_alk[i]) df['pwp_upper'] = delta_upper[Qposids.values] df['pwp_lower'] = delta_lower[Qposids.values] df['Alkalinity_balance_error'] = df_alk['Percent error'] not_converged = df['Alkalinity_balance_error']>5.0 df.pwp[not_converged]=nan df = df.dropna() df = df[df.Q>0] #USGS database has some negative values? -999999 errorbar(df.Q, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color) tight_layout() savefig(os.path.join(plotsDir,site+'-Q_vs_PWP.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(log10(df.Q), df.pwp) rs.append(r) if isnan(r): return df ps.append(p) [this_spr, this_spp] = spearmanr(log10(df.Q), df.pwp) spr.append(this_spr) spp.append(this_spp) slopes.append(slope) if makeHistograms: figure() hist(df.pwp, normed=True, color=this_color) xlabel('PWP Rate mm/yr') ylabel('Frequency') savefig(os.path.join(plotsDir,site+'-PWPHist.pdf')) #Make histogram of pearson r values figure() arr_rs = array(rs) arr_ps = array(ps) arr_spr = array(spr) arr_spp = array(spp) arr_site_class = array(site_class) goodids = logical_and(~isnan(arr_rs), ~isnan(arr_ps)) arr_rs = arr_rs[goodids] arr_ps = arr_ps[goodids] arr_site_class = arr_site_class[goodids] if arr_rs[arr_site_class==1].shape[0]>1: arr1_rs_sig = arr_rs[logical_and(arr_site_class==1, arr_ps<0.05)] print("Class 1: number of sig ps = ",arr1_rs_sig.size, "number insig = ", arr_rs[arr_site_class==1].size - arr1_rs_sig.size) hist(arr1_rs_sig, nbins, color=class_colors[1], alpha=0.5) if arr_rs[arr_site_class==2].shape[0]>1: arr2_rs_sig = arr_rs[logical_and(arr_site_class==2, arr_ps<0.05)] print("Class 2: number of sig ps = ",arr2_rs_sig.size, "number insig = ", arr_rs[arr_site_class==2].size - arr2_rs_sig.size) hist(arr2_rs_sig, nbins, color=class_colors[2], alpha=0.5) if arr_rs[arr_site_class==3].shape[0]>1: arr3_rs_sig = arr_rs[logical_and(arr_site_class==3, arr_ps<0.05)] print("Class 3: number of sig ps = ",arr3_rs_sig.size, "number insig = ", arr_rs[arr_site_class==3].size - arr3_rs_sig.size) hist(arr3_rs_sig, nbins, color=class_colors[3], alpha=0.5) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_Q_PWP.pdf')) #Make histogram of pearson p values figure() if arr_ps[arr_site_class==1].shape[0]>1: hist(arr_ps[arr_site_class==1], nbins, color=class_colors[1], alpha=0.5) if arr_ps[arr_site_class==2].shape[0]>1: hist(arr_ps[arr_site_class==2], nbins, color=class_colors[2], alpha=0.5) if arr_ps[arr_site_class==3].shape[0]>1: hist(arr_ps[arr_site_class==3], nbins, color=class_colors[3], alpha=0.5) xlabel('Pearson p') ylabel('Frequency') savefig(os.path.join(plotsDir, 'PearsonP_Q_PWP.pdf')) #Make histogram of spearman r values arr_spr = array(spr) arr_spp = array(spp) arr_site_class = array(site_class) goodids = logical_and(~isnan(arr_spr), ~isnan(arr_spp)) arr_spr = arr_spr[goodids] arr_spp = arr_spp[goodids] arr_site_class = arr_site_class[goodids] figure() if arr_spr[arr_site_class==1].shape[0]>1: arr1_spr_sig = arr_spr[logical_and(arr_site_class==1, arr_spp<0.05)] print("Class 1: number of sig ps = ",arr1_spr_sig.size, "number insig = ", arr_spr[arr_site_class==1].size - arr1_spr_sig.size) hist(arr1_spr_sig, nbins, color=class_colors[1], alpha=0.5) if arr_spr[arr_site_class==2].shape[0]>1: arr2_spr_sig = arr_spr[logical_and(arr_site_class==2, arr_spp<0.05)] print("Class 2: number of sig ps = ",arr2_spr_sig.size, "number insig = ", arr_spr[arr_site_class==2].size - arr2_spr_sig.size) hist(arr2_spr_sig, nbins, color=class_colors[2], alpha=0.5) if arr_spr[arr_site_class==3].shape[0]>1: arr3_spr_sig = arr_spr[logical_and(arr_site_class==3, arr_spp<0.05)] print("Class 3: number of sig ps = ",arr3_spr_sig.size, "number insig = ", arr_spr[arr_site_class==3].size - arr3_spr_sig.size) hist(arr3_spr_sig, nbins, color=class_colors[3], alpha=0.5) xlabel('Spearman R') ylabel('Frequency') savefig(os.path.join(plotsDir, 'SpearmanR_Q_PWP.pdf')) #Make histogram of spearman p values figure() if arr_spp[arr_site_class==1].shape[0]>1: hist(arr_spp[arr_site_class==1], nbins, color=class_colors[1], alpha=0.5) if arr_spp[arr_site_class==2].shape[0]>1: hist(arr_spp[arr_site_class==2], nbins, color=class_colors[2], alpha=0.5) if arr_spp[arr_site_class==3].shape[0]>1: hist(arr_spp[arr_site_class==3], nbins, color=class_colors[3], alpha=0.5) xlabel('Spearman p') ylabel('Frequency') savefig(os.path.join(plotsDir, 'SpearmanP_Q_PWP.pdf'))
def make_pwp_vs_PCO2_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] rs =[] ps = [] spp = [] spr = [] slopes= [] plotsDir = os.path.join(sitesDir, 'plots/') #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) for site in list(sitePanelDict.keys()): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print(("Making plot for: "+site)) Q = sitePanelDict[site].data['Stream flow, mean. daily'] pwp_rates,PCO2 = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site], returnPCO2=True) pwp_rates = pwp_to_mm_yr(pwp_rates) df = DataFrame({'PCO2':PCO2, 'pwp':pwp_rates}) df = df.dropna() #Make PWP vs. PCO2 Plot figure() if plotloglog: if bracket_charge_balance: loglog(df.PCO2, df.pwp, '.', ms=0, color=this_color) else: loglog(df.PCO2, df.pwp, '.', color=this_color) else: if bracket_charge_balance: semilogx(df.PCO2, df.pwp, '.', color=this_color, ms=0) else: semilogx(df.PCO2, df.pwp, '.', color=this_color) xlabel('PCO2 (atm)') ylabel('PWP Dissolution Rate (mm/yr)') if bracket_charge_balance: #Load charge bracket data df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0) df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0) pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk)) pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca)) delta_alk = df.pwp - pwp_alk delta_ca = df.pwp - pwp_ca delta_upper = zeros(delta_ca.size) delta_lower = zeros(delta_ca.size) for i, delta in enumerate(delta_ca): if delta<0: delta_upper[i] = abs(delta_ca[i]) delta_lower[i] = abs(delta_alk[i]) elif delta>0: delta_lower[i] = abs(delta_ca[i]) delta_upper[i] = abs(delta_alk[i]) df['pwp_upper'] = delta_upper df['pwp_lower'] = delta_lower df['Alkalinity_balance_error'] = df_alk['Percent error'] not_converged = df['Alkalinity_balance_error']>5.0 df.pwp[not_converged]=nan df = df.dropna() errorbar(df.PCO2, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color) savefig(os.path.join(plotsDir,site+'-PCO2_vs_PWP.pdf'))
def make_pwp_vs_T_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile=''): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) rs = [] ps = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in list(sitePanelDict.keys()): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] else: this_color='black' print(("Making plot for: "+site)) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality Ca = sitePhreeqcDict[site]['Ca'] a_Ca = sitePhreeqcDict[site]['Ca+2_Activity'] a_H2CO3s = sitePhreeqcDict[site]['CO2_Activity'] a_HCO3 = sitePhreeqcDict[site]['HCO3-_Activity'] a_H = sitePhreeqcDict[site]['H+_Activity'] #Filter out nan values #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN good_values = get_good_indicies([Q,T_C,CO2,Ca,a_Ca,a_H2CO3s,a_H, a_HCO3]) Q = Q[good_values] T_C = T_C[good_values] CO2 = CO2[good_values] Ca = Ca[good_values] a_Ca = a_Ca[good_values] a_H = a_H[good_values] a_H2CO3s = a_H2CO3s[good_values] a_HCO3 = a_HCO3[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2/K_H #Calculate PWP rates pwp_rates = [] for i, value in enumerate(Q): # sol = solutionFromCaPCO2(Ca[i], PCO2[i], T_C = T_C[i]) # this_pwp = pwpFromSolution(sol) this_pwp = pwpRateTheory(a_Ca=a_Ca[i], a_H2CO3s=a_H2CO3s[i], a_H=a_H[i], a_HCO3=a_HCO3[i], T_K=T_K[i], PCO2=PCO2[i]) this_rate_mm_yr = pwp_to_mm_yr(this_pwp) pwp_rates.append(this_rate_mm_yr) #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) #Make Discharge vs. Saturation Ratio Plot figure() plot(T_C, pwp_rates, 'o', color=this_color) xlabel('Temperature ($^\circ C$)') ylabel('PWP Dissolution Rate (mm/yr)') savefig(os.path.join(plotsDir,site+'-T_vs_PWP.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(T_C, pwp_rates) rs.append(r) ps.append(p) slopes.append(slope) if makeHistograms: figure() hist(pwp_rates, normed=True, color=this_color) xlabel('PWP Rate mm/yr') ylabel('Frequency') savefig(os.path.join(plotsDir,site+'-PWPHist.pdf')) #Make histogram of pearson r values figure() hist(rs,normed=True) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_T_PWP.pdf'))
def make_pwp_vs_saturation_ratio_plots(sitesDir, siteList=None, siteFile=None, classFile='', plotloglog=True): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] rs =[] ps = [] spp = [] spr = [] slopes= [] plotsDir = os.path.join(sitesDir, 'plots/') #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) for site in list(sitePanelDict.keys()): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print(("Making plot for: "+site)) Q = sitePanelDict[site].data['Stream flow, mean. daily'] pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site]) pwp_rates = pwp_to_mm_yr(pwp_rates) T_C = sitePanelDict[site].data['Temperature, water'] T_K = CtoK(T_C) K_H = calc_K_H(T_K) CO2 = sitePhreeqcDict[site].CO2_Molality PCO2 = CO2/K_H CaEq = concCaEqFromPCO2(PCO2, T_C=T_C) sat_ratio = sitePhreeqcDict[site].Ca/CaEq df = DataFrame({'Q':Q, 'pwp':pwp_rates, 'sat_ratio':sat_ratio}) df = df.dropna() #Make PWP vs. Saturation Ratio Plot figure() if plotloglog: loglog(df.pwp, df.sat_ratio, '.', color=this_color) else: semilogx(df.pwp, df.sat_ratio, '.', color=this_color) xlabel('PWP Dissolution Rate (mm/yr)') ylabel('Saturation ratio') savefig(os.path.join(plotsDir,site+'-Sat_ratio_vs_PWP.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(df.pwp, df.sat_ratio) rs.append(r) ps.append(p) [this_spr, this_spp] = spearmanr(df.pwp, df.sat_ratio) spr.append(this_spr) spp.append(this_spp) slopes.append(slope) #Make histogram of pearson r values figure() arr_rs = array(rs) print("size arr_rs=", arr_rs.size) arr_ps = array(ps) arr_spr = array(spr) arr_spp = array(spp) arr_site_class = array(site_class) hist(arr_rs[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_rs[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_rs[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_PWP_SatRatio.pdf')) #Make histogram of pearson p values figure() hist(arr_ps[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_ps[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_ps[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Pearson p') ylabel('Frequency') savefig(os.path.join(plotsDir, 'PearsonP_PWP_SatRatio.pdf')) #Make histogram of spearman r values figure() hist(arr_spr[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_spr[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_spr[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Spearman R') ylabel('Frequency') savefig(os.path.join(plotsDir, 'SpearmanR_PWP_SatRatio.pdf')) #Make histogram of spearman p values figure() hist(arr_spp[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_spp[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_spp[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Spearman p') ylabel('Frequency') savefig(os.path.join(plotsDir, 'SpearmanP_PWP_SatRatio.pdf'))
def processSites(sitesDir, PHREEQC_PATH, DATABASE_FILE, phreeqcDict=None, regEx='USGS-*', bracket_charge_balance=False, process_regular=True): """ Processes all data from site directories in PHREEQC. Parameters ---------- sitesDir : str The directory that contains the site directories to be processed. PHREEQC_PATH : str The path to the phreeqc executable. DATABASE_FILE : str The path to the phreeqc database file to be used. phreeqcDict : dict a dictionary with WQX characteristics as keys and phreeqc chemical names as entries. By default, processPanel will use the built in translation dict, default_phreeqc_to_WQX_translation. regEx : str (optional) A regular expression to be used to locate site directories. (default = 'USGS-') bracket_charge_balance : bool If set to True, then charge balance will be bracketed by forcing balance on Ca and Alkalinity alternately. Default = False. process_regular : bool If set to True, then PHREEQC will be run without any charge balance forcing. This can be set to False if the calculations without forced balance are already done and you only want to do the charge balance runs. Default = True. Returns ------- None """ sitesDict = loadSiteListData(regEx=regEx, processedSitesDir=sitesDir) if process_regular: #Run PHREEQC on sites without forced charge balance for site, site_panel in sitesDict.items(): print(("Processing " + site + " in PHREEQC")) sitedf = processPanel(site_panel, os.path.join(sitesDir, site), PHREEQC_PATH=PHREEQC_PATH, DATABASE_FILE=DATABASE_FILE, phreeqcDict=phreeqcDict) phreeqc_site_file = os.path.join(sitesDir, site, site + '-PHREEQC.pkl') try: pickle.dump(sitedf, open(phreeqc_site_file, 'wb')) sitedf.to_csv(phreeqc_site_file[:-3] + 'csv') except IOError: print('Problem writing out PHREEQC data file.') if bracket_charge_balance: #Run PHREEQC using bracketed charge balance for sites for site, site_panel in sitesDict.items(): #Force balance on Calcium phreeqc_df_ca = processPanel(site_panel, os.path.join(sitesDir, site), PHREEQC_PATH, DATABASE_FILE, force_balance='Ca') phreeqc_site_file_ca = os.path.join(sitesDir, site, site + '-PHREEQC-Ca.pkl') try: pickle.dump(phreeqc_df_ca, open(phreeqc_site_file_ca, 'wb')) phreeqc_df_ca.to_csv(phreeqc_site_file_ca[:-3] + 'csv') except IOError: print('Problem writing out PHREEQC Ca data file.') #Force balance on Alkalinity phreeqc_df_alk = processPanel(site_panel, os.path.join(sitesDir, site), PHREEQC_PATH, DATABASE_FILE, force_balance='Alk') phreeqc_site_file_alk = os.path.join(sitesDir, site, site + '-PHREEQC-Alk.pkl') try: pickle.dump(phreeqc_df_alk, open(phreeqc_site_file_alk, 'wb')) phreeqc_df_alk.to_csv(phreeqc_site_file_alk[:-3] + 'csv') except IOError: print('Problem writing out PHREEQC Alk data file.')
def make_pwp_vs_T_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile=''): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) rs = [] ps = [] slopes = [] plotsDir = os.path.join(sitesDir, 'plots/') for site in sitePanelDict.keys(): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] else: this_color='black' print("Making plot for: "+site) #Read out data into shorter variable names Q = sitePanelDict[site].data['Stream flow, mean. daily'] T_C = sitePanelDict[site].data['Temperature, water'] CO2 = sitePhreeqcDict[site].CO2_Molality Ca = sitePhreeqcDict[site]['Ca'] a_Ca = sitePhreeqcDict[site]['Ca+2_Activity'] a_H2CO3s = sitePhreeqcDict[site]['CO2_Activity'] a_HCO3 = sitePhreeqcDict[site]['HCO3-_Activity'] a_H = sitePhreeqcDict[site]['H+_Activity'] #Filter out nan values #good_values = ~(Q+T_C+CO2+Ca).isnull()#Addition will create Nans if any of the series contains a NaN good_values = get_good_indicies([Q,T_C,CO2,Ca,a_Ca,a_H2CO3s,a_H, a_HCO3]) Q = Q[good_values] T_C = T_C[good_values] CO2 = CO2[good_values] Ca = Ca[good_values] a_Ca = a_Ca[good_values] a_H = a_H[good_values] a_H2CO3s = a_H2CO3s[good_values] a_HCO3 = a_HCO3[good_values] #Calculate PCO2 T_K = CtoK(T_C) K_H = calc_K_H(T_K) PCO2 = CO2/K_H #Calculate PWP rates pwp_rates = [] for i, value in enumerate(Q): # sol = solutionFromCaPCO2(Ca[i], PCO2[i], T_C = T_C[i]) # this_pwp = pwpFromSolution(sol) this_pwp = pwpRateTheory(a_Ca=a_Ca[i], a_H2CO3s=a_H2CO3s[i], a_H=a_H[i], a_HCO3=a_HCO3[i], T_K=T_K[i], PCO2=PCO2[i]) this_rate_mm_yr = pwp_to_mm_yr(this_pwp) pwp_rates.append(this_rate_mm_yr) #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) #Make Discharge vs. Saturation Ratio Plot figure() plot(T_C, pwp_rates, 'o', color=this_color) xlabel('Temperature ($^\circ C$)') ylabel('PWP Dissolution Rate (mm/yr)') savefig(os.path.join(plotsDir,site+'-T_vs_PWP.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(T_C, pwp_rates) rs.append(r) ps.append(p) slopes.append(slope) if makeHistograms: figure() hist(pwp_rates, normed=True, color=this_color) xlabel('PWP Rate mm/yr') ylabel('Frequency') savefig(os.path.join(plotsDir,site+'-PWPHist.pdf')) #Make histogram of pearson r values figure() hist(rs,normed=True) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_T_PWP.pdf'))
def make_pwp_vs_Q_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] rs =[] ps = [] spp = [] spr = [] slopes= [] plotsDir = os.path.join(sitesDir, 'plots/') #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) for site in sitePanelDict.keys(): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print("Making plot for: "+site) Q = sitePanelDict[site].data['Stream flow, mean. daily'] pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site]) pwp_rates = pwp_to_mm_yr(pwp_rates) df = DataFrame({'Q':Q, 'pwp':pwp_rates}) df = df.dropna() Qposids = df.Q>0 df = df[Qposids] #Calculate fitting function parameters fit_converged = True if df.Q.values.size>5: try: opt_params, pcov = curve_fit(pwp_Q_fit, df['Q'], df['pwp'], p0=[1.,1.,1.]) k = opt_params[0] a = opt_params[1] beta = opt_params[2] except RuntimeError, e: fit_converged = False print e else: fit_converged = False #Make Discharge vs. Saturation Ratio Plot figure() if plotloglog: if bracket_charge_balance: loglog(df.Q, df.pwp, '.', ms=0, color=this_color) else: loglog(df.Q, df.pwp, '.', color=this_color) else: if bracket_charge_balance: semilogx(df.Q, df.pwp, '.', color=this_color, ms=0) else: semilogx(df.Q, df.pwp, '.', color=this_color) #plot fitting function if fit_converged: Q_fit = linspace(df.Q.min(), df.Q.max(), 1000) pwp_fit = pwp_Q_fit(Q_fit, k, a, beta) plot(Q_fit, pwp_fit, '-k') xlabel('Discharge (cfs)') ylabel('PWP Dissolution Rate (mm/yr)') if bracket_charge_balance: #Load charge bracket data df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0) df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0) pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk)) pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca)) delta_alk = df.pwp - pwp_alk delta_ca = df.pwp - pwp_ca delta_upper = zeros(delta_ca.size) delta_lower = zeros(delta_ca.size) for i, delta in enumerate(delta_ca): if delta<0: delta_upper[i] = abs(delta_ca[i]) delta_lower[i] = abs(delta_alk[i]) elif delta>0: delta_lower[i] = abs(delta_ca[i]) delta_upper[i] = abs(delta_alk[i]) df['pwp_upper'] = delta_upper[Qposids.values] df['pwp_lower'] = delta_lower[Qposids.values] df['Alkalinity_balance_error'] = df_alk['Percent error'] not_converged = df['Alkalinity_balance_error']>5.0 df.pwp[not_converged]=nan df = df.dropna() df = df[df.Q>0] #USGS database has some negative values? -999999 errorbar(df.Q, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color) tight_layout() savefig(os.path.join(plotsDir,site+'-Q_vs_PWP.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(log10(df.Q), df.pwp) rs.append(r) if isnan(r): return df ps.append(p) [this_spr, this_spp] = spearmanr(log10(df.Q), df.pwp) spr.append(this_spr) spp.append(this_spp) slopes.append(slope) if makeHistograms: figure() hist(df.pwp, normed=True, color=this_color) xlabel('PWP Rate mm/yr') ylabel('Frequency') savefig(os.path.join(plotsDir,site+'-PWPHist.pdf'))
def make_pwp_vs_PCO2_plots(sitesDir, siteList=None, siteFile=None, makeHistograms=True, classFile='', bracket_charge_balance=False,plotloglog=False, nbins=10): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] rs =[] ps = [] spp = [] spr = [] slopes= [] plotsDir = os.path.join(sitesDir, 'plots/') #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) for site in sitePanelDict.keys(): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print("Making plot for: "+site) Q = sitePanelDict[site].data['Stream flow, mean. daily'] pwp_rates,PCO2 = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site], returnPCO2=True) pwp_rates = pwp_to_mm_yr(pwp_rates) df = DataFrame({'PCO2':PCO2, 'pwp':pwp_rates}) df = df.dropna() #Make PWP vs. PCO2 Plot figure() if plotloglog: if bracket_charge_balance: loglog(df.PCO2, df.pwp, '.', ms=0, color=this_color) else: loglog(df.PCO2, df.pwp, '.', color=this_color) else: if bracket_charge_balance: semilogx(df.PCO2, df.pwp, '.', color=this_color, ms=0) else: semilogx(df.PCO2, df.pwp, '.', color=this_color) xlabel('PCO2 (atm)') ylabel('PWP Dissolution Rate (mm/yr)') if bracket_charge_balance: #Load charge bracket data df_alk = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Alk.csv'), parse_dates = True, index_col=0) df_ca = read_csv(os.path.join(sitesDir, site, site+'-PHREEQC-Ca.csv'), parse_dates = True, index_col=0) pwp_alk = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_alk)) pwp_ca = pwp_to_mm_yr(calc_site_pwp(sitePanelDict[site], df_ca)) delta_alk = df.pwp - pwp_alk delta_ca = df.pwp - pwp_ca delta_upper = zeros(delta_ca.size) delta_lower = zeros(delta_ca.size) for i, delta in enumerate(delta_ca): if delta<0: delta_upper[i] = abs(delta_ca[i]) delta_lower[i] = abs(delta_alk[i]) elif delta>0: delta_lower[i] = abs(delta_ca[i]) delta_upper[i] = abs(delta_alk[i]) df['pwp_upper'] = delta_upper df['pwp_lower'] = delta_lower df['Alkalinity_balance_error'] = df_alk['Percent error'] not_converged = df['Alkalinity_balance_error']>5.0 df.pwp[not_converged]=nan df = df.dropna() errorbar(df.PCO2, df.pwp, yerr=[df.pwp_upper, df.pwp_lower], fmt='o', color=this_color) savefig(os.path.join(plotsDir,site+'-PCO2_vs_PWP.pdf'))
def processSites(sitesDir, PHREEQC_PATH, DATABASE_FILE, phreeqcDict=None, regEx='USGS-*', bracket_charge_balance=False, process_regular=True): """ Processes all data from site directories in PHREEQC. Parameters ---------- sitesDir : str The directory that contains the site directories to be processed. PHREEQC_PATH : str The path to the phreeqc executable. DATABASE_FILE : str The path to the phreeqc database file to be used. phreeqcDict : dict a dictionary with WQX characteristics as keys and phreeqc chemical names as entries. By default, processPanel will use the built in translation dict, default_phreeqc_to_WQX_translation. regEx : str (optional) A regular expression to be used to locate site directories. (default = 'USGS-') bracket_charge_balance : bool If set to True, then charge balance will be bracketed by forcing balance on Ca and Alkalinity alternately. Default = False. process_regular : bool If set to True, then PHREEQC will be run without any charge balance forcing. This can be set to False if the calculations without forced balance are already done and you only want to do the charge balance runs. Default = True. Returns ------- None """ sitesDict = loadSiteListData(regEx=regEx, processedSitesDir = sitesDir) if process_regular: #Run PHREEQC on sites without forced charge balance for site, site_panel in sitesDict.iteritems(): print("Processing "+site+" in PHREEQC") sitedf = processPanel(site_panel, os.path.join(sitesDir,site), PHREEQC_PATH=PHREEQC_PATH, DATABASE_FILE=DATABASE_FILE, phreeqcDict=phreeqcDict) phreeqc_site_file = os.path.join(sitesDir,site,site+'-PHREEQC.pkl') try: pickle.dump(sitedf, open(phreeqc_site_file, 'wb')) sitedf.to_csv(phreeqc_site_file[:-3]+'csv') except IOError: print('Problem writing out PHREEQC data file.') if bracket_charge_balance: #Run PHREEQC using bracketed charge balance for sites for site, site_panel in sitesDict.iteritems(): #Force balance on Calcium phreeqc_df_ca = processPanel(site_panel, os.path.join(sitesDir,site), PHREEQC_PATH, DATABASE_FILE, force_balance='Ca') phreeqc_site_file_ca = os.path.join(sitesDir,site,site+'-PHREEQC-Ca.pkl') try: pickle.dump(phreeqc_df_ca, open(phreeqc_site_file_ca, 'wb')) phreeqc_df_ca.to_csv(phreeqc_site_file_ca[:-3]+'csv') except IOError: print('Problem writing out PHREEQC Ca data file.') #Force balance on Alkalinity phreeqc_df_alk = processPanel(site_panel, os.path.join(sitesDir,site), PHREEQC_PATH, DATABASE_FILE, force_balance='Alk') phreeqc_site_file_alk = os.path.join(sitesDir,site,site+'-PHREEQC-Alk.pkl') try: pickle.dump(phreeqc_df_alk, open(phreeqc_site_file_alk, 'wb')) phreeqc_df_alk.to_csv(phreeqc_site_file_alk[:-3]+'csv') except IOError: print('Problem writing out PHREEQC Alk data file.')
def make_pwp_vs_saturation_ratio_plots(sitesDir, siteList=None, siteFile=None, classFile='', plotloglog=True): sitePanelDict, sitePhreeqcDict = loadSiteListData(processedSitesDir=sitesDir, loadPhreeqc=True) if classFile != '': class_xls = read_excel(classFile, 'Sheet1',index_col=1, names=['name','site', 'recharge', 'age']) site_class = [] rs =[] ps = [] spp = [] spr = [] slopes= [] plotsDir = os.path.join(sitesDir, 'plots/') #Check for plots directory and make it if one doesn't exist check_plots_dir(sitesDir) for site in sitePanelDict.keys(): if classFile !='': #read in classification for this site this_class = class_xls['recharge'][site] this_color=class_colors[this_class] site_class.append(this_class) else: this_color='black' print("Making plot for: "+site) Q = sitePanelDict[site].data['Stream flow, mean. daily'] pwp_rates = calc_site_pwp(sitePanelDict[site], sitePhreeqcDict[site]) pwp_rates = pwp_to_mm_yr(pwp_rates) T_C = sitePanelDict[site].data['Temperature, water'] T_K = CtoK(T_C) K_H = calc_K_H(T_K) CO2 = sitePhreeqcDict[site].CO2_Molality PCO2 = CO2/K_H CaEq = concCaEqFromPCO2(PCO2, T_C=T_C) sat_ratio = sitePhreeqcDict[site].Ca/CaEq df = DataFrame({'Q':Q, 'pwp':pwp_rates, 'sat_ratio':sat_ratio}) df = df.dropna() #Make PWP vs. Saturation Ratio Plot figure() if plotloglog: loglog(df.pwp, df.sat_ratio, '.', color=this_color) else: semilogx(df.pwp, df.sat_ratio, '.', color=this_color) xlabel('PWP Dissolution Rate (mm/yr)') ylabel('Saturation ratio') savefig(os.path.join(plotsDir,site+'-Sat_ratio_vs_PWP.pdf')) #Calculate correlation coefficient and regression slope,intercept,r,p,stderr = linregress(df.pwp, df.sat_ratio) rs.append(r) ps.append(p) [this_spr, this_spp] = spearmanr(df.pwp, df.sat_ratio) spr.append(this_spr) spp.append(this_spp) slopes.append(slope) #Make histogram of pearson r values figure() arr_rs = array(rs) print "size arr_rs=", arr_rs.size arr_ps = array(ps) arr_spr = array(spr) arr_spp = array(spp) arr_site_class = array(site_class) hist(arr_rs[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_rs[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_rs[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Pearson R') ylabel('Frequency') savefig(os.path.join(plotsDir,'PearsonR_PWP_SatRatio.pdf')) #Make histogram of pearson p values figure() hist(arr_ps[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_ps[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_ps[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Pearson p') ylabel('Frequency') savefig(os.path.join(plotsDir, 'PearsonP_PWP_SatRatio.pdf')) #Make histogram of spearman r values figure() hist(arr_spr[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_spr[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_spr[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Spearman R') ylabel('Frequency') savefig(os.path.join(plotsDir, 'SpearmanR_PWP_SatRatio.pdf')) #Make histogram of spearman p values figure() hist(arr_spp[arr_site_class==1],color=class_colors[1], alpha=0.5) hist(arr_spp[arr_site_class==2],color=class_colors[2], alpha=0.5) hist(arr_spp[arr_site_class==3],color=class_colors[3], alpha=0.5) xlabel('Spearman p') ylabel('Frequency') savefig(os.path.join(plotsDir, 'SpearmanP_PWP_SatRatio.pdf'))