Mercurial > repos > climate > psy_maps
diff psymap_simple.py @ 1:706666d912d5 draft
"planemo upload for repository https://github.com/NordicESMhub/galaxy-tools/tree/master/tools/psy-maps commit 4803d769c7b0b37fa80c69bd7327f6789cd3c6bf"
author | climate |
---|---|
date | Sat, 05 Oct 2019 17:11:18 -0400 |
parents | db8d76da4174 |
children | e6d1e9d6b399 |
line wrap: on
line diff
--- a/psymap_simple.py Thu Apr 25 18:11:49 2019 -0400 +++ b/psymap_simple.py Sat Oct 05 17:11:18 2019 -0400 @@ -17,6 +17,11 @@ # --proj PROJ Specify the projection on which we draw # --cmap CMAP Specify which colormap to use for plotting # --output OUTPUT output filename to store resulting image (png format) +# --time TIMES time index from the file for multiple plots ("0 1 2 3") +# --nrow NROW number of rows for multiple plot grid +# --ncol NCOL number of columns for multiple plot grid +# --format date format such as %Y (for year) %B (for month), etc. +# --title plot or subplot title # -v, --verbose switch on verbose mode # @@ -29,16 +34,34 @@ from matplotlib import pyplot # noqa: I202,E402 import psyplot.project as psy # noqa: I202,E402 +from psyplot import rcParams # noqa: I202,E402 class PsyPlot (): - def __init__(self, input, proj, varname, cmap, output, - verbose=False - ): + def __init__(self, input, proj, varname, cmap, output, verbose=False, + time=[], nrow=1, ncol=1, format="%B %e, %Y", + title=""): self.input = input self.proj = proj self.varname = varname self.cmap = cmap + self.time = time + if format is None: + self.format = "" + else: + self.format = format.replace('X', '%') + if title is None: + self.title = "" + else: + self.title = title + if ncol is None: + self.ncol = 1 + else: + self.ncol = int(ncol) + if nrow is None: + self.nrow = 1 + else: + self.nrow = int(nrow) if output is None: self.output = Path(input).stem + '.png' else: @@ -49,37 +72,101 @@ print("proj: ", self.proj) print("varname: ", self.varname) print("cmap: ", self.cmap) + print("time: ", self.time) + print("ncol: ", self.ncol) + print("nrow: ", self.nrow) + print("title: ", self.title) + print("date format: ", self.format) print("output: ", self.output) def plot(self): + if self.title and self.format: + title = self.title + "\n" + self.format + elif not self.title and self.format: + title = self.format + elif self.title and not self.format: + title = self.title + else: + title = '%(long_name)s' + if self.cmap is None and self.proj is None: - print("op1") psy.plot.mapplot(self.input, name=self.varname, + title=title, clabel='{desc}') - elif self.proj is None or self.proj == '': - print("op2") + elif self.proj is None or not self.proj: psy.plot.mapplot(self.input, name=self.varname, + title=title, cmap=self.cmap, clabel='{desc}') - elif self.cmap is None or self.cmap == '': - print("op3") + elif self.cmap is None or not self.cmap: psy.plot.mapplot(self.input, name=self.varname, projection=self.proj, + title=title, clabel='{desc}') else: - print("op4") psy.plot.mapplot(self.input, name=self.varname, cmap=self.cmap, projection=self.proj, + title=title, clabel='{desc}') pyplot.savefig(self.output) + def multiple_plot(self): + if not self.format: + self.format = "%B %e, %Y" -def psymap_plot(input, proj, varname, cmap, output, verbose): + if not self.title: + title = self.format + else: + title = self.title + "\n" + self.format + mpl.rcParams['figure.figsize'] = [20, 8] + mpl.rcParams.update({'font.size': 8}) + rcParams.update({'plotter.maps.grid_labelsize': 8.0}) + if self.cmap is None and self.proj is None: + m = psy.plot.mapplot(self.input, name=self.varname, + title=title, + ax=(self.nrow, self.ncol), + time=self.time, sort=['time'], + clabel='{desc}') + m.share(keys='bounds') + elif self.proj is None or not self.proj: + m = psy.plot.mapplot(self.input, name=self.varname, + title=title, + ax=(self.nrow, self.ncol), + time=self.time, sort=['time'], + cmap=self.cmap, clabel='{desc}') + m.share(keys='bounds') + elif self.cmap is None or not self.cmap: + m = psy.plot.mapplot(self.input, name=self.varname, + projection=self.proj, + ax=(self.nrow, self.ncol), + time=self.time, sort=['time'], + title=title, + clabel='{desc}') + m.share(keys='bounds') + else: + m = psy.plot.mapplot(self.input, name=self.varname, + cmap=self.cmap, + projection=self.proj, + ax=(self.nrow, self.ncol), + time=self.time, sort=['time'], + title=title, + clabel='{desc}') + m.share(keys='bounds') + + pyplot.savefig(self.output) + + +def psymap_plot(input, proj, varname, cmap, output, verbose, time, + nrow, ncol, format, title): """Generate plot from input filename""" - p = PsyPlot(input, proj, varname, cmap, output, verbose) - p.plot() + p = PsyPlot(input, proj, varname, cmap, output, verbose, time, + nrow, ncol, format, title) + if len(time) == 0: + p.plot() + else: + p.multiple_plot() if __name__ == '__main__': @@ -107,10 +194,35 @@ help='output filename to store resulting image (png format)' ) parser.add_argument( + '--time', + help='list of times to plot for multiple plots' + ) + parser.add_argument( + '--format', + help='format for date/time (default is Month d, yyyy)' + ) + parser.add_argument( + '--title', + help='plot title' + ) + parser.add_argument( + '--ncol', + help='number of columns for multiple plots' + ) + parser.add_argument( + '--nrow', + help='number of rows for multiple plots' + ) + parser.add_argument( "-v", "--verbose", help="switch on verbose mode", action="store_true") args = parser.parse_args() + if args.time is None: + time = [] + else: + time = list(map(int, args.time.split(","))) psymap_plot(args.input, args.proj, args.varname, args.cmap, - args.output, args.verbose) + args.output, args.verbose, time, + args.nrow, args.ncol, args.format, args.title)