plotmap: plot a map showing up to 5 fields with varied rendering
-----------------------------------------------------------------------------------------------------------------------------------
Plot a map showing any combination of various fields : one color-shaded, one by isolines, one vector field, and/or up to two pattern-shaded (hatched). It allows to tune various graphic attributes.
``Plotmap`` intends to replace operator ``plot``, albeit only for maps. Hence, its interface is quite compatible. Il also includes a novel interface.
It is implemented using module ``scripts/plotmap.py``, based on `Matplotlib `_ , `Cartopy `_ , and `GeoCat Viz `_
A :download:`dedicated notebook (Getting started with plotmap) <../../examples/Getting-started-with-plotmap.html>` allows to get started with its use. :download:`Another notebook (plotmapdemo) <../../examples/plotmapdemo.html>` includes more examples for each functionnality.
.. topic:: Table of contents:
- :ref:`Inputs `
- :ref:`Optional arguments `
- :ref:`General arguments`
- :ref:`Advanced general arguments`
- :ref:`Optional arguments common to all fields `
- Field specific arguments
- :ref:`Colored field `
- :ref:`Colored field and/or contoured field `
- :ref:`Contoured field `
- :ref:`Vectors `
- :ref:`Pattern-shaded fields `
- :ref:`Output `
- :ref:`Interface differences with plot `
- :ref:`Implementation `
.. _references:
**References**:
.. _provider:
**Provider / contact**: climaf at meteo dot fr
.. _inputs:
**Inputs** (in the order of CliMAF call):
- a dataset for a color-shaded field
- a dataset for a contoured field (shown by isolines)
- 2 datasets for the components of a vector field
- 1 or 2 datasets for scalar fields shown as pattern-shaded (or hatched)
Each input field is optional and can be replaced by an empty string (or simply neglected if there is no further input field to provide). Examples ::
>>> colored = ds(....)
>>> plotmap(colored, title='title')
>>> contoured = ds(....)
>>> plotmap('', contoured, title='title')
>>> patterned = ds(....)
>>> plotmap(colored, contoured, '', '', patterned, title='title')
>>> patterned2 = ds(....)
>>> plotmap('', '', '', '', patterned, patterned2, title='title')
.. _optional_arguments:
**Optional arguments**
.. _general_opt_args:
**General and basic arguments**:
- ``title``: string for graphic title; default: no title
- ``title_options`` : for tuning title and subtitle : a dict of additional arguments/values for the call to `GeoCat-viz function set_titles_and_labels `_; e.g. ``title_options = dict(lefttitlefontsize=18)``
- ``units`` : string for upper right corner; default is to use the CF metadata of the first provided field, if available
.. _proj:
- ``proj``: which geographic projection for the map. You can use :
- a label known to Cartopy, such as ``PlateCarree`` or ``Lambert``; see
`Cartopy's list `_. You may then wish to set ``proj_options`` (see below)
- "NH"/"SH" for northern/southern hemisphere polar stereographic (can be followed by the limiting
latitude of the map (e.g. "NH40" for a limiting latitude of 40 degrees)
- a string using the symbolic name of one of the input fields/dataset, among ``'colored'``, ``'contoured'``, ``'vectors'``, ``'shaded'``, ``'shade2'``; the geographic projection of that field will then be used for the map; there are also shortcuts : ``'clr', 'cnt', 'vec', 'shd', 'shd2'``
- the path for a NetCDF file which includes metadata describing the projection according to the `CF-convention `_; in that case, a value is not necessary for ``proj_options``
- default value is ``'PlateCarree'`` (`described here `_)
- ``proj_options``: a dict of arguments for the definition of the projection class, if needed, such as ``{ 'central_longitude' : 0}``. See relevant entry in `Cartopy's projections list `_. Default is to set ``central_longitude`` to 180 when ``proj`` has a default value
- ``focus``: set it to 'land' (resp. 'ocean') if you want to plot only on land (resp. ocean)
- ``format``: graphic output format, either 'show', 'png', 'pdf' or 'eps'; default: 'png'. Value 'show' means that matplotlib will open a window showing the plot, rather than creating an output file; this does not work when invoked from a notebook; also, you have to close the window for going on with CliMAF
- ``trim``: set it to False if you do not want to crop all the surrounding extra white space.
- ``dpi``: integer for ouput image resolution, in dots per inch
- ``resolution``: string for output image sizes
- if format is "png", this specifies the width and height of resultant image in pixels as e.g. 800x1200;
default: 1250x1250
- if format is "pdf" or "eps", the units is inches (default resolution is 100 dots per inch - dpi);
default : 8.5x11
- ``date``, ``time``, ``level``: for selecting date, time and/or level. These arguments apply on all fields which have time and/or level dimension (while another syntax allows to disctinct selection among the various input fields - see :ref:`field-specific arguments`). Set it to:
- for ``time`` and ``level``:
- an integer if you want to select an index (first index is 0),
- or a float if you want to select closest coordinate value. Warning: For ``time``, if the value has more than six digits, there is big rounding errors.
- for ``date``:
- a string in the format 'YYYY', 'YYYYMM', 'YYYY-MM', 'YYYYMMDD', 'YYYY-MM-DD' or 'YYYYMMDDHH' e.g.: ``date=1981-01-31`` .
- default: select first index for all dimensions but horizontal ones
Remark: ``time`` and ``date`` arguments are incompatible;
- ``xpolyline``, ``ypolyline``: for adding a polyline to the plot; set ``xpolyline`` and ``ypolyline`` to a list of
the same length containing the longitude and latitude coordinates of the polyline, respectively. Lists are
either Pyhton lists or strings with values separated by blanks. e.g.:
``xpolyline = "-90.0 -45.0 -45.0 -90.0 -90.0"``, ``ypolyline = [ 30.0, 30.0, 0.0, 0.0, 30.0]``.
Polylines are internally implemented using :ref:`plt_methods ` with method ``plot``
- ``polyline_options``: a dict of arguments for function `matplotlib.pyplot.plot `_, which applies to the
polyline. Example : ``dict(color='green', marker='o')``
.. _general_adv_args:
**General advanced arguments** : a number of advanced arguments allow to fine tune the calls to the geocat-viz, cartopy or matplotlib routines that build the plot :
- ``axis_methods``: allows to call methods of the `cartopy GeoAxes class `_. Syntax is a dict which keys are method names and values are arguments/values dicts. e.g. ``axis_methods={'add_feature': {'feature': 'LAND', 'facecolor': 'black', 'zorder': 1}}``.
Signaled methods are : annotate, add_feature, gridlines, coastlines, set_xticks, set_yticks.
In the case of method ``add_feature``, the feature name will be interpreted as a `cartopy.feature `_;
Method ``clabel`` (in matplotlib.axes.Axes) allows to label contours (see `axes.clabel doc `_); it uses a first argument (the contours set) which is automatically provided by plotmap
Also, using ``zorder=1`` allows to have the feature before the colored or contoured plot.
.. _plt_methods:
- ``plt_methods`` : allows to call methods of `matplolib.pyplot `_, with the same syntax as for ``axis_methods``. e.g. ``plt_methods={ 'text': {'x':-120, 'y': 45, 's': 'mytext', 'horizontalalignment': 'left'}}``
Method ``clabel`` (in matplotlib.pyplot) allows to label contours (see `pyplot.clabel doc `_); it uses a first argument (the contours set) which is automatically provided by plotmap
- ``gv_methods`` : allows to call `GeoCat-viz methods `_ . e.g. : ``gv_methods={'add_major_minor_ticks': { 'labelsize':'small', 'x_minor_per_major':2 } }``
- ``figure_options`` : allows to provide additional arguments to the figure `creation routine matplotlib.pyplot.figure `_
- ``savefig_options``: allows to provide additional arguments to the figure `write routine matplotlib.pyplot.savefig `_
.. _all_field_args:
**Optional arguments common to all fields** :
A number of arguments are available for all fields. Their name is built with a prefix for the field type, and a suffix for the argument type, e.g. ``colored_map_min`` is the argument name for the ``min`` for the colored map field.
There are shortcuts for prefixes and for argument types, e.g. ``clr`` for ``colored_map`` and ``n`` for ``min`` which allows for the argument shortcut ``clrn`` for ``colored_map_min``
Prefixes are : ``colored_map`` (``clr``), ``contours_map`` (``cnt``), ``vectors_map`` (``vec``), ``shaded_map`` (``shd``) and ``shade2_map`` (``shd2``)
The argument type suffixes are (with shortcut in parenthesis) :
- ``transform (t)``, ``transform_options (to)`` : which are the geographic projection and its details for the provided field data; if missing, plotmap will try to get it from data file metadata and will use ``PlateCarree`` as a default; for syntax details see :ref:`arguments proj and proj_options`; you may aso use keyword ``no_remap`` in order to ensure that no data re-mapping will take place (but you have then to ensure that the data uses the map geographic projection set by ``proj``)
- ``min (n)``, ``max (x)`` : minimum and maximum values to show; doesn't apply to vectors
- ``scale (s)``, ``offset (o)`` : for scaling the field (x -> x*scale + offset); ``offset`` doesn't apply to vectors
- ``selection_options (so)``: for driving the selection of data at given dimension values; you can actually invoke any method associated to the xarray DataArray, such a ``sel`` or ``isel``, and provide it with arguments in a dict such as ``{'sel' : {'time': '1850-02'}}``; default selection is driven by args ``level``, ``date`` and ``time`` (see above)
.. _main_field_opt_args:
**Colored field (first field)**:
That field is (by default) drawned by `Cartopy's contourf function `_, which basically calls `Maplotlib's contourf() `_
- colormap and its interpretation :
- ``color`` ( or ``cmap``, or ``colored_map_cmap``) : either :
- name of a `Ncl colormap `_
- the name of a `matplotlib colormap `_
- a list of `matplotlib color names or values `_ defining a custom color map. e.g. ``color = [ 'b', 'white' , 'black' , 'RoyalBlue' , 'LightSkyBlue' , 'PowderBlue' , (0.1, 0.2, 0.5) ]``. For compatibility with ``plot``, a string with color names separated by commas is also valid.
- default is Ncl's 'BlueDarkRed18'.
- and either :
- ``min``, ``max``, ``delta``: min and max values and levels when applying the colormap (prefix ``colored_map_`` for min and max is implicit)
- or ``levels`` (synonyms:``colors``, ``colored_map_levels``, ``clrl``): list of levels used when applying colormap e.g. ``colors="260 270 280 290"`` or ``colors=[260, 270, 280, 290]``
- default is ``contourf()`` default
- ``missing_value_color`` (synonym: mvc) : name of the color to use for representing the missing/_Fill value
- ``scale``, ``offset``: for scaling the colored map field (x -> x*scale + offset); default is no scaling
- ``print_time`` : set it to True in order to add data time in the upper left caption
- ``vcb``: a logical value for setting the colorbar vertical; default to True
- ``colorbar_options`` : a dict for arguments/values for routine `colorbar _`, which allows to finely tune colorbar rendering
- ``colored_map_engine`` (or ``clre``) : the Cartopy routine used for creating the colored map, defaut is ``'contourf'``, and you may choose ``'pcolormesh'``, which do not interpolate across grid cells, and which may be more robust for some cases (e.g. Nemo tri-polar grid)
- ``colored_map_engine_options`` (or ``clreo``) : additional arguments for the colored map engine routine
- ``colored_map_transform, colored_map_transform_options, colored_map_selection_options, colored_map_min, colored_map_max, colored_map_scale, colored_map_offset`` : see :ref:`the common arguments`
.. _main_and_aux_field_opt_args:
**Colored field and/or contoured field**:
- ``contours``:
- *If providing only a colored field:*
- set it to 1 if you want to draw contours which follow color filled contours, or
- set it to a list of levels used for drawing contours of the colored field at other levels; e.g. ``contours=[230, 240, 250]``
- *If providing both a colored field and a contoured field* only the contours of the latter are drawn :
- set it to a list of levels used when drawing contours of the contoured (second) field e.g. ``contours=[230, 240, 250]``; this is then a synonym for ``contours_map_levels``
- default : see matplotib.pyplot.contour
.. _aux_field_opt_args:
**Contoured field (second arg)**:
That field is (by default) drawned by `Cartopy's contour function`_, which basically calls `Maplotlib's contour() `_
- ``contours (contours_map_levels, cntl)`` : see just above
- ``contours_map_colors (cntc)`` : value is passed as argument ``color`` to `Cartopy's contour function `_ . Default value is ``'black'``.
- ``contours_map_engine_options`` (or ``cnteo``) : additional arguments for the contours engine routine
- ``contours_map_transform (cntt), contours_map_transform_options (cntto), contours_map_selection_options (cntso), contours_map_min (cntn), contours_map_max (cntx), contours_map_scale (cnts), contours_map_offset (cnto)`` : see :ref:`the common arguments`
- for labeling contours, use argument :ref:`plt_methods ` and method `clabel `_
.. _vectors_opt_args:
**Vectors field (3rd and 4th args)**:
- ``vectors_map_type (vecty)``: choose type of vector representation : by arrow (``'quiver'``, default) or by barbs (``'barbs'``), or by streamlines (``'streamplot'``)
- ``vectors_map_gridsizes (vecg)`` : allow to tune the number of arrows or barbs either along the x-axis by providing one integer value, or along both axes by providing a tuple of integers; in the first case, the value along y-axis is computed using the map aspect ratio
- ``vectors_map_options (veco)`` : can host additional arguments for the vectors rendering routine; refer to the documentation of the chosen function : `quiver for arrows `_, `barbs `_ or `streamplot `_. Example : ``veco={'color':'blue', 'headwidth':2.5, 'headlength':4}``
- ``vectors_map_transform (vect), vectors_map_transform_options (vecto), vectors_map_selection_options (vecso), vectors_map_scale (vecs)`` : see :ref:`the common arguments`
.. _shade_opt_args:
**Pattern-shaded (or hatched) fields (5th and/or 6th argument)**:
Arguments are the same for both fields, except that ``shaded`` should be changed to ``shade2`` for the next field.
- ``shaded_map_levels (shdl)`` : list of levels between which shading/hatching occurs, e.g. ``[210, 240, 270, 285, 300]``
- ``shaded_map_hatches (shdh)`` : hatching patterns list, which is reused circularly if needed (see `hatch style reference `_
- ``shaded_map_transform (shdt), shaded_map_transform_options (shdto), shaded_map_min (shdn), shaded_map_max (shdx), shaded_map_scale (shds), shaded_map_offset (shdo)`` : : see :ref:`the common arguments`
.. _plotmap_outputs:
**Outputs** :
- main output: a PNG or PDF or EPS figure, except if ``show`` is True
.. _differences_with_plot:
**Interface differences with plot** :
Here are the main differences for some arguments which are common with ``plot`` :
- positionnal arguments (which represent datasets) : they are not exactly the same : pattern-shaded datasets/fields are located after vector component fields, and so clearly separated from contoured dataset/field
- xpolyline and ypolyline lists of coordinates : when using the string syntax, separator is blank, not comma + blank
- vector datasets/fields: rotation is not yet supported
.. _implementation:
**Implementation**: Underlying script plotmap.py uses matplotlib, cartopy and geocat-viz libraries.