From e3c296f8c9782adc59aaa29223c7b0f892448185 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Tue, 14 Jul 2020 13:49:15 +0100 Subject: [PATCH 01/48] add new velo function --- doc/api/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/api/index.rst b/doc/api/index.rst index 467e88de8cc..b82047cd854 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -35,6 +35,7 @@ Plotting data and laying out the map: Figure.image Figure.shift_origin Figure.text + Figure.velo Color palette table generation: From c6e34765b46ec1150b7c0541d6bcd5b013cd9e2c Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Tue, 14 Jul 2020 13:49:45 +0100 Subject: [PATCH 02/48] create new velo function --- pygmt/base_plotting.py | 194 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index a9ca7dd26b8..baca80e959e 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -440,6 +440,200 @@ def grdview(self, grid, **kwargs): arg_str = " ".join([fname, build_arg_string(kwargs)]) lib.call_module("grdview", arg_str) + @fmt_docstring + @use_alias( + R="region", J="projection", B="frame", C="cmap", U="timestamp", + ) + @kwargs_to_strings(R="sequence", i="sequence_comma") + def velo(self, x=None, y=None, data=None, scaling=None, **kwargs): + """ + Plot velocity vectors, crosses, and wedges + + Reads data values from files [or standard input] and will plot velocity + arrows on a map. Most options are the same as for plot, except -S. + + Must provide either *data* or *x* and *y*, and *scaling*. + + + Full option list at :gmt-docs:`supplements/geodesy/velo.html` + + {aliases} + + Parameters + ---------- + x/y : float or 1d arrays + The x and y coordinates, or arrays of x and y coordinates of the + data points + data : str or 2d array + Either a data file name or a 2d numpy array with the tabular data. + Use option *columns* (i) to choose which columns are x, y, color, + and size, respectively. + + {J} + + {R} + + scaling: str + Selects the meaning of the columns in the data file and the figure + to be plotted. In all cases, the scales are in data units per length + unit and sizes are in length units (default length unit is + controlled by `PROJ_LENGTH_UNIT `_ + unless **c**, **i** , or **p** is appended). + + "**-Se**\ *velscale/confidence*\ [\ **+f**\ font]" + + Velocity ellipses in (N,E) convention. velscale sets the + scaling of the velocity arrows. The confidence sets the + 2-dimensional confidence limit for the ellipse, e.g., 0.95 for + 95% confidence ellipse. font sets the font and size of the text + [9p,Helvetica,black]. The ellipse will be filled with the color + or shade specified by the -G option [default transparent]. + The arrow and the circumference of the ellipse will be drawn + with the pen attributes specified by the -W option. Parameters + are expected to be in the following columns: + + **1,2**: longitude, latitude of station (-: option interchanges + order) **3,4**: eastward, northward velocity (-: option + interchanges order) **5,6**: uncertainty of eastward, northward + velocities (1-sigma) (-: option interchanges order) + **7**: correlation between eastward and northward components + **8**: name of station (optional). + + "**-Sn**\ *barscale*" + + Anisotropy bars. barscale sets the scaling of the bars. + Parameters are expected to be in the following columns: + **1,2** : longitude, latitude of station (-: option interchanges + order) **3,4** : eastward, northward components of anisotropy + vector (-: option interchanges order) + + "**-Sr**\ *velscale/confidence*\ [\ **+f**\ font]" + + Velocity ellipses in rotated convention. velscale sets the + scaling of the velocity arrows. The confidence sets the + 2-dimensional confidence limit for the ellipse, e.g., 0.95 for + 95% confidence ellipse. font sets the font and size of the text + [9p,Helvetica,black]. The ellipse will be filled with the color + or shade specified by the -G option [default transparent]. + The arrow and the circumference of the ellipse will be drawn + with the pen attributes specified by the -W option. Parameters + are expected to be in the following columns: + **1,2**: longitude, latitude, of station (-: option interchanges + order) **3,4**: eastward, northward velocity (-: option + interchanges order) **5,6**: semi-major, semi-minor axes + **7**: counter-clockwise angle, in degrees, from horizontal + axis to major axis of ellipse. 8: name of station (optional) + + "**-Sw**\ *wedgescale/wedgemag*" + + Rotational wedges. wedgescale sets the size of the wedges. + Values are multiplied by wedgemag before plotting. For example, + setting wedgemag to 1.e7 works well for rotations of the order + of 100 nanoradians/yr. Use **-G** to set the fill color or shade + for the wedge, and **-E** to set the color or shade for the + uncertainty. Parameters are expected to be in the + following columns: + **1,2**: longitude, latitude, of station (-: option + interchanges order) **3**: rotation in radians **4**: rotation + uncertainty in radians + + "**-Sx**\ *cross_scale*" + + gives Strain crosses. cross_scale sets the size of the cross. + Parameters are expected to be in the following columns: + **1,2**: longitude, latitude, of station + (-: option interchanges order) 3: eps1, the most extensional + eigenvalue of strain tensor, with extension taken positive. + **4**: eps2, the most compressional eigenvalue of strain + tensor, with extension taken positive. + **5**: azimuth of eps2 in degrees CW from North. + + + Other Parameters + ---------------- + -A : bool or str + Modify vector parameters. For vector heads, append vector head size + [Default is 9p]. See `Vector Attributes `_ + for specifying additional attributes. + + {B} + + {CPT} + + -D : str + can be used to rescale the uncertainties of velocities + (-Se and -Sr) and rotations (-Sw). + Can be combined with the confidence variable. + + -E : str + Sets the color or shade used for filling uncertainty wedges + (-Sw) or velocity error ellipses (-Se or -Sr). [If -E is not + specified, the uncertainty regions will be transparent.] + `(more ...) `_ + + -G : str + Select color or pattern for filling of symbols or polygons + [Default is no fill]. `(more ...) `_ + + -L: str + Draw lines. Ellipses and fault planes will have their outlines drawn + using current pen (see -W). + + -N: str + Do NOT skip symbols that fall outside the frame boundary specified + by -R. [Default plots symbols inside frame only]. + + {U} + + -W: str + Set pen attributes for velocity arrows, ellipse circumference and + ault plane edges. [Defaults: width = default, color = black, style = solid]. + + -X: str + ``'[a|c|f|r][xshift]'`` + + -Y: str + ``'[a|c|f|r][yshift]'`` + Shift plot origin. `(more ...) `_ + + + """ + kwargs = self._preprocess(**kwargs) + + kind = data_kind(data, x, y) + + extra_arrays = [] + if "S" in kwargs and kwargs["S"][0] in "vV" and direction is not None: + extra_arrays.extend(direction) + if "G" in kwargs and not isinstance(kwargs["G"], str): + if kind != "vectors": + raise GMTInvalidInput( + "Can't use arrays for color if data is matrix or file." + ) + extra_arrays.append(kwargs["G"]) + del kwargs["G"] + if sizes is not None: + if kind != "vectors": + raise GMTInvalidInput( + "Can't use arrays for sizes if data is matrix or file." + ) + extra_arrays.append(sizes) + + with Session() as lib: + # Choose how data will be passed in to the module + if kind == "file": + file_context = dummy_context(data) + elif kind == "matrix": + file_context = lib.virtualfile_from_matrix(data) + elif kind == "vectors": + file_context = lib.virtualfile_from_vectors( + np.atleast_1d(x), np.atleast_1d(y), *extra_arrays + ) + + with file_context as fname: + arg_str = " ".join([fname, build_arg_string(kwargs)]) + lib.call_module("velo", arg_str) + @fmt_docstring @use_alias( R="region", From c2b951c2eaca4b04cd3822a774f3d124a7ab33b6 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Tue, 14 Jul 2020 14:00:09 +0100 Subject: [PATCH 03/48] format alias --- pygmt/base_plotting.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index baca80e959e..ab81c718d7b 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -442,7 +442,11 @@ def grdview(self, grid, **kwargs): @fmt_docstring @use_alias( - R="region", J="projection", B="frame", C="cmap", U="timestamp", + R="region", + J="projection", + B="frame", + C="cmap", + U="timestamp", ) @kwargs_to_strings(R="sequence", i="sequence_comma") def velo(self, x=None, y=None, data=None, scaling=None, **kwargs): From 1cf7967a52de48703677250cb4b5d55c2c100286 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Tue, 14 Jul 2020 15:10:49 +0100 Subject: [PATCH 04/48] clarify the type of data input --- pygmt/base_plotting.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index ab81c718d7b..516c1d6daaf 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -449,14 +449,14 @@ def grdview(self, grid, **kwargs): U="timestamp", ) @kwargs_to_strings(R="sequence", i="sequence_comma") - def velo(self, x=None, y=None, data=None, scaling=None, **kwargs): + def velo(self, data=None, scaling=None, **kwargs): """ Plot velocity vectors, crosses, and wedges - Reads data values from files [or standard input] and will plot velocity + Reads data values from files, numpy array or panda dataframe and will plot velocity arrows on a map. Most options are the same as for plot, except -S. - Must provide either *data* or *x* and *y*, and *scaling*. + Must provide *data* and *scaling*. Full option list at :gmt-docs:`supplements/geodesy/velo.html` @@ -465,13 +465,8 @@ def velo(self, x=None, y=None, data=None, scaling=None, **kwargs): Parameters ---------- - x/y : float or 1d arrays - The x and y coordinates, or arrays of x and y coordinates of the - data points - data : str or 2d array - Either a data file name or a 2d numpy array with the tabular data. - Use option *columns* (i) to choose which columns are x, y, color, - and size, respectively. + data : str or 2d array or dataframe + Either a data file name, a 2d numpy array or a panda dataframe. {J} From fc7bec8a28087925d081fbcd7b5a66044937cbcf Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Tue, 14 Jul 2020 15:36:50 +0100 Subject: [PATCH 05/48] remove reference to vector x, y (not of use anymore) --- pygmt/base_plotting.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 516c1d6daaf..8e5f5a451f3 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -599,7 +599,7 @@ def velo(self, data=None, scaling=None, **kwargs): """ kwargs = self._preprocess(**kwargs) - kind = data_kind(data, x, y) + kind = data_kind(data) extra_arrays = [] if "S" in kwargs and kwargs["S"][0] in "vV" and direction is not None: @@ -624,10 +624,6 @@ def velo(self, data=None, scaling=None, **kwargs): file_context = dummy_context(data) elif kind == "matrix": file_context = lib.virtualfile_from_matrix(data) - elif kind == "vectors": - file_context = lib.virtualfile_from_vectors( - np.atleast_1d(x), np.atleast_1d(y), *extra_arrays - ) with file_context as fname: arg_str = " ".join([fname, build_arg_string(kwargs)]) From 7b905d7357672c065972d021110c7a233b87d202 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Tue, 14 Jul 2020 15:39:20 +0100 Subject: [PATCH 06/48] clear code from reference to variable sizes and direction --- pygmt/base_plotting.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 8e5f5a451f3..e8a312d74de 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -602,8 +602,6 @@ def velo(self, data=None, scaling=None, **kwargs): kind = data_kind(data) extra_arrays = [] - if "S" in kwargs and kwargs["S"][0] in "vV" and direction is not None: - extra_arrays.extend(direction) if "G" in kwargs and not isinstance(kwargs["G"], str): if kind != "vectors": raise GMTInvalidInput( @@ -611,12 +609,6 @@ def velo(self, data=None, scaling=None, **kwargs): ) extra_arrays.append(kwargs["G"]) del kwargs["G"] - if sizes is not None: - if kind != "vectors": - raise GMTInvalidInput( - "Can't use arrays for sizes if data is matrix or file." - ) - extra_arrays.append(sizes) with Session() as lib: # Choose how data will be passed in to the module From 1fcf08964047175eceb30ad5bbf6bd7af2e503e7 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Thu, 5 Nov 2020 14:50:41 +0000 Subject: [PATCH 07/48] start with test --- .../baseline/test_velo_pandas_dataframe.png | Bin 0 -> 40277 bytes pygmt/tests/test_velo.py | 40 ++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 pygmt/tests/baseline/test_velo_pandas_dataframe.png create mode 100644 pygmt/tests/test_velo.py diff --git a/pygmt/tests/baseline/test_velo_pandas_dataframe.png b/pygmt/tests/baseline/test_velo_pandas_dataframe.png new file mode 100644 index 0000000000000000000000000000000000000000..c68c191cfe62a015f51931a352c2cd7817e341c7 GIT binary patch literal 40277 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 jMBTB}d)}+J Date: Thu, 5 Nov 2020 15:00:01 +0000 Subject: [PATCH 08/48] fix raw string --- pygmt/base_plotting.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index e8a312d74de..31f82444533 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -479,7 +479,7 @@ def velo(self, data=None, scaling=None, **kwargs): controlled by `PROJ_LENGTH_UNIT `_ unless **c**, **i** , or **p** is appended). - "**-Se**\ *velscale/confidence*\ [\ **+f**\ font]" + r"**e**\ *velscale/confidence*\ [\ **+f**\ font]" Velocity ellipses in (N,E) convention. velscale sets the scaling of the velocity arrows. The confidence sets the @@ -498,7 +498,7 @@ def velo(self, data=None, scaling=None, **kwargs): **7**: correlation between eastward and northward components **8**: name of station (optional). - "**-Sn**\ *barscale*" + r"**n**\ *barscale*" Anisotropy bars. barscale sets the scaling of the bars. Parameters are expected to be in the following columns: @@ -506,7 +506,7 @@ def velo(self, data=None, scaling=None, **kwargs): order) **3,4** : eastward, northward components of anisotropy vector (-: option interchanges order) - "**-Sr**\ *velscale/confidence*\ [\ **+f**\ font]" + r"**r**\ *velscale/confidence*\ [\ **+f**\ font]" Velocity ellipses in rotated convention. velscale sets the scaling of the velocity arrows. The confidence sets the @@ -523,7 +523,7 @@ def velo(self, data=None, scaling=None, **kwargs): **7**: counter-clockwise angle, in degrees, from horizontal axis to major axis of ellipse. 8: name of station (optional) - "**-Sw**\ *wedgescale/wedgemag*" + r"**w**\ *wedgescale/wedgemag*" Rotational wedges. wedgescale sets the size of the wedges. Values are multiplied by wedgemag before plotting. For example, @@ -536,7 +536,7 @@ def velo(self, data=None, scaling=None, **kwargs): interchanges order) **3**: rotation in radians **4**: rotation uncertainty in radians - "**-Sx**\ *cross_scale*" + r"**x**\ *cross_scale*" gives Strain crosses. cross_scale sets the size of the cross. Parameters are expected to be in the following columns: From fd6e421b3f9e26f2f5b98339516497f4f0f437d0 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Thu, 5 Nov 2020 16:43:26 +0000 Subject: [PATCH 09/48] clarify aliases and edit test --- pygmt/base_plotting.py | 49 +++++++++++++++++++++++++--------------- pygmt/tests/test_velo.py | 12 +++++----- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 3148b77484a..08a032d9f3b 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1921,11 +1921,22 @@ def update_pointers(data_pointers): @fmt_docstring @use_alias( - R="region", - J="projection", + A="vector", B="frame", C="cmap", + D="rescale", + E="uncertainty_color", + G="facecolor", + J="projection", + L="line", + N="no_clip", + R="region", + S="scaling", U="timestamp", + V="verbose", + W="pen", + X="xshift", + Y="yshift", ) @kwargs_to_strings(R="sequence", i="sequence_comma") def velo(self, data=None, scaling=None, **kwargs): @@ -1958,7 +1969,7 @@ def velo(self, data=None, scaling=None, **kwargs): controlled by `PROJ_LENGTH_UNIT `_ unless **c**, **i** , or **p** is appended). - r"**e**\ *velscale/confidence*\ [\ **+f**\ font]" + "**e**\\ *velscale/confidence*\\ [\\ **+f**\\ font]" Velocity ellipses in (N,E) convention. velscale sets the scaling of the velocity arrows. The confidence sets the @@ -1977,7 +1988,7 @@ def velo(self, data=None, scaling=None, **kwargs): **7**: correlation between eastward and northward components **8**: name of station (optional). - r"**n**\ *barscale*" + "**n**\\ *barscale*" Anisotropy bars. barscale sets the scaling of the bars. Parameters are expected to be in the following columns: @@ -1985,7 +1996,7 @@ def velo(self, data=None, scaling=None, **kwargs): order) **3,4** : eastward, northward components of anisotropy vector (-: option interchanges order) - r"**r**\ *velscale/confidence*\ [\ **+f**\ font]" + "**r**\\ *velscale/confidence*\\ [\\ **+f**\\ font]" Velocity ellipses in rotated convention. velscale sets the scaling of the velocity arrows. The confidence sets the @@ -2002,7 +2013,7 @@ def velo(self, data=None, scaling=None, **kwargs): **7**: counter-clockwise angle, in degrees, from horizontal axis to major axis of ellipse. 8: name of station (optional) - r"**w**\ *wedgescale/wedgemag*" + "**w**\\ *wedgescale/wedgemag*" Rotational wedges. wedgescale sets the size of the wedges. Values are multiplied by wedgemag before plotting. For example, @@ -2015,7 +2026,7 @@ def velo(self, data=None, scaling=None, **kwargs): interchanges order) **3**: rotation in radians **4**: rotation uncertainty in radians - r"**x**\ *cross_scale*" + "**x**\\ *cross_scale*" gives Strain crosses. cross_scale sets the size of the cross. Parameters are expected to be in the following columns: @@ -2029,7 +2040,7 @@ def velo(self, data=None, scaling=None, **kwargs): Other Parameters ---------------- - -A : bool or str + vector : bool or str Modify vector parameters. For vector heads, append vector head size [Default is 9p]. See `Vector Attributes `_ for specifying additional attributes. @@ -2038,39 +2049,41 @@ def velo(self, data=None, scaling=None, **kwargs): {CPT} - -D : str + rescale : str can be used to rescale the uncertainties of velocities (-Se and -Sr) and rotations (-Sw). Can be combined with the confidence variable. - -E : str + uncertainty_color : str Sets the color or shade used for filling uncertainty wedges (-Sw) or velocity error ellipses (-Se or -Sr). [If -E is not specified, the uncertainty regions will be transparent.] `(more ...) `_ - -G : str + facecolor : str Select color or pattern for filling of symbols or polygons [Default is no fill]. `(more ...) `_ - -L: str + line: str Draw lines. Ellipses and fault planes will have their outlines drawn using current pen (see -W). - -N: str + no_clip: str Do NOT skip symbols that fall outside the frame boundary specified by -R. [Default plots symbols inside frame only]. + pen : str + Set pen attributes for velocity arrows, ellipse circumference and + fault plane edges. [Defaults: width = default, color = black, style = solid]. + {U} - -W: str - Set pen attributes for velocity arrows, ellipse circumference and - ault plane edges. [Defaults: width = default, color = black, style = solid]. + {V} - -X: str + xshift: str ``'[a|c|f|r][xshift]'`` - -Y: str + yshift: str ``'[a|c|f|r][yshift]'`` Shift plot origin. `(more ...) `_ diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index b777890f0f4..7e136e3e114 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -28,13 +28,13 @@ def test_velo_pandas_dataframe(): fig.velo( data=df.to_numpy(), region=[-10, 10, -10, 10], - W="0.25p,red", - G="green", - L=True, - S="e0.2/0.39/18", + pen="0.25p,red", + facecolor="green", + line=True, + scaling="e0.2/0.39/18", frame="1g1", projection="x0.4/0.4", - A="0.3p", - V=True, + vector="0.3p", + verbose=True, ) return fig From 4858aff24b87920b85a48ad2279c0106292c65c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Fri, 6 Nov 2020 11:18:35 +0000 Subject: [PATCH 10/48] Apply suggestions from code review Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/base_plotting.py | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 08a032d9f3b..bee5420d392 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1937,14 +1937,17 @@ def update_pointers(data_pointers): W="pen", X="xshift", Y="yshift", + p="perspective", + t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") def velo(self, data=None, scaling=None, **kwargs): """ Plot velocity vectors, crosses, and wedges - Reads data values from files, numpy array or panda dataframe and will plot velocity - arrows on a map. Most options are the same as for plot, except -S. + Reads data values from files, numpy array or pandas DataFrame and will + plot velocity arrows on a map. Most options are the same as for plot, + except *scaling*. Must provide *data* and *scaling*. @@ -1955,8 +1958,9 @@ def velo(self, data=None, scaling=None, **kwargs): Parameters ---------- - data : str or 2d array or dataframe - Either a data file name, a 2d numpy array or a panda dataframe. + data : str or np.ndarray or pandas.DataFrame + Pass in either a file name, a 2D numpy array, or a pandas dataframe + table. {J} @@ -1964,10 +1968,10 @@ def velo(self, data=None, scaling=None, **kwargs): scaling: str Selects the meaning of the columns in the data file and the figure - to be plotted. In all cases, the scales are in data units per length - unit and sizes are in length units (default length unit is - controlled by `PROJ_LENGTH_UNIT `_ - unless **c**, **i** , or **p** is appended). + to be plotted. In all cases, the scales are in data units per + length unit and sizes are in length units (default length unit is + controlled by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i** , or + **p** is appended). "**e**\\ *velscale/confidence*\\ [\\ **+f**\\ font]" @@ -2042,8 +2046,8 @@ def velo(self, data=None, scaling=None, **kwargs): ---------------- vector : bool or str Modify vector parameters. For vector heads, append vector head size - [Default is 9p]. See `Vector Attributes `_ - for specifying additional attributes. + [Default is 9p]. For specifying additional attributes, see + :gmt-docs:`supplements/geodesy/velo.html#vector-attributes`. {B} @@ -2077,17 +2081,10 @@ def velo(self, data=None, scaling=None, **kwargs): fault plane edges. [Defaults: width = default, color = black, style = solid]. {U} - {V} - - xshift: str - ``'[a|c|f|r][xshift]'`` - - yshift: str - ``'[a|c|f|r][yshift]'`` - Shift plot origin. `(more ...) `_ - - + {XY} + {p} + {t} """ kwargs = self._preprocess(**kwargs) From 099a3d6ae5a8412dcc743b14172606fe1feab2f9 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 6 Nov 2020 12:04:19 +0000 Subject: [PATCH 11/48] update docstring --- pygmt/base_plotting.py | 61 +++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index bee5420d392..3edd4f92dad 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1985,20 +1985,21 @@ def velo(self, data=None, scaling=None, **kwargs): with the pen attributes specified by the -W option. Parameters are expected to be in the following columns: - **1,2**: longitude, latitude of station (-: option interchanges - order) **3,4**: eastward, northward velocity (-: option - interchanges order) **5,6**: uncertainty of eastward, northward - velocities (1-sigma) (-: option interchanges order) - **7**: correlation between eastward and northward components - **8**: name of station (optional). + **1,2**: longitude, latitude of station (-: option + interchanges order) **3,4**: eastward, northward velocity + (-: option interchanges order) **5,6**: uncertainty of + eastward, northward velocities (1-sigma, -: option + interchanges order) **7**: correlation between eastward + and northward components **8**: name of station (optional). "**n**\\ *barscale*" Anisotropy bars. barscale sets the scaling of the bars. Parameters are expected to be in the following columns: - **1,2** : longitude, latitude of station (-: option interchanges - order) **3,4** : eastward, northward components of anisotropy - vector (-: option interchanges order) + **1,2** : longitude, latitude of station (-: option + interchanges order) **3,4** : eastward, northward + components of anisotropy vector (-: option interchanges + order) "**r**\\ *velscale/confidence*\\ [\\ **+f**\\ font]" @@ -2011,34 +2012,35 @@ def velo(self, data=None, scaling=None, **kwargs): The arrow and the circumference of the ellipse will be drawn with the pen attributes specified by the -W option. Parameters are expected to be in the following columns: - **1,2**: longitude, latitude, of station (-: option interchanges - order) **3,4**: eastward, northward velocity (-: option - interchanges order) **5,6**: semi-major, semi-minor axes - **7**: counter-clockwise angle, in degrees, from horizontal - axis to major axis of ellipse. 8: name of station (optional) + **1,2**: longitude, latitude, of station (-: option + interchanges order) **3,4**: eastward, northward velocity + (-: option interchanges order) **5,6**: semi-major, + semi-minor axes **7**: counter-clockwise angle, in degrees, + from horizontal axis to major axis of ellipse. 8: name of + station (optional) "**w**\\ *wedgescale/wedgemag*" Rotational wedges. wedgescale sets the size of the wedges. Values are multiplied by wedgemag before plotting. For example, setting wedgemag to 1.e7 works well for rotations of the order - of 100 nanoradians/yr. Use **-G** to set the fill color or shade - for the wedge, and **-E** to set the color or shade for the - uncertainty. Parameters are expected to be in the + of 100 nanoradians/yr. Use **-G** to set the fill color or + shade for the wedge, and **-E** to set the color or shade for + the uncertainty. Parameters are expected to be in the following columns: **1,2**: longitude, latitude, of station (-: option - interchanges order) **3**: rotation in radians **4**: rotation - uncertainty in radians + interchanges order) **3**: rotation in radians + **4**: rotation uncertainty in radians "**x**\\ *cross_scale*" gives Strain crosses. cross_scale sets the size of the cross. Parameters are expected to be in the following columns: **1,2**: longitude, latitude, of station - (-: option interchanges order) 3: eps1, the most extensional + (-: option interchanges order) 3: eps1, the most + extensional eigenvalue of strain tensor, with extension + taken positive. **4**: eps2, the most compressional eigenvalue of strain tensor, with extension taken positive. - **4**: eps2, the most compressional eigenvalue of strain - tensor, with extension taken positive. **5**: azimuth of eps2 in degrees CW from North. @@ -2061,16 +2063,18 @@ def velo(self, data=None, scaling=None, **kwargs): uncertainty_color : str Sets the color or shade used for filling uncertainty wedges (-Sw) or velocity error ellipses (-Se or -Sr). [If -E is not - specified, the uncertainty regions will be transparent.] - `(more ...) `_ + specified, the uncertainty regions will be transparent]. + More details on + :gmt-docs:`cookbook/features.html#gfill-attrib`. facecolor : str Select color or pattern for filling of symbols or polygons - [Default is no fill]. `(more ...) `_ + [Default is no fill]. More details on + :gmt-docs:cookbook/features.html#gfill-attrib`. line: str - Draw lines. Ellipses and fault planes will have their outlines drawn - using current pen (see -W). + Draw lines. Ellipses and fault planes will have their outlines + drawn using current pen (see -W). no_clip: str Do NOT skip symbols that fall outside the frame boundary specified @@ -2078,7 +2082,8 @@ def velo(self, data=None, scaling=None, **kwargs): pen : str Set pen attributes for velocity arrows, ellipse circumference and - fault plane edges. [Defaults: width = default, color = black, style = solid]. + fault plane edges. [Defaults: width = default, color = black, + style = solid]. {U} {V} From 8c6c0e1d151c99c13332997844e7819ea7387b6c Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 6 Nov 2020 12:26:49 +0000 Subject: [PATCH 12/48] fix errors from make lint --- pygmt/base_plotting.py | 7 +++++++ pygmt/tests/test_velo.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 3edd4f92dad..6c50ff61341 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2104,6 +2104,13 @@ def velo(self, data=None, scaling=None, **kwargs): extra_arrays.append(kwargs["G"]) del kwargs["G"] + if scaling is not None: + if not isinstance(scaling,str): + raise GMTInvalidInput( + "scaling has to be a string." + ) + extra_arrays.append(scaling) + with Session() as lib: # Choose how data will be passed in to the module if kind == "file": diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index 7e136e3e114..03f084c83ef 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -13,7 +13,7 @@ def test_velo_pandas_dataframe(): Plot velocity vectors, crosses, and wedges from a pandas.DataFrame """ fig = Figure() - df = pd.DataFrame( + dframe = pd.DataFrame( data={ "Long.": [0, -8, 0, -5, 5, 0], "Lat.": [-8, 5, 0, -5, 0, -5], @@ -26,7 +26,7 @@ def test_velo_pandas_dataframe(): } ) fig.velo( - data=df.to_numpy(), + data=dframe.to_numpy(), region=[-10, 10, -10, 10], pen="0.25p,red", facecolor="green", From 480abd0aaea2a8528adb2c6a02bd074a11e59e55 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 6 Nov 2020 15:54:41 +0000 Subject: [PATCH 13/48] remove baseline img --- .../baseline/test_velo_pandas_dataframe.png | Bin 40277 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pygmt/tests/baseline/test_velo_pandas_dataframe.png diff --git a/pygmt/tests/baseline/test_velo_pandas_dataframe.png b/pygmt/tests/baseline/test_velo_pandas_dataframe.png deleted file mode 100644 index c68c191cfe62a015f51931a352c2cd7817e341c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40277 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 jMBTB}d)}+J Date: Fri, 6 Nov 2020 16:43:02 +0000 Subject: [PATCH 14/48] create example and edit test so it fit the example --- examples/gallery/plot/velo_arrow_ellipse.py | 42 ++++++++++++++++++ .../test_velo_arrow_ellipse_pandas_df.png | Bin 0 -> 41066 bytes pygmt/tests/test_velo.py | 10 ++--- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 examples/gallery/plot/velo_arrow_ellipse.py create mode 100644 pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png diff --git a/examples/gallery/plot/velo_arrow_ellipse.py b/examples/gallery/plot/velo_arrow_ellipse.py new file mode 100644 index 00000000000..ad64bde8bb0 --- /dev/null +++ b/examples/gallery/plot/velo_arrow_ellipse.py @@ -0,0 +1,42 @@ +""" +Velocity arrows and confidence ellipse +---------------- + +The :meth:`pygmt.Figure.velo` method can be used to plot mean velocity arrow +and confidence ellipse on a map. +The example below, should make big red arrows with green ellipses, +outlined in red. Note that the 39% confidence scaling will give an ellipse +which fits inside a rectangle of dimension Esig by Nsig. +""" + +import pandas as pd +import pygmt + +fig = pygmt.Figure() + +dframe = pd.DataFrame( + data={ + "Long.": [0, -8, 0, -5, 5, 0], + "Lat.": [-8, 5, 0, -5, 0, -5], + "Evel": [0, 3, 4, 6, -6, 6], + "Nvel": [0, 3, 6, 4, 4, -4], + "Esig": [4, 0, 4, 6, 6, 6], + "Nsig": [6, 0, 6, 4, 4, 4], + "CorEN": [0.5, 0.5, 0.5, 0.5, -0.5, -0.5], + # "SITE": ["4x6", "3x3", "NaN", "6x4", "-6x4", "6x-4"], + } +) +fig.velo( + data=dframe.to_numpy(), + region=[-10, 10, -10, 10], + pen="0.6p,red", + uncertainty_color="green", + line=True, + scaling="e0.2/0.39/18", + frame="1g1", + projection="x0.4/0.4", + vector="0.3c+p1p+e+gred", + verbose=True, +) + +fig.show() diff --git a/pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png b/pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png new file mode 100644 index 0000000000000000000000000000000000000000..c49f5f97f2d1d0a69b2784aa3619962d188ec80a GIT binary patch literal 41066 zcmb@u2{_bYy9Yd$vM)v1vX!Fjdv=i|d$MIGTe4*t`%s}Q5g~+>CHuawB~-S`GS)#t z42HxEvwhF-zUO_6wv%HUljuEd&B#(7Ad2HUvUh z3jP{UlY^E}bNz4N2aV57OFsxi>;ma8Sx})`AZX)owRLATNHVLp$$vVT8^KS6We ze_E4d)sYzCg`${@9p(&~f3Wu+9 zH*D{Wdb|r@T0+9_D8>%m5&VLT)!&ts8r^4nIsGDeY~WXJ!!Un|&c19zWkIDydRO|u z@)c;8LHQycZ^zpE*hMt%ZD}d=N_pw}&Wl}wN&B6_rA<#{W>sYIi0ZeyXT-i)ECqfq zuaK*r?!C`m8-G^VWx?Zq4IIbBD9l#opNa=)#R6qUA0OxCRf z{op;}bX!S7;mmiLi20spc{P55go-zzdP$f)e%JJg-|)U|7Ua6O#K3FD)39O=%tl?V zaB7Eo%fyTm-IzpsqDF{ic$!?uuE11Xx5BRes28ev)dqj_=BBe$`xtj$*Z4d%CEUbd zG0xdqQd$M|)XtEY&_VWdo)!`2Kp!TV6yez(Vy1uP&fwpej18qBT{b<3;XckLO|xfb z>EPS9NG(oRu(u8G>n&|PxZbgPzpKtsw<96dHDAJ1XeP4qHe-!qkcpQt*{&JvAJ6C{K=T@ zB_hV_*Cz*oE87?RwuIBqR4t$G`nvo8Z}Np_7DpfOiOvb*dS%H#OniJI zG|eD_5VE%1ft$0|^p|(o!tY{sR<~>|3b8*;(I-Vj&qA zLVxitc(To98F;|^-zNYmR zVTZqTONG0=Pg4h;!hh(Zrm8~raxOGLv%FXaeSNoYW5qJZS-v3PAzET4+e%d>UznE6 zM`--uep!bCQ_^S!zbBSWP-~9M=V<1%ZSl@h+rex~u>t{s;cK5WvEi$xb)A=s{d#ME zHCVITW8Pg1>O)8%3C{1J!S>oSw$iP(A=LjTNDWFoy*R1InoE5 zvK>?#s&M^|iF1+z8e5JDs~1Xz;=VA!Lk$lXbXOX;6;gd424|K(WYoE}g;D}D35NF8 z9yZMS3{UEwCf4q(e<_6Cj|i#d^8Isb-4nZJ^*yDv&G9+99Z~#Bb3ZJ!$6vT4ydko+ zvJLKuwU*o;*KNw~O4}$r(D%!emTu^|uoynf&%cY#X_Tpv0AiN>5N2i)&e^6?v{Yp8am9-#{usKn;%>|>ak@jWD6$t&I>^j`kad3<1T>Deu z*R_ktTXlt7mJ9j{^TO#KJ@WUw&0DO_6P(=_Lc3jtwe?5G0`Ng)EF8gI-PEbq``qt2 z%<)@!NBmLQbWq-!t2c*rzVp}*91i1axWHeM@kO>r)#{)VC8D+={Z2Ujo`TbeK5iy{ z!D??t@yYj>P_Rgqh>TDw2?E>y;mn3R11Q#ij)__cl6 z-&N&xjEK!N!cw&o^JS>1=v#;Dn%720G;{^Q-w_fMmfWJprQ-JdI^(NK%HkT^nu4v} z=b=wd3}>?3UDk=!U0twlP8lEJUwdt15<1V}mMOn%cHUfMiKiVN#xfzXZT?5m$vZNq z;gLMk&SKSShAsOATP^sK(8;rMvqSlutC^p?2&2Db6NCaLq$-(WkkFSG(SyxV!gR4e z5M4z+gRIf{d*Qa2w z-l|UMl8kmooyEIepEQ>P`VbH$j}sRdCwy1qp+D!7U0YOhhJ3}i{_u?6MaKo#+zL?& z!wk{Wg%D)i?IuO-Owm*GuqS`TFPR1ZC^l0& zZ5Ed4pXb%<_qp5CZee3O^jCJYC{bsgLbvlWw9u#b&kvR%Ur~7Y`%_&h1ddROjq)=B z*pKWO7vjQ(+=0&ic)qxYjSAG`l~QzP{U)72C1R=T&_LQ#ve*H2SjH>u&eNxR<8MDg zO{35A5e9zi*G&tgbIPznLDLuETpPRl(PNCcy{eoBzv7(tJX*Fi6ESIjM<%)KT`TyO z+4>$E?s-Kt!m-2kf>YUs@HyP|O5?MHmpiRdJg5UC^pSh^+PHRZfXLJ+zZG1zYVXV6 z#~I`6u{*6ws{(|ID>)Y&(lT^zuO@HRm4^m)AP$mrvw&%NKJv^rX%?^a@sE<{|! zOYfhYv=qLHik;ID|XucPg1vRT!pOUPuuQgPbnu@3{EhAFEo z%-Ykrc8rz+pJL>*fXM!}W7iz!^yJv>*tebgWr^jdQbkF5d&_hEEGZaHkv=2cF51`e z=4|!0LzwsW$U62HX_l1@Il{$IfmxaPfqS8=$t662vr#o)>F%dhc9}zmrHT(5Dwl64 zk2SO1xy>dQJhfMgViAKVqVJYz8NW8KSLR8g5LV+!niH>rA#JBN(M}2S8Q(?X-ii$D zf6rCz^_g?LArd!j<-ey!+*OM;)ZeeqrQ#`s1TcC8#CiJ z7}=^sRBw5p^u;&(wsskDy`fbId4{n4*2)==Z%F8i%zX#6LtZCCo_x=v{qMDmZ_a}b$|bv6Y9_VhHht$5?=x3g>xw-35b`W<|5L2 zqk#AGQEk~BL^eaKE^5*K}sS&o{k3arIZ(gtqAS};Fe7dK=_QRpKefR*AmLA>mr z>egn@R&z4+fbWRE^ZJP>zD}X`#wO^S)_q>C5gS94;@V;DqhjZBEi!N zl_uTaZ{OkPaoc>G&gzd-v9FW0t0GTpfA=U!yX4$0T(++R)hAFkxDLFe%QJ;9K%)-W3}JX!ZD+{?H!VTM>W?2TO?NwU~;?p#Z2 zOH0Tl58Be%%?PWcGVIu*oK3ACyVFZAU%BC&>)e@B_ciSIl3p#=-B7}gfYe=Qeo zeI9Bm9xP^oZkPT!<$Ax|7wgb@L9m3pucLVQ&PLMn55P=H;b{ZHCB8v%HNwGOGEWX>4OsooBTq=Csk(80N5_A zeVLc0tV{29sP>8n%W&!tA^6SlEJ5)c3q)dSb8bMZd7E zKR-;Y^Dd>IJ81dZZ_v}9I5=$>+M31rYbV!k;WLM04X5q2Lj2x)HYd_5=J4CYOM~IV zufN`zQM&#}TSHMibuqnUu~4NBhy4?WQi4yYT(O-#@UyEaj{tUlFe5@T1DxYim@qs3 z<5h;Biq7D>EfF|GmAPp{cj(~SM2t0?UtR8r;SKZP)DRCl|}jVkKjytbp5oBKu}=#-H|Ip^@rIH@0*Jt zZ3jC1&bjykU%KOc0@W_zwI2gjdl|l4|FEhFzw&s*e>&u@UeMLsj!`2~AtS2j(Yf9G zPSI1tDM{H&2(^l!ueN_8b?&XshQ7_vv-;6}e?IJe%SdLb#Y4g3U;%+YQXG}$i(!T@ zr*m~y!;6KZkKpt~M|xKSZt~ooY z&|`If>sIdF&fF+AAL)j%vWz6Op6#Scs@fVjLV3}~R2H?<6XBWd1?D5Oh8fdSvN`CS zi7QHrMIbtuXa&H4(5!tEM~d<6`nDL(=dJfDqnDC|RuFGaxJHGpeqDwRKfZOFIszHu zL$8#;mOQ4A7}~D4rL(z_HHWM53K#!lpux-k>SFM$;m++|fpIX2->rX*Z*nwJ+gmgf1Y*zjNeu#tw6TyT^s+ON zxQ8I3?=Vxq)pH2~Cn1pAjb^Ne$f4Cx?NJ$TRgHw5!)wzh8GRF0Ez9(^SuZ*Wgn1%f zqim1Rk@;a_;@ z{F(u$mFakJ)|{DT`nxzaNm8bZu^;P^Lc~yNJW$?W)bmbvb6Ls8My0# zn-a9na(e^a?K5$b`?pcn&fuB{-BW~KTH?5Jp;jGA+=)a=2;`xR4r^BU_G-u1^tE_o z;=T-l1q^)S5f~T)t?Kdoq&|r_X)z2s-!ywhAsQDoFV6a6p__Ux%7&kf5qA28Q291d?T^AK)LJeJRo8%ToZ$Zstl1b!KTA92Es|?n$p3$}plOj{l?l>5yde_3=~%g+JN_Y$xN4h2SN2v)Vxa zHohr=52PdP*4;ltG~-3m0|{!Eqg`ethDeh$yp9-^Fa}hdhly7H>!0(~9dq|Qft1)Y zdELk#{AmaMyOQkHQCiw+_uQ(AB<41$*GcVF*sV447jyWZeL(8@O#azenc>DutbUOP z>_X9{XBwHkT|VP$!Qy)p0doUwHzL6O9)zgTF0&EWTerLdEz{vGm6b?aySz%$C>|*7 z{4SRY?@P{>flCiYWq=ZWs7P)l0JUNWlBRX$AUYBc-MHz)1Geh-V~S$}uRG=jHEXcPdA=mX;#Lh9&I9?tsyvE7+rJ&*7%V zy$+^LfxQyBf1UMfz_uXxRs0kY{2O=;M*)FMp4j;}#b*AWA1qci&;^;3LgQ%WtRnX= zpxM;hph6zUzr7l8$8`L8u!``&ZE~P+wfhmQ zUq!(1b8`!Cg-T1;wc6O14laGJLu7#6aAXS5I-ezmJhn!*c0xVu5^CCVVj@X*ktJ{> z2HEI(P4T|T&BHM=U~hi8k+cYh|& z+|WDHuqFCgB`}NCL+&av{qK|fx}O|%9FH|?kYU+unF0k_*`T0 zWg1dHWV=T`BTOjn=MZPP065&TP~t~b@s1&0wrD9NzO1ygEhOABUCY>-YQFKY7`~05 z3jV06!7K9Jvsk~nT{Ios3Bny7-V)dp{QvAOp4Hzu%=rB!>k_SKx>@l<@z1$7L=*3- z3e$t3TKJVBE7K!GP^9v3qVi|c|G|&ENWZn4a+M88{$L1EgF3*bpFPxf-?kM{$|3_> zU0Z=+5)epo0~(yZG%R;KK&4=&b(3CJADH=S2JajBB1?88PCK+CkN*kj=4;nUk|GHl z1nwj(FsEt#oTrv5(1_hWt^D?-dCLUf&-&qIBmUryB=R%f8dW}4iFo*B$okSjjh5wP& zVg2eog{~E8n;DhS$2zx(SGHYqRs$QLKqP5o?h&Gy9TPfUlvnKbLBB)*aguB2js6o4 zTMVtsLktUI!BVXLxUhbe0xwScR?0WE3&p(^GAK^nAnDa0(5tRcVk;1|jCLTKldpV% z@*%+R5Zm+rXUMV*pFYuER*5Vv)u7fNt)IUf_Y-GWmIiVV62+&Cg_baIugzeSk>PoT zbBtQX)KOry=?Tv@S{MlllIhOD9UoNmM?bM&R0o^m0`|&s9{`6uuT4vAs$`#nFi_7| zbJ<|Mh%O|97%9PE(jPqNQO3|YkPgmJq7aBg#7#b1kej=E>U;{7o(hf&ApKW7m3fzIeGC=An6@2H2GFTtw<_2?qFwU=is2l zi$Q<1!03i>iR1JBB{z;o*@}ee#Kf7gO#7C;nf(dO=}~U7z1*o3UG3_u+G- zW}{G?*Wa$p7!%Bcg;tf*C0C-Q?&_QYLA8hZj@5rSXc87!dHF9~TKumm{((Jj>J|p; zyp9Lg>mm&Uelz=15pchiZO1V!YE6#weoj>-u(9O<9-rZ~O%aE;2Q|^pp zK>UIp0R1w-an&SXbv-VCV-z^H=v+++q2hZ6c4xsQzXnEEp|{I7qy)|#2|n{!Yv*tF zlQiKYPY4nGpgzL$1`pH-iLV5J^6)|7#zMsy`7h^kiz0y3{E;$c{d$?Or??eE+0t4W z>R0fe24;5>-%~|wfCp_~j%b>cLPOqcp9}D1i+Q4sbFP{RVrAXN0%e!5gF}~=nw0~~Y%d9H@e;}E7P(J%v1xsu1EwyrqLm|B zj)(ZQR+%_g4a}>(Akaq9ezhJ|pz_?UY|(ODM0zaA`ToAfI{g4Ay#Y}7WImO#TlUV# zQHNL_?R>Iv z^meaEK9|ob@-SX9*JLmIdA}1aKK0ql@3)FyE$y(2F_oSHp_Xt?I_>3u#9{x-@AkS4 zSw+AyUWlj>qLs$wF(hgfGpu=;o0>|i=o+)uHJ*b&w(l6TO51F&zHf8oxt_oImmoU2 z$A(}x37KdJ*nGE%UJ57F( z@%GzU0Eg==<|Rq)vI<?E({i0>kP5c}es*lDrO%{lQn_df&rFG^dhBV1#{RL_| z`51T!EC%lUOAz$bq9Ay;QlVL3u>fW=H!X~^BiUt z3a%y44Vdk#guMwF|0S@lYARrU`*y0@J~{XteP%lP%mf5yQR+Et?tA4*I1tM~5MCX6 z#5kUPsF*V$1{&<$N$+*Q!20L~|2rQjQP<behu9Qu ze}1~WK6hnqx9T-)fKr0q@jZ}&XU9nW#%vdxlgt{OW(Nz-A5R96 z$UgF-Rl4RpCO?*_AnKQH01&-}M_x1!57Aq}ZycTF)G-{Fpu>ZmZD>{kS%}k8D%kVU zLi0UtpZ7g_sj!_T`e7ohA}|_T+E^B~MydFOW6h6c8~-ampx-Pgc$#tTJ}9Yp{HLm(l;IDyMNoA;%nfC_4V)j^w}D1>or~#+4wAOdTe#W@%Du zQ5#N|2x(Y~Nu2F*@H4#KdyEH2)~mb zsR`*<8oEFECZm=YLeb0aNFS>yG!R-m)r!Hd`m7Ua_+@fX{p%x4^WS9hMS2$b$jGzh z6=|JkvC#0YCFV`al2kTLgqKTKo?6d5Y@QHo1A`=~Y#=>)tPT!c@%r>b%b`KWv9+`{ zXk~pC$1xV_2a~@^tce}!Y+uynN_d*`R-;PehRc3g>Go1T=Q!lvR)n3M%@d30p35)y zUTr{4STrqTd)7*It2b#_iIEkrj-bDN2)cIu;7q{WcOYjAMRFJwz3`z2zU7H8JsEND z+&?Zd&zewf>*JjIb6vX9+o`rED;Apc*4xY`y1Y+qgz3ujb$kEh4V9I^HVo4ku~PnS z<;9&f2)EgM`Yl4?U4Q{cnG1H1(%N6YAfD6iF?<< zWkgQ-N9Gur(6`Um$iw5^)i_e|kgH`#B+Hrt=3?P9b0`HTHSL3sVAp`Qs(EUM?hj#E zsn)LL?N*vTaYj+_hsS~g z&*~F0;!`?)t@&05(~S>DT*p$(VC^X|;?+&Jk>R1;)h{+uKk}IR!XwpVKp=C_+l9ok zIVE&>Pmoa1&>zPi88%>*eJ!%n(l5T)+<4y#CqK=XoQ;0>&CW05YAg^bQb5GzIU^J1 z$M?Y0^yH(hj14LY4V&13ve;H?(@c+T4?NF_5JY+H-$2N(WnkCrPXiubyp zx;HI&=b1)JUl+56((oQ4y~%3kd6-S7TnZnStbIL*p8vIBu7bgilo5+QCGEWjfV=yH z=&EFY7unAMc3<|8P44GnI6lDU}7hy-AKgrH-3(Qh__hJEyDZb z3d@%qMKM;XYh(|eVfthK@r2)O5jAqA%yKA?|Be2VD8;1QPEtiOnCD?Y-MqocFk2)O z*@;Q9og{ry;|~ST#xkW1Ic$U2O3My{>_G-bn*fe#aUGP6&22Q*T%6M$C8OSm!f3CM zn#BY|rf^>)#J?Z64gaI<1-^0(LMdm6yI=)2?$c&HjyF|=L=6o{k>Fuf{P2?1c`O;d zYs$z6e+c=r&?7!;QVAS)^MH;jli(EUg_;K>hWWlqLHEQx4k9P-=gmxT!?Vu&(hIvK z@v@Mz`$M-OUctv5#X-lbQ%sS%q;i!uz+g{btY$rG^DeJtEY_s{unALN2RH&3LL6ME zH6g93cK%NL0OWG;5dqf<7&LkV|{^xlc&b`TAtF#TfS7<;}%m|&!d#XEW3 zjZa|(`uh~@m6dI)dQ;x@@ePt9M971iAox@ocehMuib&Z2PP%72;CH*|4UeZG6e z-(y(01*SCE&raOQQ@>4O5=F7L0mEHd#-G@;l{BTMQM`r)E(fk=Hbet*Yi!xLT1cN#~<@{KJQ8$^N}_Mp@;63ILDL$ zto2_x7_j%G<&~E9`*!8f6mx|YuR~sc?eFhjU0rRJmC;WHcuPdfKkx{L=S&%S+ za^#6fsd=^kt2yvY7vRh;5A|GP_&2UOxT3IhomB%{e5I2px0ttI>+>g;8!z}oqThv) zU~(s;;aMy!=n5*UeD^J|D5Ax6&+ux{RBoRSMf<|T%-GVf?RR=T`f2JD z;Q9WNouzHN%GUb65k#){Gz`-IQ<2tFjqoKD^5EL)rrth<{Zph+Js!kYQ+0zqA@}89 zK)3*XqdvXfnvMVZ#HIQqpEQVG3o86pV>YO|l^)(jS1I`iVE%-61q$v`9!U+13HpOY)uXN!;p&y-2eo*zviZk>n_ z8ThmE84f@u*E!o3z^qREO7FUdKWqp*(H(J2r~o2IuFXBGR^%v&^i;ADc6p$-=|e{w z4;i1a*MaUxUfMiyuSymP+4nr+(de4wup0>dWK&a)eHwKhMeiQ~IoKRyQxZ2=S{kFb zWXamQMsk;*HC-o*tq73j{bQC4)ho8;8EnkDIng@L6#2lK5$g|jDBl54;@y4x-2~$i z9*C6@d^L?{_77FJ$kj5?u2W8P(TJw6Cw5&bEZ@ou$1;>;L^(Z`}{zd zC8CL=i0loB2`3y{G_gVgumAHSzQvInvN7PY1mb0%s{r1y&)s5Dzopot>a>T^CR=c3 zdizZdJgo86JOQDRnh}Kfg`6V=y6dg!c*xC{Q>tXIhDL?zKVZz$Cx%Y&>Eu+B;^9}b zpsfM3YM=)Bu{XEpIw=TAjfs;5)P2dTLJbjYJ%rltjs>|V9AyOoNs7Ub;0CwP zGDQZrvqm>E6I;V`w2a3Zp4F4x)G0=eI5I)>ejf#m@EpWgDHEh%`C$$e^6FdJQLLDQ zs28H8Q-dU@4?8k}%*d;6PlaAWNuhpZK|m{E5R+2!m1;me1+cvdOLjK!m~irB8Du+! z#N%U|2l|&@0sFlfAAlfx)ej($2M($4eFaOFd@f!EBJmjd_M6@AOPMM}=|0{39}rN< zds1{WoDH3fa}#xVHMJ9T4xV9>zRai;g#ZCNeE_lw6g@MsYDsR^u|)^BkwNU8Q|(q= z^V_J7eNSWkkDmW**#J4tlVoRS_pAW_UuZRw)x*MwIB()68g6G-_HqY#;R!P#kH}5v zg2g7^)a2I0+$ws-41l~gbs3LrFFJNZpVND`qQG`R=M2kf5D=~!F3>=pM` zqLkepIz0v@;)sGM+5F2Ib%BA0+z3Z%{i|U~6D5k?znKncW?=W*sI;y{dS-*{EekQk z_G?=QuWe91HDpDWZ*Q+(k7o$7784KEV=Z|s>s!tzn67xcp0_Y98MFrJ4kAS2aWPfY;iI@_{$*H;S-E-1# z_ibE`U;l#39|_3PQyAo4VWp<)dfoi|jP`n4iBkXIW1-22-C1EFDn{cet?re3EX1#6 z^4R`XdF^2%Mo4^{?3hW)+Pc1chF&}?2^v$My4aVtL(ehA#%CW6?U5(T zfAD_k1^qoFG&vOIP&HQ!Sv%e;WU{2}d+wuo>Qy(WI8_X@LG1RyDS~aI1SDO6K$cw1 z-j);bXdcV6+Rban|HMb}Hxqq+(>g`>C9qb3wbD^>vq$qUhrd_mNUYex-kf89WXc=4 ziAidpgG35vOjU{9>*A1=d>L@{wMO~Jsw6^JBbq9gF+VPU(u8_;ypJ5q4<>oV9y(Q3 z?%Z`zMiPhT(4elN4cKuV$Cy3Puptabg?V0PJgg|MK zllA*+`H;*XSSocX#i^0Vk?XJfqivxly+V!N2iryJPrIPz*Zl9cQ9^9}Gx7ey7nf&w zgH-I?vMHKoIouFze8NfZl0k0cG#}RaZMmkUcbD|`2tLsZN71N-qpqXB-T_{+%uGId?$n_xB4awA<^jlrcK=kgfq5Ow zJd>j=f?2&$)v=!eW1NL&ZjM%u*aZ7n*`M#ZHn98PI%!Wr*l1qI1pX&Q2X&K1JK>#` ziBpi9My{8_ZD80j8=<#tx30I{u{W(e$XAE%X+(ZXe5%3G-vx3~qzsMnKQc7#KlZdO z(HRMb0+cZeeQJCpZY=$=8nRXO9HYE^bFq6C`#VbNWLhZRcWuSz+wR62I^ET?*CRto zN$B3L*2;lD(Yi53?xn-EA0g!>(u>8FYQtO6-OL|HmN-we>@eN@al~0ebC%=YUbVR* zHZtwGZBu;%vc3u(N8l-%3*GD@fGg963OIT9a74rs_kM@alkXleYqKCqsTNo z(ry#xL4gb^vJtFyo!H|SIe-Xw9pMM$%3N`ety98W@{A`^ znACqBqbv3$B{X(Tf--VQ2x&ByUoNI$e@4@^Gt6&IYc)UfM5F+zyn`F3aNXOP9&+2h zSFK12Z()?jN@3+IPU|U0%7t&932&D=335<@(cRFM6Aiy8swJ5K)_bhRiwumh6|_Oq zl6S`>^3a7y`o1@ei&ADtA~Cz5>;R#5M$0(8P>Y<*ekO}OYclWjB{{>QCzs1mT^t8A zzt#$c>R(`>Bj=n{of1suZU-szn0zk$4>BBKaodlS`ngqHsB!DKYG_n3hFKHaMS0Go zR6uB@lg+A>o}YDbRT76eB$%JhW1pbl`EgVxNWFe)g!WrJ%4<>F_wUuC4rXO69J&R(|5AE+m^N zsR|-TKH?+g)sUe?-<)Ykw_C?$hY%5+#r&J4Ls>lwHh8%Wn?-0aRt zbr!NQG_*`s#!jdrjvw%wQ+LNGKh?+vWTkDA4`BErP6I~1ma)d~40HB2j4(fM_xq5d z@wW@>bP!;eK{hk47XlH!?+A;+%+IP)KKOo=xTJ!78%Lg`=YLWwgJGF`_Mj-j9c8x> z0ZM2g31+?89zH$fS?rE`uBrf42n`sqYVai&(Yzx$StTd~q+1DGe^AS|=I9fUspY%I zawGr2N!a=p1*B-4m--4BxlY!xQ|+s0r|MpR`{GT#PYK$jWG$ zF;v_-1&Q=Tiqf-xmBPH?xcTJ{=^IX}>ECdH;uBD4&pe2w+`E zRP2p(=Yya+Wb4+ljphxq$k1tyYf5%)VD#Rj0oW=PRR(I?Gk>px$a(+pki-@zwSdPH z0-&ynM2M3LyA;CWkHZLg+54uTt{q~wKLTqc%3|rB`3dtSzd14(;@4BTn}{!(xthqy%QugcuuSr8#X_`GOnm$<_Lq1!DT(YdEI$O5Ib3fjk`w-_l}d06B?|(t z;T#~AMF$_bw~VRVji#i&cN4fY-+6R-#`sd+W*fww`Wh9VLMkMx9l(R~>r{N%fP3Zmq6$n6w^M>7kK#0HY{l{9%}hr1Mh$XG zGs*L`_y(V6ETyF4qoNi`k09(&kvk|y7?4t=qbR7@ggkg%@x{zC_DV#R^N&mFyqXks z9Nf_lH}UbL`T)PjZCOQN>L24RsuN^4w?GBnK#<^Z6_jC9W0^ZA4KttdIBJqD+epDQ zRe^^2)l4=iAqwsIpk>Ue<-6|IHHzmTy_BN_S)%iHO%?+0j2t_ljt?Nt^zwYr<<~K# zJ4V%A)>#Z;0Q<87dy)nW5vg8CC1~^HJa!Q|G(kq4{C0p*Jzl+<3{UCC$-dxuOnAzp zR1phi-gN;Ga)HuHQSuLc)&kwNFCkI#$FVHrftl->AWikDn9_|fell_zkSyIJ_p(e! zNBsHV%|WC|7V_(^R?w%fnaKtx?Q~qSXBr^Mb2FJ@GHbZ)B{<9cJc#h)>?p}2zn}(b z962ZPU|5S>=9Ex%Y1f3ADtDzxZFl(YIz~@$KCgi(oP&=RDgnxOU!J=ssmUQ2X zn=OwhQH!}aYqmxPV3X}gt=K! zkq6C@0%g>EM}_Es)Q7gaWb7q2G~e!S(<#2@=~c!@nYcT?k4LF?*V20=eWj3+5?B1eJGs6A@ll_3=V~g?= zT?vahp&AQro>U8HHc)A2*v=7Mn*bYM<}6t)XfsoRh!pq{G9Vc{Kei2WqLy9;2$E%e zVGaTT3@CO%2KcZ4rI>ud-bPbh&Vv(5PgARfZs!=YA{% zMb5RproKaN-F?SH`EwMLwFre9wa_!ZZ zzMDHGKx4EY%4e4Er5(_~4a}{C4aj@}<34Mzfa#_2u4`o{zt6~Se;e>X2X*IgKM^{S zKbA~j>16&?d=e!Oe&#*1g)}1{Dg@C;IM>cI1A4vk*i}~|M_DHjjF1(6GBGdfUPLo~*IV-z}>c@bRfEM9Ab>8Xw=K z({H@G|D)w~8KscR;HEn{j>SpQpF%YNkpA0ppucFVUZm%sy&2Q#g+^C9U^r7hLM5J7z|vPz1KUg8Xxmb+OmlK)APokv=2 zxaKADafYiYpc@+aqYX_PXsCfI@vMZ4|5ZF;cXHHA{jPJ9(ip~YfdQOnn}g!Fzsg$x z2;r2)tc~9Sp8Qfx1F6OoC^|^+Yd~(MP`)alnu}EHoMj050=hltH+J*bsq!_TT&Nl7 z9UYWSp@veZy5I!2$C8EWOE7Grv9#UDX@7pQqV9q>OzcD&WeEvd&ntig)NPg2B-eZ5 zr5<_kKoI0V5^W1w;lE0Y~-p|6t`S^MAa;#OzSBCU?C&{fc$4{b>wTH zwBfiGK+>t{`}u470J_=n$`jo4<|2oN8`;=@7m^q+0BCk+08~jZGUIX?BSfEYYk1!l(Fu3 zZ(aQJKI~q z(j_}j_Ucj8n`a=k1p*YWq!Sg6@4pTWr__#blE)k;c-9a1m8wI@$%4K-o_Rl=V4MMq z_~TDq^AMjy38f%!+jC)+!mvQRkPMUzXHV)4s-jM|w{$=#fE@V1_l8_NEBQ`soumwU z2E?Y4;TaWN`cW?9%!cLHG1WFQvKydSX|gaWDI=o&*`kjWvy2TOX<|M z-8>3=zpsamt*3TB6u69}KGNs}ZYROXHq+ViIks0t=`}Fy9;pOh*52=ZVu9(9bYe|;-OzrawX?=9FQ!7!RX1<{C z@4NDidj4nL@V#Nuw=~`wkm9S-f6GVwr>|#>p&a9WvVOe$q?CG5X2sAry0jT%Yx?AE z$d2!{aEiXDf!5(^>epW!@3?bz^^^W51$ z$9H{B1R4OUdZ&^Cv9p@j)if8WVSnDAf}EtGlW6*&rAlmk>--rLwngIA{m{&W6Z&6W zz@?FH(!K!ckmt<(F~_#3(NCxT=C#hbNEj^^V^PP*X9YA^X}@n12B*naI^jm0U*5Ag zhC0bgKAO+PJjoB16V4?|*j=d}S(&(C?V9ijn-O?%9;lx$Sa#4N-IkY6jIdN#pn$QAbe;E@jI z$v%31A5l+3Z}g3!x|TMwviC@)ATIz%?vO6BQ@p%N3F6AVAKaE6%m3}^w+0-(MMHie zk5qFLM9O3EKVf!kpCW7S2J4z;o@_&l$a&FOkA4IpbN$1LUACYM@X~yxA|&J7ez0LE zYAWCtGda9=5-cn>k47!(GB}m(%~A@V1BX1cGD8&TJUKfTsWqp7i_?JfN`R0AqNvCn zNkkZF?GGfRnbisNy9(8KSUp1JWx&j- z*mUA+)WE9(uIf0i0}2-)DcyywjCO2Gs!3`roZ!?Rw>aoA)xDB$BNOinJK2OI8zmXa zALFtht*Kz2GM>Y=^5KnZ&QTIrOakJ3N9-L?$AFQsWSe}4}NKd1`G z^wnEuq*WobV~V%ld`q%}M&#Ax22$iQ*79y=kxGPjsze6*xn}V?G|Z8!mHpGE<9S3T z{(HHQ5mjO*9zTgA2;!qsL%%U#VmGMhcaLhzddr}{L5cZ%Y3Y@?_+1b8pCS;RHlF=p zTW`@mTk^p>#&&@+(adq@ajUSHx4gIXPD{rEFAM4E;2;&Qga2Ql$E&Sj&S>Vj-=^pO zo)>wfTBVxMMuc@pCd4pyP{Y{RuJRJRwA2W`*hLT?3%Hu2Vf;CY?)_K7!i-whrBClE zn1dFM0`#)d_%tYrVPnHHa8w4MPM;Z|_Z@j_?G^WAXzLjw@CIGTXBUx*V|ysimlUo( zjEm@#^D)dCqktM&74#tmhIJTd4wM(?Q}wQ{HA0*!lB!3w3MN%XY0+!-PG!cRt3PIs zD((?Q&g1#y7ft-XPf~gTY7j50?YztJ3Th?U_f}{a>$ZS@0Wx$;4ta3m9r&tU$$$}C zz8>mIM^_{Uh3afhzyzz+cLf~CO{+#=iL2PD)3axgSJsWp%sq`+*=)ij_thdn%%ktd znfd{8^lhUMV$ABCnfM+jk)}JEpR}aHUFp@r-P_;xrS?K`A7=)hHszxYVD=bWjq15G ztIt2ED9L|HAf$^|1V zx`o}hH~Qhdj0!e^oqK^U;`Y!Bv&@h8ae3O}8q~WdQ9w;R(R&>&_agN}1xa5oInB{( z32)%IP9`Pi)i|;^ZIJEbs?t=JU_5uYVxv&h8G57eLoOmBRJ1E`d*_s@8rvL^sg=w@ z7*zLnD@}!btv!d1SI82f&H3|Pv`r{3s%xCCAC-~6bP7~q%PXIH(A~_?^;|Fzk$~Y^jgsm zPE33=L;&@8>)!|!+{f!OrFXz=CyplwZ@dEorb!h~N4EKoIA}forV=iWIYA6FLS7yXmK6t1j4i?{MjSpk~D z-CaEU_)HIXWIKHH?EVLXm+JC zxbqAQh`-U(y#_U7+Sj-9a{&Vhf+S{B@Hz4emzx=Zc&=*x3|W&(2|ol6Ch-i=-JCb9 zABO9;fZ$UZeBdGY)>% zi~q2+71R5&X3WE1t^qY3^g-fZpanrrz3yOZ{~2xE5fGOmn&knL7tsCzFWtQCgGi-& zK;AS6sa89_;hD~5AQ}Q(bHHhiAjg46m=?w>zAPAk2m&xfx-m89@tVZqvn~SigCz7T zZBB5)V@H+CAm8`Ddzj0eiSi?tER$^lLx3K@GI=gd0w`-zfU?Gt^p5a;##tWYEZ^`# z)&|d3YQVYe-)g9L@Y$Z7UGGKs)$4ba{@edA=kY)P|1bYBdu>A~bY@B{;kOIGq-;lS zCa%8}MZ0S;f^G($ZbRW&%+h)GnUACi2P*D4N&b`fj3-rx`#>{v+u~Pid4K%8_cdG{f2(BS z;P2d>Mu`;d5KKh)m#~^sy{T%a+;vpQY_vjsJus|$U5|X^Uopo&hibMC4-?fCrU-$r z&QSMhf0--b+Q|{=t~KdpJ*($a_4{+ruGJ1}gjB}<@l@=2QOvLCRoMnLCOr#5&`#+t z$3n>6A-6BN)NlXRIml0;qTNXm2+D3d+G=cg5ZY+Rf!XdO+SGsQE##p*qx<~Bf%P*w zjMiO$v`X9Q@%VA-MTyMz?)h8uicuG)v6s0 zbuV62rd$0BoGKXJ`7d^C@;a=D+h>=iqA!>!z%{xHT?*`h1A(^&m?Y$kpij>qpxR%V zzk0qH!OHmg6C5hM${x6bgRTB7`&GH!{%TD|>??|}cd!Y_-{t_PXY_T@tDO)Z#blT1 zmef8MQjiQlvI6&%1r&-Qz1(~txhv3cQE|QF$UxgdS~#4V6h4l#TqA%IjKlvpks?mn zegLyxP3lHNnXNNiidF*%J=>F^V+YzNaS%)`aY`Op;34s2aHHpixG?Lz%2t1a_aIPK zi#;HTt_muv`V}Zx?^#~6&qeeh^K~ke@pD=mDKoT-x$_C&?E%)a!}Y|wZT=O6cVL{t zGaPUS_N;nCY<*Ewptx}J@_vBSWi=#}0a6X^%~ds+KX!ua>n6I=SG$x6WLU!qh&kDk zs`oLjQU#_2jpXZHOHU-?#oq4@6(Fy@fmu8w{0u%|j>fFtsKJ&1!H}95$QOPdPS7lm z+*w@jG_R5JG4(^(--UyOJr0&}rPX`V*WcXzBjfT+4OL(I26UzImk@ORn`lAUZByqF z)cIDR+saqRa5Uzw|DMjSaTFC?Cj^5)mjfCG4dl<^DEzYA#u5M-v}vE=8I0IM_8fwM ze_f_$+vZF5rHRTL255w>Gz7B%@KB>aXoG?8yW{Nm3kyHKPE~m_s0`#D=wHeoBo13$ z&vjT7#nB?gPfph+H9pKre)zlDDI?tONoi%a;Pe57kh_&w@SruT0qq{g5Fv}d7Fh$(N|g7S*c zfYX_(GJ?^O=NnDu>+%Wz{2q-WfHr#kdGt2AP*dIuj|MB{oDZV31{p1vt1EU&V9`eC zQjeqvy6P0X2mD zIjoxYBNtIXW`;Q@?};(_9#6oDjFY1E_A^roSPj}=1O)~X`0mo(;K#Mlxcj_$GyLoU zL=^pYfAY{YKURLEjyd2*@f0^?QFul7OECy0rM)S)!%mZ8mcJ9q{yj`QEfci_vo;Ga zFRq-x0ef^HzF7&{w5Xy!Nykhjpn=rrY4i=U_jISfSB}((ZbOHzUfy2Z!!#$+3Sy7> zA*k-Ya@y8291$|VmSLf~>11&^n;h)v0K>^6t$r%rk|PetB3)1SOU6MZa=%{u&T?b~Oy})AM{R!&2;#Zt zNGIiSVteUs{E#LrnY2z81~p#ZQAvCE442&EjlL1ZY`G{+W}#!)7p2SwbXI><())z- z5L3qnqvEX@A9q@eC&XT~+WdC7MG>NRSCl|DqH5A1{h2R~e#H45R^Gb<3BB5f+Y9sJ zh)z?bzx6hT^(H?fb%zqBvvOp~n70v*GoMJ*+ekw5x+P^Jblo!a#INfEa4&}97V z@Pst`3wrvQX-uzkTLT7{Ha%7+scEbtXslFi^et=SN3?gwiLv==-05@h9Gmc9JuVfc z7NgIZ!abq(^;B_@RFV&qXmXi9FROvQJks~UzjJDC7kuM8=e_C#J$V1_25W^Ykc1!< z*+eQ2Y6U*Ix*6%RG#W^8V-u!mA>>KnNZz}EM_-I|zZ@Ja)V=Ci;?IZaEWjY}HgeqHpEmp1|9h*7Wa8oyAZjYJzQ0W_^+ppwQF@B6B!1tHcdxd8CjbGro# z_wbHVixE&K=HTq5PB>4mOK(dvSr8*$aPQc$>27WN;z2ng{T!+{(?5dsI;e;7Cu%33W3l9+7=IbZLiCZd{2?a?;K7z zf(hdM{A7lMwhmgPQQ4ltm?NGPbEt0&Y{%BHK+`D!x?d7X5Sn8IsRg1xua8j$rY&5D zEd24C!RIPuR>tuLt3&Mt%3th(e6vpKNQjw3!~DHH#mkx}#DcQGvGTkmx<>`ogFBP#khK zNb!Id+rLc@{C@eG%a9KpFFL&61gp*8 zRmIKF*>3Ockt3njgf_lysUl<2dZr0d3m~(hT(ByTUsr;VZuq%&1_frHubZ15 zuE*|P7?YZ;7tGa2g4`IalcZ3l{Q4bm7#L$eX3T4^&JI=^+L|Oyc6UHuIgkH1nLYD) zTp$lM+5k$#<4vKS8poPCW82w*g}BWa$Q{1dL{rDVch+adUYz8Emex5!*`O{DG;xiu@w5VruA{zb~QfIJ|r+G=I=0w+ZKmd*Y`pBa< zP>py=HDa`43ia_E(V4VutxJ;PPqDkKPj`bCShA7u{m&MpJQsaGfY!)oTjVkA_>nVg`wx0QbSz>HCHbT-K><|dfkr3kqmHhA zEJsk@$FdBFY3b|Rkl;)O<5za89a%nR_4kFt^(`GLC$N4G-|gv(t9)R~nb2C_-zY*c z9L8>N-r{1Qxnv#Dt~DoEy7F2CEi0#BvS;6QL0|QTsih#w8M}Sbr2NsfRrZcucSf=NGF&AW0YEVosL zo|Sijo$C*Wb^WQpkUZDB6LE%9T0wd5+Fc!!J@oZngdSUtQiQPJ(cnO5d@j{DaLWIA zrG%hT?#x_a^~ks$)tU6}Pz914oLiXpSDBk^Jw|Iluh}-YF(c5jSaJWHH-bu-iV|8v%A(g#Oq(1nD>cGUUHG}#DOBpt{ z)O@u6yHd7s$*1Vuj~fVEO-*0en9!T})wUZ52pRmTxt}GFQe=+`sWL35fr!-A-R@RD zJHma>(hyvgwWYaX_{mE64B^+$6ASk*+&72sbvAkcSpjEd0N$$XGn)B0m3XW(L&U*? z_g#;ZpS)bY(C)`ntGNp%bZAGHJuo!!FxHtv=iQfy>t()?-qJw}bWa<|4gbQR;`p

sMOGhO52q?~uAmTw$R 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 DA=;cG literal 0 HcmV?d00001 diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index 03f084c83ef..5d6a5ebf489 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -8,9 +8,9 @@ @pytest.mark.mpl_image_compare -def test_velo_pandas_dataframe(): +def test_velo_arrow_ellipse_pandas_df(): """ - Plot velocity vectors, crosses, and wedges from a pandas.DataFrame + Plot velocity arrow and confidence ellipse from a pandas.DataFrame """ fig = Figure() dframe = pd.DataFrame( @@ -28,13 +28,13 @@ def test_velo_pandas_dataframe(): fig.velo( data=dframe.to_numpy(), region=[-10, 10, -10, 10], - pen="0.25p,red", - facecolor="green", + pen="0.6p,red", + uncertainty_color="green", line=True, scaling="e0.2/0.39/18", frame="1g1", projection="x0.4/0.4", - vector="0.3p", + vector="0.3c+p1p+e+gred", verbose=True, ) return fig From dea4b1c41ce72a6b901b1bd0653f34945fd9016c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Sun, 8 Nov 2020 18:25:07 +0000 Subject: [PATCH 15/48] Apply suggestions from code review cleaning of the velo docstring Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/base_plotting.py | 151 ++++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 62 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 6c50ff61341..0a8581fc53f 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1973,75 +1973,102 @@ def velo(self, data=None, scaling=None, **kwargs): controlled by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i** , or **p** is appended). - "**e**\\ *velscale/confidence*\\ [\\ **+f**\\ font]" + "**e**\\ *velscale/confidence*\\ [**+f**\\ *font*]" - Velocity ellipses in (N,E) convention. velscale sets the - scaling of the velocity arrows. The confidence sets the + Velocity ellipses in (N,E) convention. *velscale* sets the + scaling of the velocity arrows. The *confidence* sets the 2-dimensional confidence limit for the ellipse, e.g., 0.95 for - 95% confidence ellipse. font sets the font and size of the text - [9p,Helvetica,black]. The ellipse will be filled with the color - or shade specified by the -G option [default transparent]. - The arrow and the circumference of the ellipse will be drawn - with the pen attributes specified by the -W option. Parameters - are expected to be in the following columns: - - **1,2**: longitude, latitude of station (-: option - interchanges order) **3,4**: eastward, northward velocity - (-: option interchanges order) **5,6**: uncertainty of - eastward, northward velocities (1-sigma, -: option - interchanges order) **7**: correlation between eastward - and northward components **8**: name of station (optional). + 95% confidence ellipse. *font* sets the font and size of the + text [9p,Helvetica,black]. The ellipse will be filled with the + color or shade specified by the *facecolor* option [default + transparent]. The arrow and the circumference of the ellipse + will be drawn with the pen attributes specified by the *pen* + option. Parameters are expected to be in the following columns: + + **1**,\\ **2**: + longitude, latitude of station (**-:** option interchanges + order) + **3**,\\ **4**: + eastward, northward velocity (**-:** option interchanges + order) + **5**,\\ **6**: + uncertainty of eastward, northward velocities (1-sigma) + (**-:** option interchanges order) + **7**: + correlation between eastward and northward components + **8**: + name of station (optional). "**n**\\ *barscale*" - Anisotropy bars. barscale sets the scaling of the bars. + Anisotropy bars. *barscale* sets the scaling of the bars. Parameters are expected to be in the following columns: - **1,2** : longitude, latitude of station (-: option - interchanges order) **3,4** : eastward, northward - components of anisotropy vector (-: option interchanges + + **1**,\\ **2**: + longitude, latitude of station (**-:** option interchanges order) + **3**,\\ **4**: + eastward, northward components of anisotropy vector (**-:** + option interchanges order) - "**r**\\ *velscale/confidence*\\ [\\ **+f**\\ font]" + "**r**\\ *velscale/confidence*\\ [**+f**\\ *font*]" - Velocity ellipses in rotated convention. velscale sets the - scaling of the velocity arrows. The confidence sets the + Velocity ellipses in rotated convention. *velscale* sets the + scaling of the velocity arrows. The *confidence* sets the 2-dimensional confidence limit for the ellipse, e.g., 0.95 for - 95% confidence ellipse. font sets the font and size of the text - [9p,Helvetica,black]. The ellipse will be filled with the color - or shade specified by the -G option [default transparent]. - The arrow and the circumference of the ellipse will be drawn - with the pen attributes specified by the -W option. Parameters - are expected to be in the following columns: - **1,2**: longitude, latitude, of station (-: option - interchanges order) **3,4**: eastward, northward velocity - (-: option interchanges order) **5,6**: semi-major, - semi-minor axes **7**: counter-clockwise angle, in degrees, - from horizontal axis to major axis of ellipse. 8: name of - station (optional) - - "**w**\\ *wedgescale/wedgemag*" - - Rotational wedges. wedgescale sets the size of the wedges. - Values are multiplied by wedgemag before plotting. For example, - setting wedgemag to 1.e7 works well for rotations of the order - of 100 nanoradians/yr. Use **-G** to set the fill color or - shade for the wedge, and **-E** to set the color or shade for - the uncertainty. Parameters are expected to be in the - following columns: - **1,2**: longitude, latitude, of station (-: option - interchanges order) **3**: rotation in radians - **4**: rotation uncertainty in radians + 95% confidence ellipse. *font* sets the font and size of the + text [9p,Helvetica,black]. The ellipse will be filled with the + color or shade specified by the *facecolor* option [default + transparent]. The arrow and the circumference of the ellipse + will be drawn with the pen attributes specified by the *pen* + option. Parameters are expected to be in the following columns: + + **1**,\\ **2**: + longitude, latitude, of station (**-:** option interchanges + order) + **3**,\\ **4**: + eastward, northward velocity (**-:** option interchanges + order) + **5**,\\ **6**: + semi-major, semi-minor axes + **7**: + counter-clockwise angle, in degrees, from horizontal axis + to major axis of ellipse. + **8**: + name of station (optional) + + Rotational wedges. *wedgescale* sets the size of the wedges. + Values are multiplied by *wedgemag* before plotting. For + example, setting *wedgemag* to 1.e7 works well for rotations of + the order of 100 nanoradians/yr. Use **facecolor** to set the + fill color or shade for the wedge, and **uncertainty_color** + to set the color or shade for the uncertainty. Parameters are + expected to be in the following columns: + + **1**,\\ **2**: + longitude, latitude, of station (**-:** option interchanges + order) + **3**: + rotation in radians + **4**: + rotation uncertainty in radians "**x**\\ *cross_scale*" - gives Strain crosses. cross_scale sets the size of the cross. + gives Strain crosses. *cross_scale* sets the size of the cross. Parameters are expected to be in the following columns: - **1,2**: longitude, latitude, of station - (-: option interchanges order) 3: eps1, the most - extensional eigenvalue of strain tensor, with extension - taken positive. **4**: eps2, the most compressional - eigenvalue of strain tensor, with extension taken positive. - **5**: azimuth of eps2 in degrees CW from North. + + **1**,\\ **2**: + longitude, latitude, of station (**-:** option interchanges + order) + **3**: + eps1, the most extensional eigenvalue of strain tensor, + with extension taken positive. + **4**: + eps2, the most compressional eigenvalue of strain tensor, + with extension taken positive. + **5**: + azimuth of eps2 in degrees CW from North. Other Parameters @@ -2057,14 +2084,14 @@ def velo(self, data=None, scaling=None, **kwargs): rescale : str can be used to rescale the uncertainties of velocities - (-Se and -Sr) and rotations (-Sw). - Can be combined with the confidence variable. + (``scaling='e'`` and ``scaling='r'``) and rotations + (``scaling='w'``). Can be combined with the confidence variable. uncertainty_color : str Sets the color or shade used for filling uncertainty wedges - (-Sw) or velocity error ellipses (-Se or -Sr). [If -E is not - specified, the uncertainty regions will be transparent]. - More details on + (``scaling='w'``) or velocity error ellipses (``scaling='e'`` or + ``scaling='r'``). [If *uncertainty_color* is not specified, the + uncertainty regions will be transparent]. More details on :gmt-docs:`cookbook/features.html#gfill-attrib`. facecolor : str @@ -2074,11 +2101,11 @@ def velo(self, data=None, scaling=None, **kwargs): line: str Draw lines. Ellipses and fault planes will have their outlines - drawn using current pen (see -W). + drawn using current pen (see *pen*). no_clip: str Do NOT skip symbols that fall outside the frame boundary specified - by -R. [Default plots symbols inside frame only]. + by *region*. [Default plots symbols inside frame only]. pen : str Set pen attributes for velocity arrows, ellipse circumference and From c908e7800b751d498e52dd21289490536cb09834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Sun, 8 Nov 2020 18:34:12 +0000 Subject: [PATCH 16/48] Apply suggestions from code review enable text annotation support Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/base_plotting.py | 7 ++++++- pygmt/tests/test_velo.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 0a8581fc53f..61bf27f2116 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2143,7 +2143,12 @@ def velo(self, data=None, scaling=None, **kwargs): if kind == "file": file_context = dummy_context(data) elif kind == "matrix": - file_context = lib.virtualfile_from_matrix(data) + if pd.api.types.is_numeric_dtype(data): + file_context = lib.virtualfile_from_matrix(data) + else: + file_context = lib.virtualfile_from_vectors( + *[data[column] for column in data] + ) with file_context as fname: arg_str = " ".join([fname, build_arg_string(kwargs)]) diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index 5d6a5ebf489..e44a761ff95 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -22,7 +22,7 @@ def test_velo_arrow_ellipse_pandas_df(): "Esig": [4, 0, 4, 6, 6, 6], "Nsig": [6, 0, 6, 4, 4, 4], "CorEN": [0.5, 0.5, 0.5, 0.5, -0.5, -0.5], - # "SITE": ["4x6", "3x3", "NaN", "6x4", "-6x4", "6x-4"], + "SITE": ["4x6", "3x3", "NaN", "6x4", "-6x4", "6x-4"], } ) fig.velo( From 6e3076a52e140448bf5fa2190d6cd16178d170cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Sun, 8 Nov 2020 18:35:12 +0000 Subject: [PATCH 17/48] temporarily disable pylint check as base_plotting.py exceed 2000 lines Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/base_plotting.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 61bf27f2116..c8a0b044e28 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2153,3 +2153,5 @@ def velo(self, data=None, scaling=None, **kwargs): with file_context as fname: arg_str = " ".join([fname, build_arg_string(kwargs)]) lib.call_module("velo", arg_str) + +# pylint: disable=too-many-lines From e5de366e4bff0acf78f1832cf5c708a751bc3ce3 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Sun, 8 Nov 2020 18:50:06 +0000 Subject: [PATCH 18/48] edit gallery example to add text --- examples/gallery/plot/velo_arrow_ellipse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/gallery/plot/velo_arrow_ellipse.py b/examples/gallery/plot/velo_arrow_ellipse.py index ad64bde8bb0..6bbdc82e34e 100644 --- a/examples/gallery/plot/velo_arrow_ellipse.py +++ b/examples/gallery/plot/velo_arrow_ellipse.py @@ -23,7 +23,7 @@ "Esig": [4, 0, 4, 6, 6, 6], "Nsig": [6, 0, 6, 4, 4, 4], "CorEN": [0.5, 0.5, 0.5, 0.5, -0.5, -0.5], - # "SITE": ["4x6", "3x3", "NaN", "6x4", "-6x4", "6x-4"], + "SITE": ["4x6", "3x3", "NaN", "6x4", "-6x4", "6x-4"], } ) fig.velo( From 76c9b28c1562e75fdb4ef88bf8f6d2a21f3f9643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Mon, 9 Nov 2020 09:50:28 +0000 Subject: [PATCH 19/48] Apply suggestions from code review remove numpy.array format Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- examples/gallery/plot/velo_arrow_ellipse.py | 2 +- pygmt/base_plotting.py | 2 +- pygmt/tests/test_velo.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/gallery/plot/velo_arrow_ellipse.py b/examples/gallery/plot/velo_arrow_ellipse.py index 6bbdc82e34e..568aa0328fb 100644 --- a/examples/gallery/plot/velo_arrow_ellipse.py +++ b/examples/gallery/plot/velo_arrow_ellipse.py @@ -27,7 +27,7 @@ } ) fig.velo( - data=dframe.to_numpy(), + data=dframe, region=[-10, 10, -10, 10], pen="0.6p,red", uncertainty_color="green", diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 644b0927074..7d97dc30bcc 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1962,7 +1962,7 @@ def velo(self, data=None, scaling=None, **kwargs): Parameters ---------- - data : str or np.ndarray or pandas.DataFrame + data : str or pandas.DataFrame Pass in either a file name, a 2D numpy array, or a pandas dataframe table. diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index e44a761ff95..fb5349c8417 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -26,7 +26,7 @@ def test_velo_arrow_ellipse_pandas_df(): } ) fig.velo( - data=dframe.to_numpy(), + data=dframe, region=[-10, 10, -10, 10], pen="0.6p,red", uncertainty_color="green", From 7dccfa95b2c5bd7032dd687cdd5534115a718f94 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Mon, 9 Nov 2020 10:17:16 +0000 Subject: [PATCH 20/48] update baseline test image --- .../test_velo_arrow_ellipse_pandas_df.png | Bin 41066 -> 47163 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png b/pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png index c49f5f97f2d1d0a69b2784aa3619962d188ec80a..4b9089f3bf87b9d7128e9ae15e38e2db7376e331 100644 GIT binary patch literal 47163 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

sMOGhO52q?~uAmTw$R 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 DA=;cG From 1fe70054bfcdb12d8f58becf4e1d73064e7d1e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Mon, 9 Nov 2020 19:15:07 +0000 Subject: [PATCH 21/48] Update examples/gallery/plot/velo_arrow_ellipse.py Co-authored-by: Dongdong Tian --- examples/gallery/plot/velo_arrow_ellipse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/gallery/plot/velo_arrow_ellipse.py b/examples/gallery/plot/velo_arrow_ellipse.py index 568aa0328fb..aaea77f938c 100644 --- a/examples/gallery/plot/velo_arrow_ellipse.py +++ b/examples/gallery/plot/velo_arrow_ellipse.py @@ -1,6 +1,6 @@ """ Velocity arrows and confidence ellipse ----------------- +-------------------------------------- The :meth:`pygmt.Figure.velo` method can be used to plot mean velocity arrow and confidence ellipse on a map. From e2e956c3dd5fe425bc2036150888209a8c4fbff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Houpert?= <10154151+lhoupert@users.noreply.github.com> Date: Thu, 12 Nov 2020 12:19:36 +0000 Subject: [PATCH 22/48] Apply suggestions from code review Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> --- pygmt/base_plotting.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 7d97dc30bcc..d41ce932162 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1945,7 +1945,7 @@ def update_pointers(data_pointers): t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") - def velo(self, data=None, scaling=None, **kwargs): + def velo(self, data=None, **kwargs): """ Plot velocity vectors, crosses, and wedges @@ -1962,9 +1962,10 @@ def velo(self, data=None, scaling=None, **kwargs): Parameters ---------- - data : str or pandas.DataFrame + data : str or np.ndarray or pandas.DataFrame Pass in either a file name, a 2D numpy array, or a pandas dataframe - table. + table. Note that text columns are only supported with file or + pandas dataframe inputs. {J} From 836413476df6c70b12981de448cbab3dd6c4a589 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Thu, 12 Nov 2020 12:54:24 +0000 Subject: [PATCH 23/48] detect data type --- pygmt/base_plotting.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index d41ce932162..d85b71870d7 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2150,10 +2150,18 @@ def velo(self, data=None, **kwargs): elif kind == "matrix": if pd.api.types.is_numeric_dtype(data): file_context = lib.virtualfile_from_matrix(data) - else: + elif isinstance(data,np.ndarray): + raise GMTInvalidInput( + "Text columns are not supported with numpy array. " + "They are only supported with file or " + "pandas dataframe inputs." + ) + elif isinstance(data,pd.core.frame.DataFrame): file_context = lib.virtualfile_from_vectors( *[data[column] for column in data] ) + else: + raise GMTInvalidInput("Unrecognized data type: {}".format(type(data))) with file_context as fname: arg_str = " ".join([fname, build_arg_string(kwargs)]) From 7a9de97f3236dd85e280287484430eb80545979c Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Thu, 12 Nov 2020 13:03:35 +0000 Subject: [PATCH 24/48] remove scaling as alias --- pygmt/base_plotting.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index d85b71870d7..abbd329bb42 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1935,7 +1935,6 @@ def update_pointers(data_pointers): L="line", N="no_clip", R="region", - S="scaling", U="timestamp", V="verbose", W="pen", @@ -1945,7 +1944,7 @@ def update_pointers(data_pointers): t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") - def velo(self, data=None, **kwargs): + def velo(self, data=None, scaling=None, **kwargs): """ Plot velocity vectors, crosses, and wedges @@ -2139,7 +2138,7 @@ def velo(self, data=None, **kwargs): if scaling is not None: if not isinstance(scaling,str): raise GMTInvalidInput( - "scaling has to be a string." + "Scaling is a requirred argument and has to be a string." ) extra_arrays.append(scaling) From 909827a612e2e09d14c0c8ce494e966cade49da8 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 13 Nov 2020 11:59:52 +0000 Subject: [PATCH 25/48] Revert "remove scaling as alias" This reverts commit 7a9de97f3236dd85e280287484430eb80545979c. --- pygmt/base_plotting.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index abbd329bb42..d85b71870d7 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1935,6 +1935,7 @@ def update_pointers(data_pointers): L="line", N="no_clip", R="region", + S="scaling", U="timestamp", V="verbose", W="pen", @@ -1944,7 +1945,7 @@ def update_pointers(data_pointers): t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") - def velo(self, data=None, scaling=None, **kwargs): + def velo(self, data=None, **kwargs): """ Plot velocity vectors, crosses, and wedges @@ -2138,7 +2139,7 @@ def velo(self, data=None, scaling=None, **kwargs): if scaling is not None: if not isinstance(scaling,str): raise GMTInvalidInput( - "Scaling is a requirred argument and has to be a string." + "scaling has to be a string." ) extra_arrays.append(scaling) From 1e5fe88aa820c8e0123fbdde88b3b8d838883bf9 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 13 Nov 2020 12:19:19 +0000 Subject: [PATCH 26/48] raise error if alias S is not defined --- pygmt/base_plotting.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index d85b71870d7..4db8071a2d9 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2136,12 +2136,10 @@ def velo(self, data=None, **kwargs): extra_arrays.append(kwargs["G"]) del kwargs["G"] - if scaling is not None: - if not isinstance(scaling,str): + if "S" in kwargs and not isinstance(kwargs["S"],str): raise GMTInvalidInput( - "scaling has to be a string." + "Scaling is a required and has to be a string." ) - extra_arrays.append(scaling) with Session() as lib: # Choose how data will be passed in to the module From cfcae90a0ae8591b667a6d5f46e62b1b69b1d704 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 13 Nov 2020 14:09:59 +0000 Subject: [PATCH 27/48] edit function arguments --- pygmt/base_plotting.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 4db8071a2d9..74161c30ea5 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -1945,7 +1945,7 @@ def update_pointers(data_pointers): t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") - def velo(self, data=None, **kwargs): + def velo(self, data=None, vector="+p1p+e", **kwargs): """ Plot velocity vectors, crosses, and wedges @@ -1953,7 +1953,7 @@ def velo(self, data=None, **kwargs): plot velocity arrows on a map. Most options are the same as for plot, except *scaling*. - Must provide *data* and *scaling*. + Must provide *data*, *projection*, *region* and *scaling*. Full option list at :gmt-docs:`supplements/geodesy/velo.html` @@ -2079,8 +2079,9 @@ def velo(self, data=None, **kwargs): Other Parameters ---------------- vector : bool or str - Modify vector parameters. For vector heads, append vector head size - [Default is 9p]. For specifying additional attributes, see + Modify vector parameters. By defaul, the vector head outline is + drawn (+p) and a vector head is placed at the end of the vector path + (+e). For specifying additional attributes, see :gmt-docs:`supplements/geodesy/velo.html#vector-attributes`. {B} @@ -2127,18 +2128,10 @@ def velo(self, data=None, **kwargs): kind = data_kind(data) - extra_arrays = [] - if "G" in kwargs and not isinstance(kwargs["G"], str): - if kind != "vectors": - raise GMTInvalidInput( - "Can't use arrays for color if data is matrix or file." - ) - extra_arrays.append(kwargs["G"]) - del kwargs["G"] - if "S" in kwargs and not isinstance(kwargs["S"],str): + if "S" not in kwargs or ( "S" in kwargs and not isinstance(kwargs["S"],str)): raise GMTInvalidInput( - "Scaling is a required and has to be a string." + "Scaling is a required argument and has to be a string." ) with Session() as lib: @@ -2159,7 +2152,7 @@ def velo(self, data=None, **kwargs): *[data[column] for column in data] ) else: - raise GMTInvalidInput("Unrecognized data type: {}".format(type(data))) + raise GMTInvalidInput(f"Unrecognized data type: {type(data)}") with file_context as fname: arg_str = " ".join([fname, build_arg_string(kwargs)]) From 92f94f199cf86e314c6725aacd89c069d2289260 Mon Sep 17 00:00:00 2001 From: Loic Houpert <10154151+lhoupert@users.noreply.github.com> Date: Fri, 13 Nov 2020 14:17:03 +0000 Subject: [PATCH 28/48] edit dataframe check --- pygmt/base_plotting.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 74161c30ea5..e70587862b8 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2147,7 +2147,7 @@ def velo(self, data=None, vector="+p1p+e", **kwargs): "They are only supported with file or " "pandas dataframe inputs." ) - elif isinstance(data,pd.core.frame.DataFrame): + elif type(data).__name__.lower().find('dataframe') != 1: file_context = lib.virtualfile_from_vectors( *[data[column] for column in data] ) From 437e415adb5c645d6a41253852d471eaf7cac98b Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 5 Apr 2021 14:45:38 +1200 Subject: [PATCH 29/48] Fix velo import errors and do some light code linting --- pygmt/figure.py | 1 + pygmt/src/__init__.py | 1 + pygmt/src/velo.py | 23 ++++++++++++++++++++--- pygmt/tests/test_velo.py | 3 +-- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/pygmt/figure.py b/pygmt/figure.py index db152e0d27c..c1f4977637f 100644 --- a/pygmt/figure.py +++ b/pygmt/figure.py @@ -395,4 +395,5 @@ def _repr_html_(self): solar, subplot, text, + velo, ) diff --git a/pygmt/src/__init__.py b/pygmt/src/__init__.py index 7911195bf57..755c1a3dd35 100644 --- a/pygmt/src/__init__.py +++ b/pygmt/src/__init__.py @@ -31,6 +31,7 @@ from pygmt.src.subplot import set_panel, subplot from pygmt.src.surface import surface from pygmt.src.text import text_ as text # "text" is an argument within "text_" +from pygmt.src.velo import velo from pygmt.src.which import which from pygmt.src.x2sys_cross import x2sys_cross from pygmt.src.x2sys_init import x2sys_init diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 88c4f32c8c6..5a0642a54a4 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -1,3 +1,20 @@ +""" +velo - Plot velocity vectors, crosses, anisotropy bars and wedges. +""" +import numpy as np +import pandas as pd +from pygmt.clib import Session +from pygmt.exceptions import GMTInvalidInput +from pygmt.helpers import ( + build_arg_string, + data_kind, + dummy_context, + fmt_docstring, + kwargs_to_strings, + use_alias, +) + + @fmt_docstring @use_alias( A="vector", @@ -20,9 +37,9 @@ t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") -def velo(self, data=None, vector="+p1p+e", **kwargs): +def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused-argument """ - Plot velocity vectors, crosses, and wedges + Plot velocity vectors, crosses, and wedges. Reads data values from files, numpy array or pandas DataFrame and will plot velocity arrows on a map. Most options are the same as for plot, @@ -199,7 +216,7 @@ def velo(self, data=None, vector="+p1p+e", **kwargs): {p} {t} """ - kwargs = self._preprocess(**kwargs) + kwargs = self._preprocess(**kwargs) # pylint: disable=protected-access kind = data_kind(data) diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index fb5349c8417..b5292813ade 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -3,14 +3,13 @@ """ import pandas as pd import pytest - from pygmt import Figure @pytest.mark.mpl_image_compare def test_velo_arrow_ellipse_pandas_df(): """ - Plot velocity arrow and confidence ellipse from a pandas.DataFrame + Plot velocity arrow and confidence ellipse from a pandas.DataFrame. """ fig = Figure() dframe = pd.DataFrame( From dd24153658fef59ae4108f74eb082162f8a6330d Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 5 Apr 2021 16:13:05 +1200 Subject: [PATCH 30/48] Refactor velo to use virtualfile_from_data and add three more unit tests --- pygmt/src/velo.py | 35 +++------- .../test_velo_arrow_ellipse_pandas_df.png | Bin 47163 -> 0 bytes ...test_velo_numpy_array_numeric_only.png.dvc | 4 ++ .../test_velo_pandas_dataframe.png.dvc | 4 ++ pygmt/tests/test_velo.py | 66 +++++++++++++++--- 5 files changed, 71 insertions(+), 38 deletions(-) delete mode 100644 pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png create mode 100644 pygmt/tests/baseline/test_velo_numpy_array_numeric_only.png.dvc create mode 100644 pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 5a0642a54a4..9ac428eefe7 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -5,14 +5,7 @@ import pandas as pd from pygmt.clib import Session from pygmt.exceptions import GMTInvalidInput -from pygmt.helpers import ( - build_arg_string, - data_kind, - dummy_context, - fmt_docstring, - kwargs_to_strings, - use_alias, -) +from pygmt.helpers import build_arg_string, fmt_docstring, kwargs_to_strings, use_alias @fmt_docstring @@ -218,30 +211,18 @@ def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused- """ kwargs = self._preprocess(**kwargs) # pylint: disable=protected-access - kind = data_kind(data) - if "S" not in kwargs or ("S" in kwargs and not isinstance(kwargs["S"], str)): raise GMTInvalidInput("Scaling is a required argument and has to be a string.") + if isinstance(data, np.ndarray) and not pd.api.types.is_numeric_dtype(data): + raise GMTInvalidInput( + "Text columns are not supported with numpy.ndarray type inputs. " + "They are only supported with file or pandas.DataFrame inputs." + ) + with Session() as lib: # Choose how data will be passed in to the module - if kind == "file": - file_context = dummy_context(data) - elif kind == "matrix": - if pd.api.types.is_numeric_dtype(data): - file_context = lib.virtualfile_from_matrix(data) - elif isinstance(data, np.ndarray): - raise GMTInvalidInput( - "Text columns are not supported with numpy array. " - "They are only supported with file or " - "pandas dataframe inputs." - ) - elif type(data).__name__.lower().find("dataframe") != 1: - file_context = lib.virtualfile_from_vectors( - *[data[column] for column in data] - ) - else: - raise GMTInvalidInput(f"Unrecognized data type: {type(data)}") + file_context = lib.virtualfile_from_data(check_kind="vector", data=data) with file_context as fname: arg_str = " ".join([fname, build_arg_string(kwargs)]) diff --git a/pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png b/pygmt/tests/baseline/test_velo_arrow_ellipse_pandas_df.png deleted file mode 100644 index 4b9089f3bf87b9d7128e9ae15e38e2db7376e331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47163 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 Date: Mon, 5 Apr 2021 16:43:16 +1200 Subject: [PATCH 31/48] Alias panel (c) for velo, and lightly edit some docstrings --- doc/api/index.rst | 2 +- pygmt/src/velo.py | 40 ++++++++++++++-------------------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/doc/api/index.rst b/doc/api/index.rst index 33b56bae822..07aa5119c83 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -43,7 +43,7 @@ Plotting data and laying out the map: Figure.subplot Figure.text Figure.velo - + Color palette table generation: .. autosummary:: diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 9ac428eefe7..8145a0bd05c 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -26,20 +26,20 @@ W="pen", X="xshift", Y="yshift", + c="panel", p="perspective", t="transparency", ) @kwargs_to_strings(R="sequence", i="sequence_comma") def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused-argument """ - Plot velocity vectors, crosses, and wedges. + Plot velocity vectors, crosses, anisotropy bars and wedges. Reads data values from files, numpy array or pandas DataFrame and will plot velocity arrows on a map. Most options are the same as for plot, except *scaling*. - Must provide *data*, *projection*, *region* and *scaling*. - + Must provide *data* and *scaling*. Full option list at :gmt-docs:`supplements/geodesy/velo.html` @@ -47,14 +47,10 @@ def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused- Parameters ---------- - data : str or np.ndarray or pandas.DataFrame - Pass in either a file name, a 2D numpy array, or a pandas dataframe - table. Note that text columns are only supported with file or - pandas dataframe inputs. - - {J} - - {R} + data : str or numpy.ndarray or pandas.DataFrame + Either a file name, a 2D numpy array, or a pandas DataFrame with the + tabular data. Note that text columns are only supported with file or + pandas DataFrame inputs. scaling: str Selects the meaning of the columns in the data file and the figure @@ -160,52 +156,44 @@ def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused- **5**: azimuth of eps2 in degrees CW from North. - Other Parameters ---------------- vector : bool or str - Modify vector parameters. By defaul, the vector head outline is + Modify vector parameters. By default, the vector head outline is drawn (+p) and a vector head is placed at the end of the vector path (+e). For specifying additional attributes, see :gmt-docs:`supplements/geodesy/velo.html#vector-attributes`. - {B} - {CPT} - rescale : str can be used to rescale the uncertainties of velocities (``scaling='e'`` and ``scaling='r'``) and rotations (``scaling='w'``). Can be combined with the confidence variable. - uncertainty_color : str Sets the color or shade used for filling uncertainty wedges (``scaling='w'``) or velocity error ellipses (``scaling='e'`` or ``scaling='r'``). [If *uncertainty_color* is not specified, the uncertainty regions will be transparent]. More details on :gmt-docs:`cookbook/features.html#gfill-attrib`. - facecolor : str Select color or pattern for filling of symbols or polygons [Default is no fill]. More details on :gmt-docs:cookbook/features.html#gfill-attrib`. - + {J} line: str Draw lines. Ellipses and fault planes will have their outlines drawn using current pen (see *pen*). - no_clip: str Do NOT skip symbols that fall outside the frame boundary specified by *region*. [Default plots symbols inside frame only]. - - pen : str - Set pen attributes for velocity arrows, ellipse circumference and - fault plane edges. [Defaults: width = default, color = black, - style = solid]. - + {R} {U} {V} + pen : str + Set pen attributes for velocity arrows, ellipse circumference and fault + plane edges. [Default: width = default, color = black, style = solid]. {XY} + {c} {p} {t} """ From 90e9e0d20183e4517d27c6b9ff1664b66b607edf Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 5 Apr 2021 19:21:21 +1200 Subject: [PATCH 32/48] Alias scale (H), intensity (I) and zvalue (Z) from GMT 6.2.0 Update docstring to include new options in `velo` from the upcoming GMT 6.2.0 that were added in https://github.com/GenericMappingTools/gmt/pull/4970, https://github.com/GenericMappingTools/gmt/pull/4901, and https://github.com/GenericMappingTools/gmt/pull/4907. Removed the default vector="+p1p+e" argument, and formatted docstring to have nested lists to be nicer looking. --- pygmt/src/velo.py | 285 ++++++++++++++++++++++++++-------------------- 1 file changed, 160 insertions(+), 125 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 8145a0bd05c..1a94a4b3042 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -16,6 +16,8 @@ D="rescale", E="uncertainty_color", G="facecolor", + H="scale", + I="intensity", J="projection", L="line", N="no_clip", @@ -26,18 +28,21 @@ W="pen", X="xshift", Y="yshift", + Z="zvalue", c="panel", p="perspective", t="transparency", ) -@kwargs_to_strings(R="sequence", i="sequence_comma") -def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused-argument - """ +@kwargs_to_strings(R="sequence", c="sequence_comma", i="sequence_comma", p="sequence") +def velo(self, data=None, **kwargs): + r""" Plot velocity vectors, crosses, anisotropy bars and wedges. - Reads data values from files, numpy array or pandas DataFrame and will - plot velocity arrows on a map. Most options are the same as for plot, - except *scaling*. + Reads data values from files, numpy array or pandas DataFrame and will plot + the selected geodesy symbol on a map. You may choose from velocity vectors + and their uncertainties, rotational wedges and their uncertainties, + anisotropy bars, or strain crosses. Symbol fills or their outlines may be + colored based on constant parameters or via color lookup tables. Must provide *data* and *scaling*. @@ -54,145 +59,175 @@ def velo(self, data=None, vector="+p1p+e", **kwargs): # pylint: disable=unused- scaling: str Selects the meaning of the columns in the data file and the figure - to be plotted. In all cases, the scales are in data units per - length unit and sizes are in length units (default length unit is - controlled by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i** , or - **p** is appended). - - "**e**\\ *velscale/confidence*\\ [**+f**\\ *font*]" - - Velocity ellipses in (N,E) convention. *velscale* sets the - scaling of the velocity arrows. The *confidence* sets the - 2-dimensional confidence limit for the ellipse, e.g., 0.95 for - 95% confidence ellipse. *font* sets the font and size of the - text [9p,Helvetica,black]. The ellipse will be filled with the - color or shade specified by the *facecolor* option [default - transparent]. The arrow and the circumference of the ellipse - will be drawn with the pen attributes specified by the *pen* - option. Parameters are expected to be in the following columns: - - **1**,\\ **2**: - longitude, latitude of station (**-:** option interchanges - order) - **3**,\\ **4**: - eastward, northward velocity (**-:** option interchanges - order) - **5**,\\ **6**: - uncertainty of eastward, northward velocities (1-sigma) - (**-:** option interchanges order) - **7**: - correlation between eastward and northward components - **8**: - name of station (optional). - - "**n**\\ *barscale*" - - Anisotropy bars. *barscale* sets the scaling of the bars. - Parameters are expected to be in the following columns: - - **1**,\\ **2**: - longitude, latitude of station (**-:** option interchanges - order) - **3**,\\ **4**: - eastward, northward components of anisotropy vector (**-:** - option interchanges order) - - "**r**\\ *velscale/confidence*\\ [**+f**\\ *font*]" - - Velocity ellipses in rotated convention. *velscale* sets the - scaling of the velocity arrows. The *confidence* sets the - 2-dimensional confidence limit for the ellipse, e.g., 0.95 for - 95% confidence ellipse. *font* sets the font and size of the - text [9p,Helvetica,black]. The ellipse will be filled with the - color or shade specified by the *facecolor* option [default - transparent]. The arrow and the circumference of the ellipse - will be drawn with the pen attributes specified by the *pen* - option. Parameters are expected to be in the following columns: - - **1**,\\ **2**: - longitude, latitude, of station (**-:** option interchanges - order) - **3**,\\ **4**: - eastward, northward velocity (**-:** option interchanges - order) - **5**,\\ **6**: - semi-major, semi-minor axes - **7**: - counter-clockwise angle, in degrees, from horizontal axis - to major axis of ellipse. - **8**: - name of station (optional) - - Rotational wedges. *wedgescale* sets the size of the wedges. - Values are multiplied by *wedgemag* before plotting. For - example, setting *wedgemag* to 1.e7 works well for rotations of - the order of 100 nanoradians/yr. Use **facecolor** to set the - fill color or shade for the wedge, and **uncertainty_color** - to set the color or shade for the uncertainty. Parameters are - expected to be in the following columns: - - **1**,\\ **2**: - longitude, latitude, of station (**-:** option interchanges - order) - **3**: - rotation in radians - **4**: - rotation uncertainty in radians - - "**x**\\ *cross_scale*" - - gives Strain crosses. *cross_scale* sets the size of the cross. - Parameters are expected to be in the following columns: - - **1**,\\ **2**: - longitude, latitude, of station (**-:** option interchanges - order) - **3**: - eps1, the most extensional eigenvalue of strain tensor, - with extension taken positive. - **4**: - eps2, the most compressional eigenvalue of strain tensor, - with extension taken positive. - **5**: - azimuth of eps2 in degrees CW from North. - - Other Parameters - ---------------- + to be plotted. In all cases, the scales are in data units per length + unit and sizes are in length units (default length unit is controlled + by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i** , or **p** is + appended). + + - **e**\ [*velscale*/]\ *confidence*\ [**+f**\ *font*] + + Velocity ellipses in (N,E) convention. The *velscale* sets the + scaling of the velocity arrows. If *velscale* is not given the we + read it from the data file as an extra column. The *confidence* sets + the 2-dimensional confidence limit for the ellipse, e.g., 0.95 for + 95% confidence ellipse. Use **+f** to set the font and size of the + text [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate + labeling. The arrow will be drawn with the pen attributes specified + by the ``pen`` option and arrow-head can be colored via + ``facecolor``. The ellipse will be filled with the color or shade + specified by the ``uncertainty_color`` option [Default is + transparent], and its outline will be drawn if ``line`` is selected + using the pen selected (by ``pen`` if not given by ``line``). + Parameters are expected to be in the following columns: + + - **1**,\ **2**: longitude, latitude of station (**-:** option + interchanges order) + - **3**,\ **4**: eastward, northward velocity (**-:** option + interchanges order) + - **5**,\ **6**: uncertainty of eastward, northward velocities + (1-sigma) (**-:** option interchanges order) + - **7**: correlation between eastward and northward components + - **Trailing text**: name of station (optional) + + - **n**\ [*barscale*] + + Anisotropy bars. *barscale* sets the scaling of the bars. If + *barscale* is not given the we read it from the data file as an extra + column. Parameters are expected to be in the following columns: + + - **1**,\ **2**: longitude, latitude of station (**-:** option + interchanges order) + - **3**,\ **4**: eastward, northward components of anisotropy + vector (**-:** option interchanges order) + + - **r**\ [*velscale*/]\ *confidence*\ [**+f**\ *font*] + + Velocity ellipses in rotated convention. The *velscale* sets the + scaling of the velocity arrows. If *velscale* is not given then we + read it from the data file as an extra column. The *confidence* sets + the 2-dimensional confidence limit for the ellipse, e.g., 0.95 for + 95% confidence ellipse. Use **+f** to set the font and size of the + text [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate + labeling. The arrow will be drawn with the pen attributes specified + by the ``pen`` option and arrow-head can be colored via + ``facecolor``. The ellipse will be filled with the color or shade + specified by the ``uncertainty_color`` option [Default is + transparent], and its outline will be drawn if ``line`` is selected + using the pen selected (by ``pen`` if not given by ``line``). + Parameters are expected to be in the following columns: + + - **1**,\ **2**: longitude, latitude of station (**-:** option + interchanges order) + - **3**,\ **4**: eastward, northward velocity (**-:** option + interchanges order) + - **5**,\ **6**: semi-major, semi-minor axes + - **7**: counter-clockwise angle, in degrees, from horizontal axis + to major axis of ellipse. + - **Trailing text**: name of station (optional) + + - **w**\ [*wedgescale*/]\ *wedgemag* + + Rotational wedges. The *wedgescale* sets the size of the wedges. If + *wedgescale* is not given the we read it from the data file as an + extra column. Rotation values are multiplied by *wedgemag* before + plotting. For example, setting *wedgemag* to 1.e7 works well for + rotations of the order of 100 nanoradians/yr. Use ``facecolor`` to + set the fill color or shade for the wedge, and ``uncertainty_color`` + to set the color or shade for the uncertainty. Parameters are + expected to be in the following columns: + + - **1**,\ **2**: longitude, latitude of station (**-:** option + interchanges order) + - **3**: rotation in radians + - **4**: rotation uncertainty in radians + + - **x**\ [*cross_scale*] + + gives Strain crosses. The *cross_scale* sets the size of the cross. + If *cross_scale* is not given the we read it from the data file as an + extra column. Parameters are expected to be in the following columns: + + - **1**,\ **2**: longitude, latitude of station (**-:** option + interchanges order) + - **3**: eps1, the most extensional eigenvalue of strain tensor, with + extension taken positive. + - **4**: eps2, the most compressional eigenvalue of strain tensor, + with extension taken positive. + - **5**: azimuth of eps2 in degrees CW from North. vector : bool or str - Modify vector parameters. By default, the vector head outline is - drawn (+p) and a vector head is placed at the end of the vector path - (+e). For specifying additional attributes, see - :gmt-docs:`supplements/geodesy/velo.html#vector-attributes`. + Modify vector parameters. For vector heads, append vector head *size* + [Default is 9p]. See + :gmt-docs:`supplements/geodesy/velo.html#vector-attributes` for + specifying additional attributes. {B} {CPT} rescale : str can be used to rescale the uncertainties of velocities (``scaling='e'`` and ``scaling='r'``) and rotations - (``scaling='w'``). Can be combined with the confidence variable. + (``scaling='w'``). Can be combined with the ``confidence`` variable. uncertainty_color : str Sets the color or shade used for filling uncertainty wedges (``scaling='w'``) or velocity error ellipses (``scaling='e'`` or - ``scaling='r'``). [If *uncertainty_color* is not specified, the - uncertainty regions will be transparent]. More details on - :gmt-docs:`cookbook/features.html#gfill-attrib`. + ``scaling='r'``). [If ``uncertainty_color`` is not specified, the + uncertainty regions will be transparent. **Note**: Using ``cmap`` and + ``zvalue='+e'`` will update the uncertainty fill color based on the + selected measure in ``zvalue`` [magnitude error]. More details at + :gmt-docs:cookbook/features.html#gfill-attrib`. facecolor : str - Select color or pattern for filling of symbols or polygons - [Default is no fill]. More details on + Select color or pattern for filling of symbols [Default is no fill]. + **Note**: Using ``cmap`` (and optionally ``zvalue``) will update the + symbol fill color based on the selected measure in ``zvalue`` + [magnitude]. More details at :gmt-docs:cookbook/features.html#gfill-attrib`. + scale : float or bool + [*scale*]. + Scale symbol sizes and pen widths on a per-record basis using the + *scale* read from the data set, given as the first column after the + (optional) *z* and *size* columns [Default is no scaling]. The symbol + size is either provided by ``scaling`` or via the input *size* column. + Alternatively, append a constant *scale* that should be used instead of + reading a scale column. + intensity : float or bool + *intens*. + Use the supplied *intens* value (nominally in the -1 to +1 range) to + modulate the symbol fill color by simulating illumination [Default is + none]. If no intensity is provided we will instead read *intens* from + an extra data column after the required input columns determined by + ``scaling``. {J} line: str - Draw lines. Ellipses and fault planes will have their outlines - drawn using current pen (see *pen*). - no_clip: str + [*pen*\ [**+c**\ [**f**\|\ **l**]]]. + Draw lines. Ellipses and rotational wedges will have their outlines + drawn using current pen (see ``pen``). Alternatively, append a + separate pen to use for the error outlines. If the modifier **+cl** is + appended then the color of the pen are updated from the CPT (see + ``cmap``). If instead modifier **+cf** is appended then the color from + the cpt file is applied to error fill only [Default]. Use just **+c** + to set both pen and fill color. + no_clip: bool or str Do NOT skip symbols that fall outside the frame boundary specified - by *region*. [Default plots symbols inside frame only]. + by ``region``. [Default plots symbols inside frame only]. {R} {U} {V} pen : str + [*pen*][**+c**\ [**f**\|\ **l**]]. Set pen attributes for velocity arrows, ellipse circumference and fault - plane edges. [Default: width = default, color = black, style = solid]. + plane edges. [Defaults: width = default, color = black, style = solid]. + If the modifier **+cl** is appended then the color of the pen are + updated from the CPT (see ``cmap``). If instead modifier **+cf** is + appended then the color from the cpt file is applied to symbol fill + only [Default]. Use just **+c** to set both pen and fill color. {XY} + zvalue : str + [**m**\|\ **e**\|\ **n**\|\ **u**\ ][**+e**]. + Select the quantity that will be used with the CPT given via ``cmap`` + to set the fill color. Choose from **m**\ agnitude (vector magnitude + or rotation magnitude), **e**\ ast-west velocity, **n**\ orth-south + velocity, or **u**\ ser-supplied data column (supplied after the + required columns). To instead use the corresponding error estimates + (i.e., vector or rotation uncertainty) to lookup the color and paint + the error ellipse or wedge instead, append **+e**. {c} {p} {t} From d67bfcdfe0ed90b97d721eaec17fccd348c3d07f Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 6 Apr 2021 08:25:06 +1200 Subject: [PATCH 33/48] Fix typos and add intersphinx mappings Co-Authored-By: Michael Grund Co-Authored-By: Meghan Jones --- pygmt/src/velo.py | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 1a94a4b3042..2836da47688 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -38,13 +38,14 @@ def velo(self, data=None, **kwargs): r""" Plot velocity vectors, crosses, anisotropy bars and wedges. - Reads data values from files, numpy array or pandas DataFrame and will plot - the selected geodesy symbol on a map. You may choose from velocity vectors + Reads data values from files, :class:`numpy.ndarray` or + :class:`pandas.DataFrame` and will plot the selected geodesy symbol on a + map. You may choose from velocity vectors and their uncertainties, rotational wedges and their uncertainties, anisotropy bars, or strain crosses. Symbol fills or their outlines may be colored based on constant parameters or via color lookup tables. - Must provide *data* and *scaling*. + Must provide ``data`` and ``scaling``. Full option list at :gmt-docs:`supplements/geodesy/velo.html` @@ -53,9 +54,9 @@ def velo(self, data=None, **kwargs): Parameters ---------- data : str or numpy.ndarray or pandas.DataFrame - Either a file name, a 2D numpy array, or a pandas DataFrame with the - tabular data. Note that text columns are only supported with file or - pandas DataFrame inputs. + Either a file name, a 2D :class:`numpy.ndarray` or a + :class:`pandas.DataFrame` with the tabular data. Note that text columns + are only supported with file or pandas DataFrame inputs. scaling: str Selects the meaning of the columns in the data file and the figure @@ -67,13 +68,13 @@ def velo(self, data=None, **kwargs): - **e**\ [*velscale*/]\ *confidence*\ [**+f**\ *font*] Velocity ellipses in (N,E) convention. The *velscale* sets the - scaling of the velocity arrows. If *velscale* is not given the we + scaling of the velocity arrows. If *velscale* is not given then we read it from the data file as an extra column. The *confidence* sets - the 2-dimensional confidence limit for the ellipse, e.g., 0.95 for - 95% confidence ellipse. Use **+f** to set the font and size of the - text [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate + the 2-dimensional confidence limit for the ellipse, e.g. 0.95 for 95% + confidence ellipse. Use **+f** to set the font and size of the text + [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate labeling. The arrow will be drawn with the pen attributes specified - by the ``pen`` option and arrow-head can be colored via + by the ``pen`` option and the arrow-head can be colored via ``facecolor``. The ellipse will be filled with the color or shade specified by the ``uncertainty_color`` option [Default is transparent], and its outline will be drawn if ``line`` is selected @@ -92,8 +93,8 @@ def velo(self, data=None, **kwargs): - **n**\ [*barscale*] Anisotropy bars. *barscale* sets the scaling of the bars. If - *barscale* is not given the we read it from the data file as an extra - column. Parameters are expected to be in the following columns: + *barscale* is not given then we read it from the data file as an + extra column. Parameters are expected to be in the following columns: - **1**,\ **2**: longitude, latitude of station (**-:** option interchanges order) @@ -109,7 +110,7 @@ def velo(self, data=None, **kwargs): 95% confidence ellipse. Use **+f** to set the font and size of the text [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate labeling. The arrow will be drawn with the pen attributes specified - by the ``pen`` option and arrow-head can be colored via + by the ``pen`` option and the arrow-head can be colored via ``facecolor``. The ellipse will be filled with the color or shade specified by the ``uncertainty_color`` option [Default is transparent], and its outline will be drawn if ``line`` is selected @@ -128,7 +129,7 @@ def velo(self, data=None, **kwargs): - **w**\ [*wedgescale*/]\ *wedgemag* Rotational wedges. The *wedgescale* sets the size of the wedges. If - *wedgescale* is not given the we read it from the data file as an + *wedgescale* is not given then we read it from the data file as an extra column. Rotation values are multiplied by *wedgemag* before plotting. For example, setting *wedgemag* to 1.e7 works well for rotations of the order of 100 nanoradians/yr. Use ``facecolor`` to @@ -144,8 +145,9 @@ def velo(self, data=None, **kwargs): - **x**\ [*cross_scale*] gives Strain crosses. The *cross_scale* sets the size of the cross. - If *cross_scale* is not given the we read it from the data file as an - extra column. Parameters are expected to be in the following columns: + If *cross_scale* is not given then we read it from the data file as + an extra column. Parameters are expected to be in the following + columns: - **1**,\ **2**: longitude, latitude of station (**-:** option interchanges order) @@ -198,9 +200,9 @@ def velo(self, data=None, **kwargs): line: str [*pen*\ [**+c**\ [**f**\|\ **l**]]]. Draw lines. Ellipses and rotational wedges will have their outlines - drawn using current pen (see ``pen``). Alternatively, append a + drawn using the current pen (see ``pen``). Alternatively, append a separate pen to use for the error outlines. If the modifier **+cl** is - appended then the color of the pen are updated from the CPT (see + appended then the color of the pen is updated from the CPT (see ``cmap``). If instead modifier **+cf** is appended then the color from the cpt file is applied to error fill only [Default]. Use just **+c** to set both pen and fill color. From c90ec47a8c2b55ea9afa1766349af678d6027d29 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 6 Apr 2021 08:27:57 +1200 Subject: [PATCH 34/48] Remove dash-colon option to interchange column order --- pygmt/src/velo.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 2836da47688..9d9a9ea6003 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -81,12 +81,10 @@ def velo(self, data=None, **kwargs): using the pen selected (by ``pen`` if not given by ``line``). Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station (**-:** option - interchanges order) - - **3**,\ **4**: eastward, northward velocity (**-:** option - interchanges order) + - **1**,\ **2**: longitude, latitude of station + - **3**,\ **4**: eastward, northward velocity - **5**,\ **6**: uncertainty of eastward, northward velocities - (1-sigma) (**-:** option interchanges order) + (1-sigma) - **7**: correlation between eastward and northward components - **Trailing text**: name of station (optional) @@ -96,10 +94,9 @@ def velo(self, data=None, **kwargs): *barscale* is not given then we read it from the data file as an extra column. Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station (**-:** option - interchanges order) + - **1**,\ **2**: longitude, latitude of station - **3**,\ **4**: eastward, northward components of anisotropy - vector (**-:** option interchanges order) + vector - **r**\ [*velscale*/]\ *confidence*\ [**+f**\ *font*] @@ -117,10 +114,8 @@ def velo(self, data=None, **kwargs): using the pen selected (by ``pen`` if not given by ``line``). Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station (**-:** option - interchanges order) - - **3**,\ **4**: eastward, northward velocity (**-:** option - interchanges order) + - **1**,\ **2**: longitude, latitude of station + - **3**,\ **4**: eastward, northward velocity - **5**,\ **6**: semi-major, semi-minor axes - **7**: counter-clockwise angle, in degrees, from horizontal axis to major axis of ellipse. @@ -137,8 +132,7 @@ def velo(self, data=None, **kwargs): to set the color or shade for the uncertainty. Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station (**-:** option - interchanges order) + - **1**,\ **2**: longitude, latitude of station - **3**: rotation in radians - **4**: rotation uncertainty in radians @@ -149,8 +143,7 @@ def velo(self, data=None, **kwargs): an extra column. Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station (**-:** option - interchanges order) + - **1**,\ **2**: longitude, latitude of station - **3**: eps1, the most extensional eigenvalue of strain tensor, with extension taken positive. - **4**: eps2, the most compressional eigenvalue of strain tensor, From 80743aa7761593594abe3b5cd345854bd9f4b16c Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:02:17 +1200 Subject: [PATCH 35/48] [skip ci] Fix a few more typos and indentation issues Co-Authored-By: Michael Grund --- pygmt/src/velo.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 9d9a9ea6003..767e8e62843 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -62,7 +62,7 @@ def velo(self, data=None, **kwargs): Selects the meaning of the columns in the data file and the figure to be plotted. In all cases, the scales are in data units per length unit and sizes are in length units (default length unit is controlled - by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i** , or **p** is + by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i**, or **p** is appended). - **e**\ [*velscale*/]\ *confidence*\ [**+f**\ *font*] @@ -103,9 +103,9 @@ def velo(self, data=None, **kwargs): Velocity ellipses in rotated convention. The *velscale* sets the scaling of the velocity arrows. If *velscale* is not given then we read it from the data file as an extra column. The *confidence* sets - the 2-dimensional confidence limit for the ellipse, e.g., 0.95 for - 95% confidence ellipse. Use **+f** to set the font and size of the - text [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate + the 2-dimensional confidence limit for the ellipse, e.g. 0.95 for 95% + confidence ellipse. Use **+f** to set the font and size of the text + [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate labeling. The arrow will be drawn with the pen attributes specified by the ``pen`` option and the arrow-head can be colored via ``facecolor``. The ellipse will be filled with the color or shade @@ -132,9 +132,9 @@ def velo(self, data=None, **kwargs): to set the color or shade for the uncertainty. Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station - - **3**: rotation in radians - - **4**: rotation uncertainty in radians + - **1**,\ **2**: longitude, latitude of station + - **3**: rotation in radians + - **4**: rotation uncertainty in radians - **x**\ [*cross_scale*] @@ -143,12 +143,13 @@ def velo(self, data=None, **kwargs): an extra column. Parameters are expected to be in the following columns: - - **1**,\ **2**: longitude, latitude of station - - **3**: eps1, the most extensional eigenvalue of strain tensor, with - extension taken positive. - - **4**: eps2, the most compressional eigenvalue of strain tensor, - with extension taken positive. - - **5**: azimuth of eps2 in degrees CW from North. + - **1**,\ **2**: longitude, latitude of station + - **3**: eps1, the most extensional eigenvalue of strain tensor, + with extension taken positive. + - **4**: eps2, the most compressional eigenvalue of strain tensor, + with extension taken positive. + - **5**: azimuth of eps2 in degrees CW from North. + vector : bool or str Modify vector parameters. For vector heads, append vector head *size* [Default is 9p]. See From 2661e2c8e9390639833031acd7114c69e7df1b31 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:19:48 +1200 Subject: [PATCH 36/48] Update the frame, region, projection and color of velo example Co-Authored-By: Michael Grund --- examples/gallery/symbols/velo_arrow_ellipse.py | 14 ++++++-------- pygmt/tests/test_velo.py | 8 ++++---- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/examples/gallery/symbols/velo_arrow_ellipse.py b/examples/gallery/symbols/velo_arrow_ellipse.py index aaea77f938c..a5e7e944eed 100644 --- a/examples/gallery/symbols/velo_arrow_ellipse.py +++ b/examples/gallery/symbols/velo_arrow_ellipse.py @@ -13,8 +13,7 @@ import pygmt fig = pygmt.Figure() - -dframe = pd.DataFrame( +df = pd.DataFrame( data={ "Long.": [0, -8, 0, -5, 5, 0], "Lat.": [-8, 5, 0, -5, 0, -5], @@ -27,16 +26,15 @@ } ) fig.velo( - data=dframe, - region=[-10, 10, -10, 10], + data=df, + region=[-10, 8, -10, 6], pen="0.6p,red", - uncertainty_color="green", + uncertainty_color="lightblue1", line=True, scaling="e0.2/0.39/18", - frame="1g1", - projection="x0.4/0.4", + frame=["WSne", "2g2f"], + projection="x0.8c", vector="0.3c+p1p+e+gred", - verbose=True, ) fig.show() diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index adb18c824e3..9363111e191 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -73,11 +73,11 @@ def test_velo_pandas_dataframe(dataframe): data=dataframe, scaling="e0.2/0.39/18", vector="0.3c+p1p+e+gred", - frame="1g1", - region=[-10, 10, -10, 10], - projection="x0.4/0.4", + frame=["WSne", "2g2f"], + region=[-10, 8, -10, 6], + projection="x0.8c", pen="0.6p,red", - uncertainty_color="green", + uncertainty_color="lightblue1", line=True, ) return fig From 86cf8a052ce5faa6a0ab25a3e06521f4e98e962e Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:25:09 +1200 Subject: [PATCH 37/48] Update dvc hash for test_velo_pandas_dataframe --- pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc b/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc index 33aefe4ba7f..5545c6260f7 100644 --- a/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc +++ b/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc @@ -1,4 +1,4 @@ outs: -- md5: a68e9de541ec0c777cdbafda48226f9d - size: 47163 +- md5: fc51d80c438a1961f700c68e207ecc3b + size: 44161 path: test_velo_pandas_dataframe.png From be959fc5481f40e10c45ed2a1b7583f95134a569 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 6 Apr 2021 09:59:42 +1200 Subject: [PATCH 38/48] Use serial/Oxford comma in velo summary description Co-Authored-By: Meghan Jones --- pygmt/src/velo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 767e8e62843..adb8f5fb16a 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -1,5 +1,5 @@ """ -velo - Plot velocity vectors, crosses, anisotropy bars and wedges. +velo - Plot velocity vectors, crosses, anisotropy bars, and wedges. """ import numpy as np import pandas as pd @@ -36,7 +36,7 @@ @kwargs_to_strings(R="sequence", c="sequence_comma", i="sequence_comma", p="sequence") def velo(self, data=None, **kwargs): r""" - Plot velocity vectors, crosses, anisotropy bars and wedges. + Plot velocity vectors, crosses, anisotropy bars, and wedges. Reads data values from files, :class:`numpy.ndarray` or :class:`pandas.DataFrame` and will plot the selected geodesy symbol on a From 92feb9786bfe18463438a7d7752f763dc6d86944 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Mon, 19 Apr 2021 11:50:40 +1200 Subject: [PATCH 39/48] Apply suggestions from code review Co-authored-by: Meghan Jones --- pygmt/src/velo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index adb8f5fb16a..4e1712a2c9b 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -164,17 +164,17 @@ def velo(self, data=None, **kwargs): uncertainty_color : str Sets the color or shade used for filling uncertainty wedges (``scaling='w'``) or velocity error ellipses (``scaling='e'`` or - ``scaling='r'``). [If ``uncertainty_color`` is not specified, the + ``scaling='r'``). If ``uncertainty_color`` is not specified, the uncertainty regions will be transparent. **Note**: Using ``cmap`` and ``zvalue='+e'`` will update the uncertainty fill color based on the selected measure in ``zvalue`` [magnitude error]. More details at - :gmt-docs:cookbook/features.html#gfill-attrib`. + :gmt-docs:`cookbook/features.html#gfill-attrib`. facecolor : str Select color or pattern for filling of symbols [Default is no fill]. **Note**: Using ``cmap`` (and optionally ``zvalue``) will update the symbol fill color based on the selected measure in ``zvalue`` [magnitude]. More details at - :gmt-docs:cookbook/features.html#gfill-attrib`. + :gmt-docs:`cookbook/features.html#gfill-attrib`. scale : float or bool [*scale*]. Scale symbol sizes and pen widths on a per-record basis using the From 71d37979bc19dffab91eccb2325ad23e7a0cea61 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 20 Apr 2021 13:29:11 +1200 Subject: [PATCH 40/48] Apply suggestions from code review Co-authored-by: Meghan Jones --- .../gallery/symbols/velo_arrow_ellipse.py | 30 ++++++++++--------- pygmt/src/velo.py | 8 ++--- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/examples/gallery/symbols/velo_arrow_ellipse.py b/examples/gallery/symbols/velo_arrow_ellipse.py index a5e7e944eed..eaab789d89b 100644 --- a/examples/gallery/symbols/velo_arrow_ellipse.py +++ b/examples/gallery/symbols/velo_arrow_ellipse.py @@ -1,12 +1,14 @@ """ -Velocity arrows and confidence ellipse --------------------------------------- +Velocity arrows and confidence ellipses +--------------------------------------- The :meth:`pygmt.Figure.velo` method can be used to plot mean velocity arrow -and confidence ellipse on a map. -The example below, should make big red arrows with green ellipses, -outlined in red. Note that the 39% confidence scaling will give an ellipse -which fits inside a rectangle of dimension Esig by Nsig. +and confidence ellipses. +The example below plots red velocity arrows with light-blue confidence ellipses +outlined in red with the east_velocity x north_velocity used for the station names. +Note that the velocity arrows are scaled by 0.2 and the 39% confidence limit +will give an ellipse +which fits inside a rectangle of dimension east_sigma by north_sigma. """ import pandas as pd @@ -15,14 +17,14 @@ fig = pygmt.Figure() df = pd.DataFrame( data={ - "Long.": [0, -8, 0, -5, 5, 0], - "Lat.": [-8, 5, 0, -5, 0, -5], - "Evel": [0, 3, 4, 6, -6, 6], - "Nvel": [0, 3, 6, 4, 4, -4], - "Esig": [4, 0, 4, 6, 6, 6], - "Nsig": [6, 0, 6, 4, 4, 4], - "CorEN": [0.5, 0.5, 0.5, 0.5, -0.5, -0.5], - "SITE": ["4x6", "3x3", "NaN", "6x4", "-6x4", "6x-4"], + "x": [0, -8, 0, -5, 5, 0], + "y": [-8, 5, 0, -5, 0, -5], + "east_velocity": [0, 3, 4, 6, -6, 6], + "north_velocity": [0, 3, 6, 4, 4, -4], + "east_sigma": [4, 0, 4, 6, 6, 6], + "north_sigma": [6, 0, 6, 4, 4, 4], + "correlation_EN": [0.5, 0.5, 0.5, 0.5, -0.5, -0.5], + "SITE": ["0x0", "3x3", "4x6", "6x4", "-6x4", "6x-4"], } ) fig.velo( diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 4e1712a2c9b..a266906a721 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -39,7 +39,7 @@ def velo(self, data=None, **kwargs): Plot velocity vectors, crosses, anisotropy bars, and wedges. Reads data values from files, :class:`numpy.ndarray` or - :class:`pandas.DataFrame` and will plot the selected geodesy symbol on a + :class:`pandas.DataFrame` and plots the selected geodesy symbol on a map. You may choose from velocity vectors and their uncertainties, rotational wedges and their uncertainties, anisotropy bars, or strain crosses. Symbol fills or their outlines may be @@ -138,7 +138,7 @@ def velo(self, data=None, **kwargs): - **x**\ [*cross_scale*] - gives Strain crosses. The *cross_scale* sets the size of the cross. + Strain crosses. The *cross_scale* sets the size of the cross. If *cross_scale* is not given then we read it from the data file as an extra column. Parameters are expected to be in the following columns: @@ -187,7 +187,7 @@ def velo(self, data=None, **kwargs): *intens*. Use the supplied *intens* value (nominally in the -1 to +1 range) to modulate the symbol fill color by simulating illumination [Default is - none]. If no intensity is provided we will instead read *intens* from + none]. If *intens* is not provided we will instead read the intensity from an extra data column after the required input columns determined by ``scaling``. {J} @@ -210,7 +210,7 @@ def velo(self, data=None, **kwargs): [*pen*][**+c**\ [**f**\|\ **l**]]. Set pen attributes for velocity arrows, ellipse circumference and fault plane edges. [Defaults: width = default, color = black, style = solid]. - If the modifier **+cl** is appended then the color of the pen are + If the modifier **+cl** is appended then the color of the pen is updated from the CPT (see ``cmap``). If instead modifier **+cf** is appended then the color from the cpt file is applied to symbol fill only [Default]. Use just **+c** to set both pen and fill color. From 9ef3983b5cdedb8a1667d79e4b0e4f3db6261f13 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 20 Apr 2021 13:45:05 +1200 Subject: [PATCH 41/48] Rename alias intensity for -I to shading Co-Authored-By: Meghan Jones --- pygmt/src/velo.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index a266906a721..5f4ab5e1509 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -17,7 +17,7 @@ E="uncertainty_color", G="facecolor", H="scale", - I="intensity", + I="shading", J="projection", L="line", N="no_clip", @@ -40,10 +40,10 @@ def velo(self, data=None, **kwargs): Reads data values from files, :class:`numpy.ndarray` or :class:`pandas.DataFrame` and plots the selected geodesy symbol on a - map. You may choose from velocity vectors - and their uncertainties, rotational wedges and their uncertainties, - anisotropy bars, or strain crosses. Symbol fills or their outlines may be - colored based on constant parameters or via color lookup tables. + map. You may choose from velocity vectors and their uncertainties, + rotational wedges and their uncertainties, anisotropy bars, or strain + crosses. Symbol fills or their outlines may be colored based on constant + parameters or via color lookup tables. Must provide ``data`` and ``scaling``. @@ -183,13 +183,13 @@ def velo(self, data=None, **kwargs): size is either provided by ``scaling`` or via the input *size* column. Alternatively, append a constant *scale* that should be used instead of reading a scale column. - intensity : float or bool + shading : float or bool *intens*. Use the supplied *intens* value (nominally in the -1 to +1 range) to modulate the symbol fill color by simulating illumination [Default is - none]. If *intens* is not provided we will instead read the intensity from - an extra data column after the required input columns determined by - ``scaling``. + none]. If *intens* is not provided we will instead read the intensity + from an extra data column after the required input columns determined + by ``scaling``. {J} line: str [*pen*\ [**+c**\ [**f**\|\ **l**]]]. From 88d1c8f38ccde81ec916206d7567d3793677bd39 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 20 Apr 2021 13:47:34 +1200 Subject: [PATCH 42/48] Rename alias facecolor for -G to color Co-Authored-By: Meghan Jones --- pygmt/src/velo.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 5f4ab5e1509..442b1eb5ace 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -15,7 +15,7 @@ C="cmap", D="rescale", E="uncertainty_color", - G="facecolor", + G="color", H="scale", I="shading", J="projection", @@ -75,7 +75,7 @@ def velo(self, data=None, **kwargs): [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate labeling. The arrow will be drawn with the pen attributes specified by the ``pen`` option and the arrow-head can be colored via - ``facecolor``. The ellipse will be filled with the color or shade + ``color``. The ellipse will be filled with the color or shade specified by the ``uncertainty_color`` option [Default is transparent], and its outline will be drawn if ``line`` is selected using the pen selected (by ``pen`` if not given by ``line``). @@ -108,7 +108,7 @@ def velo(self, data=None, **kwargs): [Default is 9p,Helvetica,black]; give **+f**\ 0 to deactivate labeling. The arrow will be drawn with the pen attributes specified by the ``pen`` option and the arrow-head can be colored via - ``facecolor``. The ellipse will be filled with the color or shade + ``color``. The ellipse will be filled with the color or shade specified by the ``uncertainty_color`` option [Default is transparent], and its outline will be drawn if ``line`` is selected using the pen selected (by ``pen`` if not given by ``line``). @@ -127,10 +127,10 @@ def velo(self, data=None, **kwargs): *wedgescale* is not given then we read it from the data file as an extra column. Rotation values are multiplied by *wedgemag* before plotting. For example, setting *wedgemag* to 1.e7 works well for - rotations of the order of 100 nanoradians/yr. Use ``facecolor`` to - set the fill color or shade for the wedge, and ``uncertainty_color`` - to set the color or shade for the uncertainty. Parameters are - expected to be in the following columns: + rotations of the order of 100 nanoradians/yr. Use ``color`` to set + the fill color or shade for the wedge, and ``uncertainty_color`` to + set the color or shade for the uncertainty. Parameters are expected + to be in the following columns: - **1**,\ **2**: longitude, latitude of station - **3**: rotation in radians @@ -169,7 +169,7 @@ def velo(self, data=None, **kwargs): ``zvalue='+e'`` will update the uncertainty fill color based on the selected measure in ``zvalue`` [magnitude error]. More details at :gmt-docs:`cookbook/features.html#gfill-attrib`. - facecolor : str + color : str Select color or pattern for filling of symbols [Default is no fill]. **Note**: Using ``cmap`` (and optionally ``zvalue``) will update the symbol fill color based on the selected measure in ``zvalue`` From b8a24102e206eceac48736d5882a061219f0c5f7 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 20 Apr 2021 13:49:19 +1200 Subject: [PATCH 43/48] Move docstring for projection (J) and region (R) up a bit --- pygmt/src/velo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 442b1eb5ace..47e4eadea7d 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -150,6 +150,8 @@ def velo(self, data=None, **kwargs): with extension taken positive. - **5**: azimuth of eps2 in degrees CW from North. + {J} + {R} vector : bool or str Modify vector parameters. For vector heads, append vector head *size* [Default is 9p]. See @@ -190,7 +192,6 @@ def velo(self, data=None, **kwargs): none]. If *intens* is not provided we will instead read the intensity from an extra data column after the required input columns determined by ``scaling``. - {J} line: str [*pen*\ [**+c**\ [**f**\|\ **l**]]]. Draw lines. Ellipses and rotational wedges will have their outlines @@ -203,7 +204,6 @@ def velo(self, data=None, **kwargs): no_clip: bool or str Do NOT skip symbols that fall outside the frame boundary specified by ``region``. [Default plots symbols inside frame only]. - {R} {U} {V} pen : str From 23e908cdc937c16130d12ca97e1bbfbe8939a464 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Tue, 27 Apr 2021 11:12:04 +1200 Subject: [PATCH 44/48] Rename alias to spec (S) and update baseline images for GMT 6.2.0rc1 Co-Authored-By: Meghan Jones --- .../gallery/symbols/velo_arrow_ellipse.py | 2 +- pygmt/src/velo.py | 22 +++++++++---------- ...test_velo_numpy_array_numeric_only.png.dvc | 4 ++-- .../test_velo_pandas_dataframe.png.dvc | 4 ++-- pygmt/tests/test_velo.py | 10 ++++----- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/gallery/symbols/velo_arrow_ellipse.py b/examples/gallery/symbols/velo_arrow_ellipse.py index eaab789d89b..4ca818082a4 100644 --- a/examples/gallery/symbols/velo_arrow_ellipse.py +++ b/examples/gallery/symbols/velo_arrow_ellipse.py @@ -33,7 +33,7 @@ pen="0.6p,red", uncertainty_color="lightblue1", line=True, - scaling="e0.2/0.39/18", + spec="e0.2/0.39/18", frame=["WSne", "2g2f"], projection="x0.8c", vector="0.3c+p1p+e+gred", diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 47e4eadea7d..7903566c615 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -22,7 +22,7 @@ L="line", N="no_clip", R="region", - S="scaling", + S="spec", U="timestamp", V="verbose", W="pen", @@ -45,7 +45,7 @@ def velo(self, data=None, **kwargs): crosses. Symbol fills or their outlines may be colored based on constant parameters or via color lookup tables. - Must provide ``data`` and ``scaling``. + Must provide ``data`` and ``spec``. Full option list at :gmt-docs:`supplements/geodesy/velo.html` @@ -58,7 +58,7 @@ def velo(self, data=None, **kwargs): :class:`pandas.DataFrame` with the tabular data. Note that text columns are only supported with file or pandas DataFrame inputs. - scaling: str + spec: str Selects the meaning of the columns in the data file and the figure to be plotted. In all cases, the scales are in data units per length unit and sizes are in length units (default length unit is controlled @@ -160,13 +160,13 @@ def velo(self, data=None, **kwargs): {B} {CPT} rescale : str - can be used to rescale the uncertainties of velocities - (``scaling='e'`` and ``scaling='r'``) and rotations - (``scaling='w'``). Can be combined with the ``confidence`` variable. + can be used to rescale the uncertainties of velocities (``spec='e'`` + and ``spec='r'``) and rotations (``spec='w'``). Can be combined with + the ``confidence`` variable. uncertainty_color : str Sets the color or shade used for filling uncertainty wedges - (``scaling='w'``) or velocity error ellipses (``scaling='e'`` or - ``scaling='r'``). If ``uncertainty_color`` is not specified, the + (``spec='w'``) or velocity error ellipses (``spec='e'`` or + ``spec='r'``). If ``uncertainty_color`` is not specified, the uncertainty regions will be transparent. **Note**: Using ``cmap`` and ``zvalue='+e'`` will update the uncertainty fill color based on the selected measure in ``zvalue`` [magnitude error]. More details at @@ -182,7 +182,7 @@ def velo(self, data=None, **kwargs): Scale symbol sizes and pen widths on a per-record basis using the *scale* read from the data set, given as the first column after the (optional) *z* and *size* columns [Default is no scaling]. The symbol - size is either provided by ``scaling`` or via the input *size* column. + size is either provided by ``spec`` or via the input *size* column. Alternatively, append a constant *scale* that should be used instead of reading a scale column. shading : float or bool @@ -191,7 +191,7 @@ def velo(self, data=None, **kwargs): modulate the symbol fill color by simulating illumination [Default is none]. If *intens* is not provided we will instead read the intensity from an extra data column after the required input columns determined - by ``scaling``. + by ``spec``. line: str [*pen*\ [**+c**\ [**f**\|\ **l**]]]. Draw lines. Ellipses and rotational wedges will have their outlines @@ -231,7 +231,7 @@ def velo(self, data=None, **kwargs): kwargs = self._preprocess(**kwargs) # pylint: disable=protected-access if "S" not in kwargs or ("S" in kwargs and not isinstance(kwargs["S"], str)): - raise GMTInvalidInput("Scaling is a required argument and has to be a string.") + raise GMTInvalidInput("Spec is a required argument and has to be a string.") if isinstance(data, np.ndarray) and not pd.api.types.is_numeric_dtype(data): raise GMTInvalidInput( diff --git a/pygmt/tests/baseline/test_velo_numpy_array_numeric_only.png.dvc b/pygmt/tests/baseline/test_velo_numpy_array_numeric_only.png.dvc index b8506c54c32..10da6c1a375 100644 --- a/pygmt/tests/baseline/test_velo_numpy_array_numeric_only.png.dvc +++ b/pygmt/tests/baseline/test_velo_numpy_array_numeric_only.png.dvc @@ -1,4 +1,4 @@ outs: -- md5: 0d50fb17d52af222b890d44fbd9050c4 - size: 48104 +- md5: 64e45d586112fc131090cfac2c104b63 + size: 45483 path: test_velo_numpy_array_numeric_only.png diff --git a/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc b/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc index 5545c6260f7..a696a5b2773 100644 --- a/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc +++ b/pygmt/tests/baseline/test_velo_pandas_dataframe.png.dvc @@ -1,4 +1,4 @@ outs: -- md5: fc51d80c438a1961f700c68e207ecc3b - size: 44161 +- md5: 60dff1a72e6d984f095fb4973cecaec7 + size: 42430 path: test_velo_pandas_dataframe.png diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index 9363111e191..fafae2c4614 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -34,7 +34,7 @@ def test_velo_numpy_array_numeric_only(dataframe): fig = Figure() fig.velo( data=dataframe.iloc[:, :-1].to_numpy(), - scaling="e0.2/0.39/18", + spec="e0.2/0.39/18", vector="0.3c+p1p+e+gred", frame="1g1", ) @@ -49,14 +49,14 @@ def test_velo_numpy_array_text_column(dataframe): with pytest.raises(GMTInvalidInput): fig.velo( data=dataframe.to_numpy(), - scaling="e0.2/0.39/18", + spec="e0.2/0.39/18", vector="0.3c+p1p+e+gred", ) -def test_velo_without_scaling(dataframe): +def test_velo_without_spec(dataframe): """ - Check that velo fails when the scaling parameter is not given. + Check that velo fails when the spec parameter is not given. """ fig = Figure() with pytest.raises(GMTInvalidInput): @@ -71,7 +71,7 @@ def test_velo_pandas_dataframe(dataframe): fig = Figure() fig.velo( data=dataframe, - scaling="e0.2/0.39/18", + spec="e0.2/0.39/18", vector="0.3c+p1p+e+gred", frame=["WSne", "2g2f"], region=[-10, 8, -10, 6], From 6b99454436ca58dfa149780dfba40c042833a15c Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Fri, 30 Apr 2021 23:45:28 +1200 Subject: [PATCH 45/48] Fix typo on examples/gallery/symbols/velo_arrow_ellipse.py Co-authored-by: Michael Grund <23025878+michaelgrund@users.noreply.github.com> --- examples/gallery/symbols/velo_arrow_ellipse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/gallery/symbols/velo_arrow_ellipse.py b/examples/gallery/symbols/velo_arrow_ellipse.py index 4ca818082a4..4dd94f52b7a 100644 --- a/examples/gallery/symbols/velo_arrow_ellipse.py +++ b/examples/gallery/symbols/velo_arrow_ellipse.py @@ -2,7 +2,7 @@ Velocity arrows and confidence ellipses --------------------------------------- -The :meth:`pygmt.Figure.velo` method can be used to plot mean velocity arrow +The :meth:`pygmt.Figure.velo` method can be used to plot mean velocity arrows and confidence ellipses. The example below plots red velocity arrows with light-blue confidence ellipses outlined in red with the east_velocity x north_velocity used for the station names. From f949f163af68b630e69a6940da07066a2f0c8f9f Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Fri, 30 Apr 2021 23:51:39 +1200 Subject: [PATCH 46/48] Mark fig.velo tests with xfail --- pygmt/tests/test_velo.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index fafae2c4614..c5139318128 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -26,6 +26,10 @@ def fixture_dataframe(): ) +@pytest.mark.xfail( + reason="Flaky test only passes with pytest on single module" + "See https://github.com/GenericMappingTools/pygmt/issues/1242" +) @pytest.mark.mpl_image_compare def test_velo_numpy_array_numeric_only(dataframe): """ @@ -63,6 +67,10 @@ def test_velo_without_spec(dataframe): fig.velo(data=dataframe) +@pytest.mark.xfail( + reason="Flaky test only passes with pytest on single module" + "See https://github.com/GenericMappingTools/pygmt/issues/1242" +) @pytest.mark.mpl_image_compare def test_velo_pandas_dataframe(dataframe): """ From 1064c82712642daae81a28e0871eb312e6ab963c Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Sat, 1 May 2021 00:17:59 +1200 Subject: [PATCH 47/48] Rename alias uncertainty_color to uncertaintycolor for parameter E As per https://github.com/GenericMappingTools/pygmt/pull/1190#issuecomment-814451969. Plus re-wrap some paragraphs to 79 characters. --- .../gallery/symbols/velo_arrow_ellipse.py | 2 +- pygmt/src/velo.py | 37 +++++++++---------- pygmt/tests/test_velo.py | 2 +- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/examples/gallery/symbols/velo_arrow_ellipse.py b/examples/gallery/symbols/velo_arrow_ellipse.py index 4dd94f52b7a..9390d32ff25 100644 --- a/examples/gallery/symbols/velo_arrow_ellipse.py +++ b/examples/gallery/symbols/velo_arrow_ellipse.py @@ -31,7 +31,7 @@ data=df, region=[-10, 8, -10, 6], pen="0.6p,red", - uncertainty_color="lightblue1", + uncertaintycolor="lightblue1", line=True, spec="e0.2/0.39/18", frame=["WSne", "2g2f"], diff --git a/pygmt/src/velo.py b/pygmt/src/velo.py index 7903566c615..5db2544e83b 100644 --- a/pygmt/src/velo.py +++ b/pygmt/src/velo.py @@ -14,7 +14,7 @@ B="frame", C="cmap", D="rescale", - E="uncertainty_color", + E="uncertaintycolor", G="color", H="scale", I="shading", @@ -39,11 +39,11 @@ def velo(self, data=None, **kwargs): Plot velocity vectors, crosses, anisotropy bars, and wedges. Reads data values from files, :class:`numpy.ndarray` or - :class:`pandas.DataFrame` and plots the selected geodesy symbol on a - map. You may choose from velocity vectors and their uncertainties, - rotational wedges and their uncertainties, anisotropy bars, or strain - crosses. Symbol fills or their outlines may be colored based on constant - parameters or via color lookup tables. + :class:`pandas.DataFrame` and plots the selected geodesy symbol on a map. + You may choose from velocity vectors and their uncertainties, rotational + wedges and their uncertainties, anisotropy bars, or strain crosses. Symbol + fills or their outlines may be colored based on constant parameters or via + color lookup tables. Must provide ``data`` and ``spec``. @@ -59,10 +59,10 @@ def velo(self, data=None, **kwargs): are only supported with file or pandas DataFrame inputs. spec: str - Selects the meaning of the columns in the data file and the figure - to be plotted. In all cases, the scales are in data units per length - unit and sizes are in length units (default length unit is controlled - by :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i**, or **p** is + Selects the meaning of the columns in the data file and the figure to + be plotted. In all cases, the scales are in data units per length unit + and sizes are in length units (default length unit is controlled by + :gmt-term:`PROJ_LENGTH_UNIT` unless **c**, **i**, or **p** is appended). - **e**\ [*velscale*/]\ *confidence*\ [**+f**\ *font*] @@ -76,7 +76,7 @@ def velo(self, data=None, **kwargs): labeling. The arrow will be drawn with the pen attributes specified by the ``pen`` option and the arrow-head can be colored via ``color``. The ellipse will be filled with the color or shade - specified by the ``uncertainty_color`` option [Default is + specified by the ``uncertaintycolor`` option [Default is transparent], and its outline will be drawn if ``line`` is selected using the pen selected (by ``pen`` if not given by ``line``). Parameters are expected to be in the following columns: @@ -109,7 +109,7 @@ def velo(self, data=None, **kwargs): labeling. The arrow will be drawn with the pen attributes specified by the ``pen`` option and the arrow-head can be colored via ``color``. The ellipse will be filled with the color or shade - specified by the ``uncertainty_color`` option [Default is + specified by the ``uncertaintycolor`` option [Default is transparent], and its outline will be drawn if ``line`` is selected using the pen selected (by ``pen`` if not given by ``line``). Parameters are expected to be in the following columns: @@ -128,7 +128,7 @@ def velo(self, data=None, **kwargs): extra column. Rotation values are multiplied by *wedgemag* before plotting. For example, setting *wedgemag* to 1.e7 works well for rotations of the order of 100 nanoradians/yr. Use ``color`` to set - the fill color or shade for the wedge, and ``uncertainty_color`` to + the fill color or shade for the wedge, and ``uncertaintycolor`` to set the color or shade for the uncertainty. Parameters are expected to be in the following columns: @@ -138,10 +138,9 @@ def velo(self, data=None, **kwargs): - **x**\ [*cross_scale*] - Strain crosses. The *cross_scale* sets the size of the cross. - If *cross_scale* is not given then we read it from the data file as - an extra column. Parameters are expected to be in the following - columns: + Strain crosses. The *cross_scale* sets the size of the cross. If + *cross_scale* is not given then we read it from the data file as an + extra column. Parameters are expected to be in the following columns: - **1**,\ **2**: longitude, latitude of station - **3**: eps1, the most extensional eigenvalue of strain tensor, @@ -163,10 +162,10 @@ def velo(self, data=None, **kwargs): can be used to rescale the uncertainties of velocities (``spec='e'`` and ``spec='r'``) and rotations (``spec='w'``). Can be combined with the ``confidence`` variable. - uncertainty_color : str + uncertaintycolor : str Sets the color or shade used for filling uncertainty wedges (``spec='w'``) or velocity error ellipses (``spec='e'`` or - ``spec='r'``). If ``uncertainty_color`` is not specified, the + ``spec='r'``). If ``uncertaintycolor`` is not specified, the uncertainty regions will be transparent. **Note**: Using ``cmap`` and ``zvalue='+e'`` will update the uncertainty fill color based on the selected measure in ``zvalue`` [magnitude error]. More details at diff --git a/pygmt/tests/test_velo.py b/pygmt/tests/test_velo.py index c5139318128..a8517adf62c 100644 --- a/pygmt/tests/test_velo.py +++ b/pygmt/tests/test_velo.py @@ -85,7 +85,7 @@ def test_velo_pandas_dataframe(dataframe): region=[-10, 8, -10, 6], projection="x0.8c", pen="0.6p,red", - uncertainty_color="lightblue1", + uncertaintycolor="lightblue1", line=True, ) return fig From da9ee3b9834be9d554ce709125e13d058a07be73 Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Sat, 1 May 2021 10:17:43 +1200 Subject: [PATCH 48/48] Move velo_arrow_ellipse.py under "Seismology and Geodesy" category Co-Authored-By: Dongdong Tian --- .../{symbols => seismology}/velo_arrow_ellipse.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) rename examples/gallery/{symbols => seismology}/velo_arrow_ellipse.py (71%) diff --git a/examples/gallery/symbols/velo_arrow_ellipse.py b/examples/gallery/seismology/velo_arrow_ellipse.py similarity index 71% rename from examples/gallery/symbols/velo_arrow_ellipse.py rename to examples/gallery/seismology/velo_arrow_ellipse.py index 9390d32ff25..3d7018aca33 100644 --- a/examples/gallery/symbols/velo_arrow_ellipse.py +++ b/examples/gallery/seismology/velo_arrow_ellipse.py @@ -3,12 +3,11 @@ --------------------------------------- The :meth:`pygmt.Figure.velo` method can be used to plot mean velocity arrows -and confidence ellipses. -The example below plots red velocity arrows with light-blue confidence ellipses -outlined in red with the east_velocity x north_velocity used for the station names. -Note that the velocity arrows are scaled by 0.2 and the 39% confidence limit -will give an ellipse -which fits inside a rectangle of dimension east_sigma by north_sigma. +and confidence ellipses. The example below plots red velocity arrows with +light-blue confidence ellipses outlined in red with the east_velocity x +north_velocity used for the station names. Note that the velocity arrows are +scaled by 0.2 and the 39% confidence limit will give an ellipse which fits +inside a rectangle of dimension east_sigma by north_sigma. """ import pandas as pd