"""
GMT Plotter
-----------
GMTPlotter forms a loose wrapper around ``gmt.Figure`` object, that constructs plots from embedded gmt options inside ``nc5ng`` objects (meta-api, ``object.gmt_meta``)
.. autoclass:: GMTPlotter
:members:
"""
from numpy import array
from .options import GMTOptions, PLOT_OPTS
[docs]class GMTPlotter(object):
"""GMTPlotter
Wrapper for GMT/Python Plotter
"""
@property
def figure(self):
return getattr(self, '_figure', None)
def __init__(self, base_plot_options=PLOT_OPTS['default']):
import gmt
self._figure = gmt.Figure()
self.gmt_meta = base_plot_options
def plot(self, *args, **kwargs):
self.figure.plot(*args, **kwargs)
def show(self, *args, **kwargs):
self.figure.show(*args, **kwargs)
[docs] @staticmethod
def plot_conversion(conversion, coverage='all', vector='all', plotter=None, **kwargs):
""" Static Method to Plot an ``nc5ng.nc5data.Conversion``
Plotting options are Applied in the order
1. GMTPlotter configured or default options
2. Conversion configured options ``Conversion.gmt_meta``
3. Data Set Options ``PointData.gmt_meta``
4. Keyword overrides (full option name)
5. Keyowrd overrides (single letter GMT Style arguments)
:param conversion: Conversion data
:param coverage: Coverage files (no file extension), to plot.
Can be list of names (``coverage = ['cvacdlat','cvacdlon',]``), single file name (``coverage = 'cvacdlat'``), ``None``, or ``'all'``
:param vector: Vector files (no file extension) to plot. Can be list of names, single file name, ``None``, or ``'all'``.
:param plotter: plotter to use, if ``None`` one will be created and returned
"""
if plotter is None:
plotter = GMTPlotter()
if (coverage == 'all'):
cpoints = [_pointstore,]
elif not(coverage):
cpoints = []
elif coverage[0] == 'c' and coverage in conversion.output_data:
cpoints = [conversion.output_data[coverage],]
else:
cpoints = []
for c in coverage:
cpoints.append(conversion.output_data[c])
if (vector == 'all'):
vpoints = [_vectorstore,]
elif not(vector):
vpoints = []
elif vector[0] == 'v' and vector in conversion.output_data:
vpoints = [conversion.output_data[vector],]
else:
vpoints = []
for c in vector:
vpoints.append(conversion.output_data[c])
plotter.__base__(conversion, **kwargs)
plotter.__coast__(conversion, **kwargs)
plotter.__plot__(conversion, *cpoints, symbol="p4p",**kwargs)
plotter.__plot__(conversion, *vpoints, symbol="v", **kwargs)
plotter.show()
return plotter
def __base__(self, conversion, **kwargs):
# Apply conversion options onto base options with any explicit keywords
opts = self.gmt_meta(**conversion.gmt_meta)(**kwargs).basemap
# passthrough shorthand we assume people know what they are doing
_filter_base_kwargs = { x:y for x,y in kwargs.items() if x in GMTOptions.BASEMAP_FILTER_OUT}
opts.update(_filter_base_kwargs)
print (_filter_base_kwargs, opts, conversion.gmt_meta)
#execute the command
self.figure.basemap(**opts)
def __coast__(self, conversion, **kwargs):
# Apply conversion options onto base options with any explicit keywords
opts = self.gmt_meta(**conversion.gmt_meta)(**kwargs).coast
# passthrough shorthand we assume people know what they are doing
_filter_base_kwargs = { x:y for x,y in kwargs.items() if x in GMTOptions.COAST_FILTER_OUT}
opts.update(_filter_base_kwargs)
print (_filter_base_kwargs, opts, conversion.gmt_meta)
#execute the command
self.figure.coast(**opts)
def __plot__(self, conversion, *points,**kwargs):
# Apply conversion options onto base options with any explicit keywords
opts = self.gmt_meta(**conversion.gmt_meta)(**kwargs).plot
# passthrough shorthand we assume people know what they are doing
_filter_base_kwargs = { x:y for x,y in kwargs.items() if x in GMTOptions.PLOT_FILTER_OUT}
opts.update(_filter_base_kwargs)
print (_filter_base_kwargs, opts, conversion.gmt_meta)
#execute the command
for point_set in points:
self.figure.plot(data = point_set.plot_data, **opts)