-
Notifications
You must be signed in to change notification settings - Fork 229
Add Figure.hlines for plotting horizontal lines #923
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 33 commits
Commits
Show all changes
77 commits
Select commit
Hold shift + click to select a range
7ed3b49
Add new modules to plot horizontal and vertical lines
michaelgrund 096b9de
added further content
michaelgrund 92fa9c0
added some first tests
michaelgrund 975b305
some formatting
michaelgrund f25a89c
corrected typo
michaelgrund 3cee081
Merge branch 'master' into hlines-module
michaelgrund a0c29fc
Merge branch 'master' into hlines-module
michaelgrund 51dcb6a
Merge branch 'master' into hlines-module
michaelgrund 4fdc984
Merge branch 'master' into hlines-module
michaelgrund 154d05e
Merge branch 'master' into hlines-module
michaelgrund ddd04b4
Merge branch 'master' into hlines-module
michaelgrund d0bc35c
moved gallery example to new subfolder /lines
michaelgrund 450d8de
Merge branch 'master' into hlines-module
michaelgrund f75fbe1
disable pylint warnings
michaelgrund a375a77
replace hyphen by underscore in gallery example file name
michaelgrund 71113dd
disable pylint warnings
michaelgrund 1438d43
formatting
michaelgrund e3a564e
Merge branch 'master' into hlines-module
michaelgrund d6a8fa5
Merge branch 'master' into hlines-module
michaelgrund ff13180
Merge branch 'master' into hlines-module
michaelgrund 1881e95
Merge branch 'master' into hlines-module
michaelgrund 7222e9b
Merge branch 'main' into hlines-module
michaelgrund 65eb85d
update hlines module
michaelgrund 2353587
Merge branch 'hlines-module' of https://github.com/GenericMappingTool…
michaelgrund 49008ed
formatting
michaelgrund 457bf72
adjust docstring
michaelgrund f2c84a7
adjust priliminary tests
michaelgrund 50dccf9
Merge branch 'main' into hlines-module
michaelgrund e7726c0
update
michaelgrund 60d6e55
Merge branch 'hlines-module' of https://github.com/GenericMappingTool…
michaelgrund 46f8702
formatting
michaelgrund 5648778
Merge branch 'main' into hlines-module
michaelgrund d553e28
Merge branch 'main' into hlines-module
michaelgrund d493a1c
Update pygmt/src/hlines.py
michaelgrund 92bfca5
Merge branch 'main' into hlines-module
seisman ed7de94
Fix styling
seisman 1ae727a
Simplify the logic of codes
seisman 8fee6a8
Remove the gallery example
seisman 67b1497
Finalize hlines source code
seisman cd0ce35
Fix hlines
seisman e60b064
Add tests for Figure.hlines
seisman f28dce0
Fix the order in the API docs
seisman 4816dbb
Skip doctest
seisman 49c2e97
Improve type hints
seisman a40ff00
Simplify type hints
seisman d657fe3
Support for horizontal lines in geographic projections
seisman a8bd1a0
Add tests for polar projection
seisman 457e8eb
Fix tests for polar
seisman a2b7223
Add tests for no_clip
seisman 258a64f
Improve docstrings
seisman ad09ece
Merge branch 'main' into hlines-module
seisman 4e26a6f
Merge branch 'main' into hlines-module
seisman 9e17bdf
Use straight_line='p' although it makes no difference
seisman 25cbeb4
Transparency should be set by 'pen' instead
seisman afe7592
Merge branch 'main' into hlines-module
seisman 6556500
Refactor the codes for handling y/xmin/xmax
seisman fc1898c
Simplify the checking
seisman 7ef0406
Fix reference to Figure.plot
seisman 354e090
Merge branch 'main' into hlines-module
seisman 7a20b8c
Merge branch 'main' into hlines-module
seisman 762bf4e
Fix a typo [skip ci]
seisman d88b9c2
Merge branch 'main' into hlines-module
seisman 982112f
Merge branch 'main' into hlines-module
seisman 5440bf8
Fix typos
seisman 00662cf
Merge branch 'main' into hlines-module
seisman 7299827
Merge branch 'main' into hlines-module
seisman 118baf7
Merge branch 'main' into hlines-module
seisman 5c99205
Merge branch 'main' into hlines-module
seisman e2cddd2
Merge branch 'main' into hlines-module
seisman d79c2b6
Merge branch 'main' into hlines-module
seisman 5a0989f
Change straight_line='p' to 'x'
seisman af63f37
Merge branch 'main' into hlines-module
seisman f673b76
Merge branch 'main' into hlines-module
yvonnefroehlich cc6c83f
Apply suggestions from code review
seisman 635d8e6
Update baseline image
seisman edd804e
Merge branch 'main' into hlines-module
seisman 1e643c1
[format-command] fixes
actions-bot File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
""" | ||
Plot horizontal lines | ||
--------------------- | ||
|
||
The :meth:`pygmt.Figure.hlines` method can plot horizontal lines based on | ||
a given y value. Optionally, the lower and upper limits of the lines can be | ||
defined, otherwise the current map boundaries are taken. | ||
|
||
""" | ||
|
||
import pygmt | ||
|
||
fig = pygmt.Figure() | ||
fig.basemap(region=[0, 10, 0, 11], projection="X10c/10c", frame=True) | ||
|
||
fig.hlines(1, label="line1") | ||
fig.hlines([2, 3], pen="2p,dodgerblue4", label="line2") | ||
fig.hlines([4, 5], xmin=2, xmax=8, pen="2p,red3", label="line3") | ||
fig.hlines([6, 7], xmin=[1, 3], xmax=[8, 7], pen="3p,seagreen", label="line4") | ||
fig.hlines( | ||
[8, 9, 10], | ||
xmin=[1.3, 3, 2], | ||
xmax=[6.5, 7, 5], | ||
pen=["4p,darkmagenta", "2p,gold,--", "3.5p,blue,."], | ||
label=["line5", "line6", "line7"], | ||
transparency=50, | ||
) | ||
|
||
fig.legend() | ||
fig.show() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -423,6 +423,7 @@ def _repr_html_(self): | |
grdimage, | ||
grdview, | ||
histogram, | ||
hlines, | ||
image, | ||
inset, | ||
legend, | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
""" | ||
hlines - Plot horizontal lines. | ||
""" | ||
import numpy as np | ||
from pygmt.clib import Session | ||
from pygmt.exceptions import GMTInvalidInput | ||
from pygmt.helpers import ( | ||
build_arg_string, | ||
data_kind, | ||
fmt_docstring, | ||
kwargs_to_strings, | ||
use_alias, | ||
) | ||
|
||
|
||
@fmt_docstring | ||
@use_alias( | ||
N="no_clip", | ||
V="verbose", | ||
W="pen", | ||
l="label", | ||
p="perspective", | ||
t="transparency", | ||
) | ||
@kwargs_to_strings(p="sequence") | ||
def hlines(self, y=None, xmin=None, xmax=None, **kwargs): | ||
""" | ||
Plot one or a collection of horizontal lines. | ||
Takes a single y value or a list of individual y values and optionally | ||
lower and upper x value limits as input. | ||
Must provide *y*. | ||
If y values are given without x limits then the current map boundaries are | ||
used as lower and upper limits. If only a single set of x limits is given | ||
then all lines will have the same length, otherwise give x limits for each | ||
individual line. If only a single label is given then all lines are grouped | ||
under this label in the legend (if shown). If each line should appear as a | ||
single entry in the legend, give corresponding labels for all lines | ||
(same for **pen**). | ||
Parameters | ||
---------- | ||
y : float or 1d array | ||
seisman marked this conversation as resolved.
Show resolved
Hide resolved
|
||
The y coordinates or an array of y coordinates of the | ||
horizontal lines to plot. | ||
no_clip : bool or str | ||
``'[c|r]'``. | ||
Do NOT clip lines that fall outside map border [Default plots | ||
lines whose coordinates are strictly inside the map border only]. | ||
The option does not apply to lines which are always | ||
clipped to the map region. For periodic (360-longitude) maps we | ||
must plot all lines twice in case they are clipped by the | ||
repeating boundary. ``no_clip=True`` will turn off clipping and not | ||
plot repeating lines. Use ``no_clip="r"`` to turn off clipping | ||
but retain the plotting of such repeating lines, or use | ||
``no_clip="c"`` to retain clipping but turn off plotting of | ||
repeating lines. | ||
{W} | ||
{V} | ||
label : str | ||
Add a legend entry for the line being plotted. | ||
{p} | ||
{t} | ||
*transparency* can also be a 1d array to set varying transparency | ||
for lines. | ||
|
||
""" | ||
|
||
kwargs = self._preprocess(**kwargs) # pylint: disable=protected-access | ||
|
||
y = np.atleast_1d(y) | ||
list_length = len(y) | ||
|
||
# prepare x values | ||
def prep_data(xmin, xmax, list_length): | ||
|
||
if xmin is None and xmax is None: | ||
with Session() as lib: | ||
# get limits from current map boundings if not given | ||
# via xmin, xmax | ||
x = np.array([[lib.extract_region()[0]], [lib.extract_region()[1]]]) | ||
x = np.repeat(x, list_length, axis=1) | ||
michaelgrund marked this conversation as resolved.
Show resolved
Hide resolved
|
||
elif xmin is None or xmax is None: | ||
raise GMTInvalidInput( | ||
"Must provide both, xmin and xmax if limits are not set automatically." | ||
) | ||
|
||
else: | ||
# if only a single xmin and xmax without [], repeat to fit | ||
# size of y | ||
if isinstance(xmin, (int, float)): | ||
x = np.array([[xmin], [xmax]]) | ||
x = np.repeat(x, list_length, axis=1) | ||
else: | ||
if len(xmin) != len(xmax): | ||
GMTInvalidInput("Must provide same length for xmin and xmax.") | ||
else: | ||
x = np.array([xmin, xmax]) | ||
|
||
return np.atleast_1d(x) | ||
|
||
def prep_style(kwargs, list_length): | ||
|
||
# prepare labels | ||
if "l" in kwargs: | ||
# if several lines belong to the same label, first set all to None | ||
# then replace first entry by the label given via "l" | ||
if not isinstance(kwargs["l"], list): | ||
label2use = kwargs["l"] | ||
kwargs["l"] = np.repeat(None, list_length) | ||
kwargs["l"][0] = label2use | ||
|
||
else: | ||
kwargs["l"] = np.repeat(None, list_length) | ||
|
||
# prepare pens | ||
if "W" in kwargs: | ||
# select pen, no series | ||
if not isinstance(kwargs["W"], list): | ||
kwargs["W"] = np.repeat(kwargs["W"], list_length) | ||
else: # use as default if no pen is given (neither single nor series) | ||
kwargs["W"] = np.repeat("1p,black", list_length) | ||
|
||
return kwargs | ||
|
||
# loop over entries | ||
x = prep_data(xmin, xmax, list_length) | ||
kwargs = prep_style(kwargs, list_length) | ||
kwargs_copy = kwargs.copy() | ||
|
||
for index in range(list_length): | ||
|
||
with Session() as lib: | ||
if ( | ||
data_kind(None, [x[0][index], x[1][index]], [y[index], y[index]]) | ||
== "vectors" | ||
): | ||
file_context = lib.virtualfile_from_vectors( | ||
np.atleast_1d([x[0][index], x[1][index]]), [y[index], y[index]] | ||
) | ||
else: | ||
raise GMTInvalidInput("Unrecognized data type.") | ||
|
||
kwargs["l"] = kwargs_copy["l"][index] | ||
kwargs["W"] = kwargs_copy["W"][index] | ||
|
||
with file_context as fname: | ||
lib.call_module("plot", " ".join([fname, build_arg_string(kwargs)])) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
""" | ||
Tests for hline. | ||
""" | ||
from pygmt import Figure | ||
from pygmt.helpers.testing import check_figures_equal | ||
|
||
|
||
@check_figures_equal() | ||
def test_hlines_value_sets(): | ||
""" | ||
Passing sets of y, xmin and xmax. | ||
""" | ||
|
||
fig_ref, fig_test = Figure(), Figure() | ||
|
||
fig_ref.basemap(region=[0, 10, 0, 20], projection="X10c/10c", frame=True) | ||
fig_ref.hlines( | ||
y=[5.5, 10, 6, 11], | ||
xmin=[3.1, 6, 0, 1], | ||
xmax=[5.5, 7.8, 10, 9], | ||
label="test2", | ||
pen="4p,green", | ||
) | ||
|
||
fig_test.basemap(region="0/10/0/20", projection="X10c/10c", frame=True) | ||
fig_test.hlines( | ||
y=[5.5, 10, 6, 11], | ||
xmin=[3.1, 6, 0, 1], | ||
xmax=[5.5, 7.8, 10, 9], | ||
label="test2", | ||
pen="4p,green", | ||
) | ||
|
||
return fig_ref, fig_test |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.