In [1]:
%run basics
%matplotlib
import xlrd
from matplotlib.patches import Polygon
In [2]:
def get_data_xlsheet(sheet,frow,label):
header = sheet.row_values(frow-1)
col = header.index(label)
lrow = int(sheet.nrows)
a = numpy.array(active_sheet.col_values(col)[frow:lrow])
idx = numpy.where(~numpy.isnan(a)&(a!=-9999))[0]
return a[idx]
In [3]:
def colour_boxes(ax,bp,data,nsites,nalts):
boxColors = {1:['darkkhaki'],2:['darkkhaki','royalblue'],
3:['red','darkkhaki','royalblue']}
numBoxes = nsites*nalts
medians = list(range(numBoxes))
for i in range(numBoxes):
box = bp['boxes'][i]
boxX = []
boxY = []
for j in range(5):
boxX.append(box.get_xdata()[j])
boxY.append(box.get_ydata()[j])
boxCoords = list(zip(boxX, boxY))
# Alternate between Dark Khaki and Royal Blue
k = i % nalts
boxPolygon = Polygon(boxCoords, facecolor=boxColors[nalts][k])
ax.add_patch(boxPolygon)
# Now draw the median lines back over what we just filled in
med = bp['medians'][i]
medianX = []
medianY = []
for j in range(2):
medianX.append(med.get_xdata()[j])
medianY.append(med.get_ydata()[j])
ax.plot(medianX, medianY, 'k')
medians[i] = medianY[0]
In [4]:
def create_site_dict(FluxNet_ID):
d = {"FluxNet_ID":FluxNet_ID,
"ustar":{"60":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"182":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"365":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"all":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]}},
"Fh":{"60":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"182":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"365":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"all":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]}},
"Fe":{"60":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"182":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"365":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"all":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]}},
"Fc":{"60":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"182":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"365":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]},
"all":{"RMSE":[],"r":[],"Var ratio":[],"Bias":[]}}}
return d
In [5]:
# make a dictionary of sites ...
sites = {"Calperum":{"FluxNet_ID":"AU-Cpr"},
"CumberlandPlains":{"FluxNet_ID":"AU-Cum"},
"DalyUncleared":{"FluxNet_ID":"AU-DaS"},
"Gingin":{"FluxNet_ID":"AU-Gin"},
"HowardSprings":{"FluxNet_ID":"AU-How"},
"SturtPlains":{"FluxNet_ID":"AU-Stp"},
"Tumbarumba":{"FluxNet_ID":"AU-Tum"},
"Whroo":{"FluxNet_ID":"AU-Whr"},
"WombatStateForest":{"FluxNet_ID":"AU-Wom"}}
# ... and a dictionary for the data
data = {}
for site in sites.keys():
data[site] = create_site_dict(sites[site]["FluxNet_ID"])
In [6]:
site_name_list = data.keys()
site_name_list.sort()
nsites = len(site_name_list)
In [7]:
# read the data from the L5 summary spreadsheets
frow = 11
xl_path = "../Docs/SpecialIssue_2014/OzFluxDataPath/Data/L5_statistics/"
for site in site_name_list:
for var in ["ustar","Fh","Fe","Fc"]:
for alt in ["60","182"]:
xl_path = xl_path+alt+"days/"
xl_name = xl_path+site+"_L5_SOLOStats.xls"
xl_book = xlrd.open_workbook(xl_name)
sheet_name = var+"_SOLO"
active_sheet = xl_book.sheet_by_name(sheet_name)
for item in ["RMSE","r","Var ratio","Bias"]:
data[site][var][alt][item] = get_data_xlsheet(active_sheet,frow,item)
In [9]:
# plot
plot_path = "../Docs/SpecialIssue_2014/OzFluxDataPath/Data/L5_statistics/"
# shuffle the data
variables = {"ustar":{"title":"Friction velocity",
"units":"m/s",
"alt_list":["60","182"]},
"Fh":{"title":"Sensible heat flux",
"units":"W/m2",
"alt_list":["60","182"]},
"Fe":{"title":"Latent heat flux",
"units":"W/m2",
"alt_list":["60","182"]},
"Fc":{"title":"CO2 flux",
"units":"umol/m2/s",
"alt_list":["60","182"]}}
boxprops = dict(linestyle='-',color='black')
for var in variables.keys():
rmse = []; r =[]; var_ratio = []; bias = []
xlabels_site = []
nalts = len(variables[var]["alt_list"])
minor_ticks = [x+0.5 for x in range(nalts,nalts*nsites,nalts)]
for site in site_name_list:
for alt in variables[var]["alt_list"]:
xlabels_site.append(data[site]["FluxNet_ID"])
rmse.append(data[site][var][alt]["RMSE"])
r.append(data[site][var][alt]["r"])
var_ratio.append(data[site][var][alt]["Var ratio"])
bias.append(data[site][var][alt]["Bias"])
# do the plot
xlabels_site = ["" if i%nalts!=0 else x for i,x in enumerate(xlabels_site)]
fig,axs = plt.subplots(4,figsize=(8,6))
fig.canvas.set_window_title(var)
plt.subplots_adjust(hspace=0.15)
axs[0].set_title(variables[var]["title"])
rmse_bp = axs[0].boxplot(rmse,boxprops=boxprops,whis=0,sym="",showcaps=False)
ylabel = "RMSE ("+variables[var]["units"]+")"
axs[0].set_ylabel(ylabel)
colour_boxes(axs[0],rmse_bp,rmse,nsites,nalts)
axs[0].set_xticks(minor_ticks, minor=True)
axs[0].xaxis.grid(which='minor')
r_bp = axs[1].boxplot(r,boxprops=boxprops,whis=0,sym="",showcaps=False)
axs[1].set_ylabel("R")
colour_boxes(axs[1],r_bp,r,nsites,nalts)
axs[1].set_xticks(minor_ticks, minor=True)
axs[1].xaxis.grid(which='minor')
vr_bp = axs[2].boxplot(var_ratio,boxprops=boxprops,whis=0,sym="",showcaps=False)
axs[2].set_ylabel("Var ratio")
colour_boxes(axs[2],vr_bp,var_ratio,nsites,nalts)
axs[2].set_xticks(minor_ticks, minor=True)
axs[2].xaxis.grid(which='minor')
axs[2].axhline(y=1,linewidth=2,linestyle=':',color='red',alpha=0.5)
bias_bp = axs[3].boxplot(bias,boxprops=boxprops,whis=0,sym="",showcaps=False)
ylabel = "Bias ("+variables[var]["units"]+")"
axs[3].set_ylabel(ylabel)
colour_boxes(axs[3],bias_bp,bias,nsites,nalts)
axs[3].set_xticks(minor_ticks, minor=True)
axs[3].xaxis.grid(which='minor')
axs[3].axhline(y=0,linewidth=2,linestyle=':',color='red',alpha=0.5)
xticklabels = axs[0].get_xticklabels()+axs[1].get_xticklabels()+axs[2].get_xticklabels()
plt.setp(xticklabels, visible=False)
xtickNames = plt.setp(axs[3], xticklabels=xlabels_site)
plt.setp(xtickNames, rotation=45, fontsize=10)
plot_name = plot_path+var+".eps"
plt.savefig(plot_name)
plt.show()
In [ ]: