diff climate_stripes.py @ 0:fec3147b0206 draft

"planemo upload for repository https://github.com/NordicESMhub/galaxy-tools/tree/master/tools/climate-stripes commit aa08ea46712c1cfbaac2e6fcd07c93097751cad3"
author climate
date Sat, 05 Oct 2019 17:03:08 -0400
parents
children c6f2435d680b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/climate_stripes.py	Sat Oct 05 17:03:08 2019 -0400
@@ -0,0 +1,152 @@
+#!/usr/bin/env python3
+#
+#
+# usage: climate_stripes.py [-h] [--cmap CMAP]
+#                           [--output OUTPUT]
+#                           [--xname XNAME]
+#                           [--format_plot FORMAT_PLOT]
+#                           [--format_date FORMAT_DATE]
+#                           [--title TITLE]
+#                           [--nxsplit NXSPLIT]
+#                          input varname
+#
+# positional arguments:
+#   input                 input filename with timeseries (tabular format)
+#   varname               column name to use for plotting (case sensitive)
+#
+# optional arguments:
+#   -h, --help            show this help message and exit
+#   --cmap CMAP           Specify which colormap to use for plotting
+#   --output OUTPUT       output filename to store resulting image (png format)
+#   --xname XNAME         column name to use for x-axis
+#   --format_plot FORMAT_PLOT
+#                         format for plotting dates on the x-axis
+#   --format_date FORMAT_DATE
+#                         format for input date/time column
+#   --title TITLE         plot title
+#   --nxsplit NXSPLIT     number of ticks on the x-axis
+#
+
+import argparse
+import warnings
+
+import matplotlib as mpl
+mpl.use('Agg')
+
+import matplotlib.pyplot as plt   # noqa: I202,E402
+
+import numpy as np  # noqa: I202,E402
+
+import pandas as pd  # noqa: I202,E402
+
+
+class Stripes ():
+    def __init__(self, input, valname, cmap, output, xname="",
+                 date_format='%Y%m',
+                 plot_format='%Y',
+                 nxsplit=10,
+                 title=""):
+        self.input = input
+        self.valname = valname
+        self.xname = xname
+        if not nxsplit:
+            self.nxsplit = 10
+        else:
+            self.nxsplit = nxsplit
+        if not cmap:
+            self.cmap = 'RdBu_r'
+        else:
+            self.cmap = cmap
+        if not output:
+            self.output = "stripes.png"
+        else:
+            self.output = output
+        self.title = title
+        if not date_format:
+            self.format = '%Y%m'
+        else:
+            self.format = date_format.replace('X', '%')
+        if not plot_format:
+            self.plot_format = self.format
+        else:
+            self.plot_format = plot_format.replace('X', '%')
+
+    def read_data(self):
+        self.data = pd.read_csv(self.input, sep='\t')
+
+    def create_stripes(self):
+        data = np.zeros((2, self.data[self.valname].shape[0]), dtype='float')
+        data[:] = np.NaN
+        data[0, :] = self.data[self.valname]
+        data[1, :] = self.data[self.valname]
+        fig = plt.figure(figsize=(10, 2))
+        ax = plt.subplot(111)
+        plt.pcolor(data, cmap=self.cmap,
+                   vmin=self.data[self.valname].min(),
+                   vmax=self.data[self.valname].max())
+        if self.title:
+            plt.title(self.title)
+        if self.xname:
+            nrange = self.data.index.values
+            n = int(np.floor((nrange.max() - nrange.min())/int(self.nxsplit)))
+            date_list = self.data[self.xname].loc[::n].apply(
+                             lambda x: pd.to_datetime(str(x),
+                                                      format=self.format))
+            date_list = [i.strftime(self.plot_format) for i in date_list]
+            nval = int(self.data[self.xname].loc[::n].shape[0])
+            ax.xaxis.set_major_locator(plt.MaxNLocator(nval))
+            ax.xaxis.set_ticklabels(date_list)
+            ax.xaxis.set_tick_params(rotation=45)
+        else:
+            ax.set_xticks([])
+        ax.set_yticks([])
+        fig.tight_layout()
+        fig.savefig(self.output)
+
+
+if __name__ == '__main__':
+    warnings.filterwarnings("ignore")
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        'input',
+        help='input filename with geographical coordinates (netCDF format)'
+    )
+    parser.add_argument(
+        'varname',
+        help='column name to use for plotting (case sensitive)'
+    )
+    parser.add_argument(
+        '--cmap',
+        help='Specify which colormap to use for plotting'
+    )
+    parser.add_argument(
+        '--output',
+        help='output filename to store resulting image (png format)'
+    )
+    parser.add_argument(
+        '--xname',
+        help='column name to use for x-axis'
+    )
+    parser.add_argument(
+        '--format_plot',
+        help='format for plotting dates on the x-axis'
+    )
+    parser.add_argument(
+        '--format_date',
+        help='format for input date/time column (default is Month d, yyyy)'
+    )
+    parser.add_argument(
+        '--title',
+        help='plot title'
+    )
+    parser.add_argument(
+        '--nxsplit',
+        help='number of ticks on the x-axis'
+    )
+    args = parser.parse_args()
+    stripes = Stripes(args.input, args.varname, args.cmap, args.output,
+                      xname=args.xname, date_format=args.format_date,
+                      plot_format=args.format_plot, title=args.title,
+                      nxsplit=args.nxsplit)
+    stripes.read_data()
+    stripes.create_stripes()