From 841f07369c0cf34a875d9cfa8f73f3598ad3d89c Mon Sep 17 00:00:00 2001 From: Lee de Mora Date: Thu, 2 Nov 2023 15:23:09 +0000 Subject: [PATCH] added capability to choose moving average and labels in the yml files --- bgcval2/analysis_compare.py | 19 ++++++++-- bgcval2/analysis_timeseries.py | 5 +++ bgcval2/timeseries/timeseriesPlots.py | 53 ++++++++++++++------------- key_files/amoc_26n.yml | 1 + 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/bgcval2/analysis_compare.py b/bgcval2/analysis_compare.py index e1c3be68..f1d6b833 100755 --- a/bgcval2/analysis_compare.py +++ b/bgcval2/analysis_compare.py @@ -189,6 +189,7 @@ def timeseries_compare(jobs, jobDescriptions={}, lineThicknesses=defaultdict(lambda: 1), linestyles=defaultdict(lambda: '-'), + labels = {}, ensembles={}, config_user=None, ): @@ -382,6 +383,7 @@ def timeseries_compare(jobs, regions = av[name]['regions'] layers = av[name]['layers'] metrics = av[name]['metrics'] + smoothings = av[name]['smoothings'] for region, layer, metric in itertools.product(regions, layers, metrics): timesD = {} arrD = {} @@ -405,20 +407,22 @@ def timeseries_compare(jobs, units = av[name]['modeldetails']['units'] ts = 'Together' - for ls in ['DataOnly', ]: + for smoothing in smoothings: + #or ls in ['DataOnly', ]: tsp.multitimeseries( timesD, # model times (in floats) arrD, # model time series data=-999, # in situ data distribution title=title, filename=bvt.folder(imageFolder) + - '_'.join([name, region, layer, ts, ls + '.png']), + '_'.join([name, region, layer, ts, smoothing + '.png']), units=units, plotStyle=ts, - lineStyle=ls, + smoothing=smoothing, colours=colours, thicknesses=lineThicknesses, linestyles=linestyles, + labels=labels, ) # Generate a list of comparison images: @@ -515,7 +519,8 @@ def load_comparison_yml(master_compare_yml_fn): descriptions = {} shifttimes = {} # number of years to shift time axis. timeranges = {} - + labels = {} + for jobID, job_dict in details['jobs'].items(): if job_dict.get('colour', False): colours[jobID] = job_dict['colour'] @@ -530,6 +535,8 @@ def load_comparison_yml(master_compare_yml_fn): timeranges[jobID] = job_dict.get('timerange', None) suites[jobID] = job_dict.get('suite', default_suite) auto_download_dict[jobID] = job_dict.get('auto_download', auto_download_dict[jobID]) + labels[jobID] = job_dict.get('label', jobID) + details['colours'] = colours details['descriptions'] = descriptions @@ -537,6 +544,7 @@ def load_comparison_yml(master_compare_yml_fn): details['linestyles'] = linestyles details['shifttimes'] = shifttimes details['timeranges'] = timeranges + details['labels'] = labels details['suites'] = suites details['auto_download'] = auto_download_dict return details @@ -567,6 +575,7 @@ def load_yml_and_run(compare_yml, config_user, skip_timeseries): descriptions = details['descriptions'] shifttimes = details['shifttimes'] timeranges = details['timeranges'] + labels = details['labels'] suites = details['suites'] auto_download = details['auto_download'] strictFileCheck = details.get('strictFileCheck', True) @@ -578,6 +587,7 @@ def load_yml_and_run(compare_yml, config_user, skip_timeseries): print(jobID, 'colour:',colours[jobID]) print(jobID, 'line thickness & style:',thicknesses[jobID], linestyles[jobID]) print(jobID, 'Shift time by', shifttimes[jobID]) + print(jobID, 'Label: ', labels[jobID]) print(jobID, 'Time range (None means all):', timeranges.get(jobID, None)) print(jobID, 'suite:', suites[jobID]) print(jobID, 'auto_download', auto_download[jobID]) @@ -620,6 +630,7 @@ def load_yml_and_run(compare_yml, config_user, skip_timeseries): analysisname=analysis_name, lineThicknesses=thicknesses, linestyles=linestyles, + labels=labels, config_user=config_user, ) diff --git a/bgcval2/analysis_timeseries.py b/bgcval2/analysis_timeseries.py index d063dfa8..e6aa75d0 100755 --- a/bgcval2/analysis_timeseries.py +++ b/bgcval2/analysis_timeseries.py @@ -297,6 +297,11 @@ def load_key_file(key, paths, jobID, strictFileCheck=True): output_dict['metrics'] = key_dict.get('metrics', metricList) output_dict['metrics'] = parse_list_from_string(output_dict['metrics']) + # Smoothings: + default_smoothings = ['DataOnly', ] + output_dict['smoothings'] = key_dict.get('smoothings', default_smoothings) + output_dict['smoothings'] = parse_list_from_string(output_dict['smoothings']) + # Load Grid: gridFile = key_dict.get('gridFile', paths.orcaGridfn) output_dict['gridFile'] = list_input_files(gridFile, key_dict, paths)[0] diff --git a/bgcval2/timeseries/timeseriesPlots.py b/bgcval2/timeseries/timeseriesPlots.py index 543849f4..aecaaca3 100644 --- a/bgcval2/timeseries/timeseriesPlots.py +++ b/bgcval2/timeseries/timeseriesPlots.py @@ -702,9 +702,10 @@ def multitimeseries( 'lime', ], plotStyle='Together', - lineStyle='', + smoothing='', thicknesses=defaultdict(lambda: 1), linestyles=defaultdict(lambda: '-'), + labels={}, ): if 0 in [len(timesD), len(list(timesD.keys()))]: return @@ -783,7 +784,8 @@ def multitimeseries( if np.min(arr) < ylims[0]: ylims[0] = np.min(arr) if np.max(arr) > ylims[1]: ylims[1] = np.max(arr) - if lineStyle.lower() in ['spline', 'all']: + label = labels.get(jobID, jobID) + if smoothing.lower() in ['spline', 'all']: tnew = np.linspace(times[0], times[-1], 60) arr_smooth = interpolate.spline(times, arr, tnew) pyplot.plot( @@ -792,10 +794,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID + ' spline', + label=label + ' spline', ) - if lineStyle.lower() in ['movingaverage', 'both', 'all']: + if smoothing.lower() in ['movingaverage', 'both', 'all']: if len(times) > 100.: window = 30 elif len(times) > 30.: window = 15 elif len(times) > 10.: window = 4 @@ -810,10 +812,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingaverage5', ]: window = 5 @@ -827,11 +829,11 @@ def multitimeseries( arr_new, c=colours[jobID], ls=linestyles[jobID], - label=jobID, + label=label, lw=thicknesses[jobID], ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingav1year', ]: arr_new = movingaverage_DT(arr, @@ -844,10 +846,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ - 'movingav5years', + if smoothing.lower() in [ + 'movingav5years', 'both5' ]: arr_new = movingaverage_DT(arr, times, @@ -859,11 +861,11 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ - 'movingav30years', + if smoothing.lower() in [ + 'movingav30years', 'both30' ]: pyplot.plot(times, arr, @@ -881,11 +883,11 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ - 'movingav100years', + if smoothing.lower() in [ + 'movingav100years', 'both100', ]: pyplot.plot(times, arr, @@ -903,10 +905,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingaverage12', ]: window = 12 @@ -921,10 +923,10 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=2., - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ 'movingaverage60', ]: window = 60 @@ -939,13 +941,14 @@ def multitimeseries( c=colours[jobID], ls=linestyles[jobID], lw=2., - label=jobID, + label=label, ) - if lineStyle.lower() in [ + if smoothing.lower() in [ '', 'both', 'all', + 'both5', 'both30', 'both100', ]: pyplot.plot(times, arr, @@ -953,14 +956,14 @@ def multitimeseries( ls=linestyles[jobID], lw=0.25) - if lineStyle.lower() in ['dataonly']: + if smoothing.lower() in ['dataonly']: pyplot.plot( times, arr, c=colours[jobID], ls=linestyles[jobID], lw=thicknesses[jobID], - label=jobID, + label=label, ) if type(data) == type(10.): diff --git a/key_files/amoc_26n.yml b/key_files/amoc_26n.yml index 5b77b064..2d99d7a3 100644 --- a/key_files/amoc_26n.yml +++ b/key_files/amoc_26n.yml @@ -13,3 +13,4 @@ model_convert: altmaskfile: $PATHS_BGCVAL2/bgcval2/data/basinlandmask_eORCA1.nc layers: layerless regions: regionless +smoothings: DataOnly both5 both30 movingav30years