def Portrait_diagram_subregion(obs_subregion_mean, obs_name, model_subregion_mean, model_names, seasonal_cycle, file_name, normalize=True): nmodel, nt, nregion = model_subregion_mean.shape if seasonal_cycle: obs_data = ma.mean( obs_subregion_mean.reshape([1, nt / 12, 12, nregion]), axis=1) model_data = ma.mean( model_subregion_mean.reshape([nmodel, nt / 12, 12, nregion]), axis=1) nt = 12 else: obs_data = obs_subregion_mean model_data = model_subregion_mean subregion_metrics = ma.zeros([4, nregion, nmodel]) for imodel in np.arange(nmodel): for iregion in np.arange(nregion): # First metric: bias subregion_metrics[0, iregion, imodel] = metrics.calc_bias( model_data[imodel, :, iregion], obs_data[0, :, iregion], average_over_time=True) # Second metric: standard deviation subregion_metrics[1, iregion, imodel] = metrics.calc_stddev_ratio( model_data[imodel, :, iregion], obs_data[0, :, iregion]) # Third metric: RMSE subregion_metrics[2, iregion, imodel] = metrics.calc_rmse( model_data[imodel, :, iregion], obs_data[0, :, iregion]) # Fourth metric: correlation subregion_metrics[3, iregion, imodel] = metrics.calc_correlation( model_data[imodel, :, iregion], obs_data[0, :, iregion]) if normalize: for iregion in np.arange(nregion): subregion_metrics[0, iregion, :] = subregion_metrics[ 0, iregion, :] / ma.std(obs_data[0, :, iregion]) * 100. subregion_metrics[ 1, iregion, :] = subregion_metrics[1, iregion, :] * 100. subregion_metrics[2, iregion, :] = subregion_metrics[ 2, iregion, :] / ma.std(obs_data[0, :, iregion]) * 100. region_names = ['R%02d' % i for i in np.arange(nregion) + 1] for imetric, metric in enumerate(['bias', 'std', 'RMSE', 'corr']): plotter.draw_portrait_diagram( subregion_metrics[imetric, :, :], region_names, model_names, file_name + '_' + metric, xlabel='model', ylabel='region')
def Portrait_diagram_subregion(obs_subregion_mean, obs_name, model_subregion_mean, model_names, seasonal_cycle, file_name, normalize=True): nmodel, nt, nregion = model_subregion_mean.shape if seasonal_cycle: obs_data = ma.mean(obs_subregion_mean.reshape( [1, nt / 12, 12, nregion]), axis=1) model_data = ma.mean(model_subregion_mean.reshape( [nmodel, nt / 12, 12, nregion]), axis=1) nt = 12 else: obs_data = obs_subregion_mean model_data = model_subregion_mean subregion_metrics = ma.zeros([4, nregion, nmodel]) for imodel in np.arange(nmodel): for iregion in np.arange(nregion): # First metric: bias subregion_metrics[0, iregion, imodel] = metrics.calc_bias( model_data[imodel, :, iregion], obs_data[0, :, iregion], average_over_time=True) # Second metric: standard deviation subregion_metrics[1, iregion, imodel] = metrics.calc_stddev_ratio( model_data[imodel, :, iregion], obs_data[0, :, iregion]) # Third metric: RMSE subregion_metrics[2, iregion, imodel] = metrics.calc_rmse( model_data[imodel, :, iregion], obs_data[0, :, iregion]) # Fourth metric: correlation subregion_metrics[3, iregion, imodel] = metrics.calc_correlation( model_data[imodel, :, iregion], obs_data[0, :, iregion]) if normalize: for iregion in np.arange(nregion): subregion_metrics[0, iregion, :] = subregion_metrics[ 0, iregion, :] / ma.std(obs_data[0, :, iregion]) * 100. subregion_metrics[ 1, iregion, :] = subregion_metrics[1, iregion, :] * 100. subregion_metrics[2, iregion, :] = subregion_metrics[ 2, iregion, :] / ma.std(obs_data[0, :, iregion]) * 100. region_names = ['R%02d' % i for i in np.arange(nregion) + 1] for imetric, metric in enumerate(['bias', 'std', 'RMSE', 'corr']): plotter.draw_portrait_diagram(subregion_metrics[imetric, :, :], region_names, model_names, file_name + '_' + metric, xlabel='model', ylabel='region')
def _draw_portrait_diagram(evaluation, plot_config): """""" metric_index = plot_config['metric_index'] diagram_data = np.array(evaluation.results[:][metric_index][:]) subregion_names = ["R{}".format(i) for i in range(len(evaluation.subregions))] target_names = [t.name for t in evaluation.target_datasets] plots.draw_portrait_diagram(diagram_data, target_names, subregion_names, fname=plot_config['output_name'], **plot_config.get('optional_args', {}))
def _draw_portrait_diagram(evaluation, plot_config): """""" metric_index = plot_config['metric_index'] diagram_data = np.array(evaluation.results[:][metric_index][:]) subregion_names = [ "R{}".format(i) for i in range(len(evaluation.subregions)) ] target_names = [t.name for t in evaluation.target_datasets] plots.draw_portrait_diagram(diagram_data, target_names, subregion_names, fname=plot_config['output_name'], **plot_config.get('optional_args', {}))
Bounds(33.0, 40.0, 25.0, 35.00) ] region_list = ["R" + str(i + 1) for i in xrange(13)] # metrics pattern_correlation = metrics.PatternCorrelation() # create the Evaluation object RCMs_to_CRU_evaluation = evaluation.Evaluation( CRU31, # Reference dataset for the evaluation # 1 or more target datasets for # the evaluation target_datasets, # 1 or more metrics to use in # the evaluation [pattern_correlation], # list of subregion Bounds # Objects list_of_regions) RCMs_to_CRU_evaluation.run() new_patcor = np.squeeze(np.array(RCMs_to_CRU_evaluation.results), axis=1) plotter.draw_portrait_diagram(np.transpose(new_patcor), allNames, region_list, fname=OUTPUT_PLOT, fmt='png', cmap='coolwarm_r')
Bounds( 15.0, 30.0, 15.0, 25.0), Bounds(-10.0, 10.0, 7.3, 15.0), Bounds(-10.9, 10.0, 5.0, 7.3), Bounds(33.9, 40.0, 6.9, 15.0), Bounds(10.0, 25.0, 0.0, 10.0), Bounds(10.0, 25.0,-10.0, 0.0), Bounds(30.0, 40.0,-15.0, 0.0), Bounds(33.0, 40.0, 25.0, 35.00)] region_list=["R"+str(i+1) for i in xrange(13)] #metrics pattern_correlation = metrics.PatternCorrelation() #create the Evaluation object RCMs_to_CRU_evaluation = evaluation.Evaluation(CRU31, # Reference dataset for the evaluation # 1 or more target datasets for the evaluation target_datasets, # 1 or more metrics to use in the evaluation [pattern_correlation], # list of subregion Bounds Objects list_of_regions) RCMs_to_CRU_evaluation.run() new_patcor = np.squeeze(np.array(RCMs_to_CRU_evaluation.results), axis=1) plotter.draw_portrait_diagram(np.transpose(new_patcor),allNames, region_list, fname=OUTPUT_PLOT, fmt='png', cmap='coolwarm_r')
def calculate_metrics_and_make_plots(varName, workdir, lons, lats, obsData, mdlData, obsRgn, mdlRgn, obsList, mdlList, subRegions, \ subRgnLon0, subRgnLon1, subRgnLat0, subRgnLat1): ''' Purpose:: Calculate all the metrics used in Kim et al. [2013] paper and plot them Input:: varName - evaluating variable workdir - lons - lats - obsData - mdlData - obsRgn - mdlRgn - obsList - mdlList - subRegions - subRgnLon0, subRgnLat0 - southwest boundary of sub-regions [numSubRgn] subRgnLon1, subRgnLat1 - northeast boundary of sub-regions [numSubRgn] Output:: png files ''' nobs, nt, ny, nx = obsData.shape nmodel = mdlData.shape[0] ### TODO: unit conversion (K to C) if varName == 'temp': obsData[0, :, :, :] = obsData[0, :, :, :] - 273.15 if subRegions: obsRgn[0, :, :] = obsRgn[0, :, :] - 273.15 if varName == 'prec' and obsData.max() > mdlData.max()*1000.: mdlData[:, :, :, :] = mdlData[:, :, :, :]*86400. if subRegions: mdlRgn[:, :, :] = mdlRgn[:, :, :]*86400. oTser, oClim = calcClimYear( obsData[0, :, :, :]) bias_of_overall_average = ma.zeros([nmodel, ny, nx]) spatial_stdev_ratio = np.zeros([nmodel]) spatial_corr = np.zeros([nmodel]) mdlList.append('ENS') for imodel in np.arange(nmodel): mTser, mClim = calcClimYear( mdlData[imodel,:,:,:]) bias_of_overall_average[imodel,:,:] = calcBias(mClim, oClim) spatial_corr[imodel], sigLev = calcPatternCorrelation(oClim, mClim) spatial_stdev_ratio[imodel] = calcSpatialStdevRatio(mClim, oClim) fig_return = plotter.draw_contour_map(oClim, lats, lons, workdir+'/observed_climatology_'+varName, fmt='png', gridshape=(1, 1), clabel='', ptitle='', subtitles=obsList, cmap=None, clevs=None, nlevs=10, parallels=None, meridians=None, extend='neither') # TODO: # Be sure to update "gridshape" argument to be the number of sub plots (rows,columns). This should be improved so that the # gridshape is optimally determined for a given number of models. For example: # For 3 models, a gridshape of (2,2) would be sensible: # X X # X # fig_return = plotter.draw_contour_map(bias_of_overall_average, lats, lons, workdir+'/bias_of_climatology_'+varName, fmt='png', gridshape=(6, 2), clabel='', ptitle='', subtitles=mdlList, cmap=None, clevs=None, nlevs=10, parallels=None, meridians=None, extend='neither') Taylor_data = np.array([spatial_stdev_ratio, spatial_corr]).transpose() fig_return = plotter.draw_taylor_diagram(Taylor_data, mdlList, refname='CRU', fname = workdir+'/Taylor_'+varName, fmt='png',frameon=False) if subRegions: nseason = 2 # (0: summer and 1: winter) nregion = len(subRgnLon0) season_name = ['summer','winter'] rowlabels = ['PNw','PNe','CAn','CAs','SWw','SWe','COL','GPn','GPc','GC','GL','NE','SE','FL'] collabels = ['M1','M2','M3','M4','M5','M6','ENS'] collabels[nmodel-1] = 'ENS' for iseason in [0,1]: portrait_subregion = np.zeros([4, nregion, nmodel]) portrait_titles = ['(a) Normalized Bias', '(b) Normalized STDV', '(c) Normalized RMSE', '(d) Correlation'] if iseason == 0: monthBegin=6 monthEnd=8 if iseason == 1: monthBegin=12 monthEnd=2 obsTser,obsClim = calcClimSeasonSubRegion(6,8,obsRgn[0,:,:]) for imodel in np.arange(nmodel): mTser, mClim = calcClimSeasonSubRegion(6,8,mdlRgn[imodel,:,:]) for iregion in np.arange(nregion): portrait_subregion[0,iregion,imodel] = calcBias(mClim[iregion],obsClim[iregion])/calcTemporalStdev(obsTser[iregion,:]) portrait_subregion[1,iregion,imodel] = calcTemporalStdev(mTser[iregion,:])/ calcTemporalStdev(obsTser[iregion,:]) portrait_subregion[2,iregion,imodel] = calcRootMeanSquaredDifferenceAveragedOverTime(mTser[iregion,:], obsTser[iregion,:])/calcTemporalStdev(obsTser[iregion,:]) portrait_subregion[3,iregion, imodel] = calcTemporalCorrelationSubRegion(mTser[iregion,:],obsTser[iregion,:]) portrait_return = plotter.draw_portrait_diagram(portrait_subregion, rowlabels, collabels[0:nmodel], workdir+'/portrait_diagram_'+season_name[iseason]+'_'+varName, fmt='png', gridshape=(2, 2), xlabel='', ylabel='', clabel='', ptitle='', subtitles=portrait_titles, cmap=None, clevs=None, nlevs=10, extend='neither') # annual cycle nmonth = 12 times = np.arange(nmonth) data_names = [obsList[0]] + list(mdlList) annual_cycle = np.zeros([nregion, nmonth, nmodel+1]) obsTser, annual_cycle[:, :, 0] = calcAnnualCycleMeansSubRegion(obsRgn[0,:,:]) obsStd = calcAnnualCycleStdevSubRegion(obsRgn[0,:,:]) for imodel in np.arange(nmodel): mdlTser, annual_cycle[:, :, imodel+1] = calcAnnualCycleMeansSubRegion(mdlRgn[imodel, :, :]) # Make annual_cycle shape compatible with draw_time_series annual_cycle = annual_cycle.swapaxes(1, 2) tseries_return = plotter.draw_time_series(annual_cycle, times, data_names, workdir+'/time_series_'+varName, gridshape=(7, 2), subtitles=rowlabels, label_month=True)