Skip to content
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

Wrap legend #333

Merged
merged 28 commits into from
Oct 31, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e708414
Add Figure.legend() wrapper
liamtoney Dec 31, 2018
60f1b73
Implement handles/labels functionality for Figure.legend()
liamtoney Jan 2, 2019
03fbff8
Merge branch 'master' of https://github.com/GenericMappingTools/gmt-p…
liamtoney Jan 18, 2019
8a19632
Merge branch 'master' of https://github.com/GenericMappingTools/gmt-p…
liamtoney Jan 28, 2019
826318e
Merge branch 'master' of https://github.com/GenericMappingTools/pygmt…
liamtoney Mar 1, 2019
ae6335b
Merge with pygmt master
liamtoney Jul 5, 2019
a6771a1
Use extlinks for legend docstring
liamtoney Jul 5, 2019
69f327e
Merge branch 'master' of https://github.com/GenericMappingTools/pygmt…
liamtoney Oct 8, 2019
95d170d
Hack to allow rc2
liamtoney Oct 8, 2019
cddf2cf
Add test for legend
liamtoney Oct 8, 2019
a57dec3
Revert "Hack to allow rc2"
liamtoney Oct 10, 2019
2ddec23
Merge branch 'master' of https://github.com/GenericMappingTools/pygmt…
liamtoney Oct 10, 2019
da4569c
Use aliases for D and F args
liamtoney Oct 10, 2019
1b07abb
Simplify data_kind() call
liamtoney Oct 10, 2019
88addf7
Flesh out documentation
liamtoney Oct 10, 2019
24330cd
Merge branch 'master' of https://github.com/GenericMappingTools/pygmt…
liamtoney Oct 24, 2019
3a18c63
Alias label (l) for plot
weiji14 Oct 25, 2019
c628f27
Merge pull request #1 from weiji14/plot/alias_label
liamtoney Oct 29, 2019
391e710
Merge branch 'master' into add-legend
liamtoney Oct 29, 2019
a514b59
Use GMT's auto-legend feature instead of regex
liamtoney Oct 29, 2019
519e383
Remove unused GMTTempFile import
liamtoney Oct 29, 2019
9130f47
Revise first legend test
liamtoney Oct 29, 2019
52ae8ee
Add legend entries test
liamtoney Oct 29, 2019
58dba31
Add legend specfile test
liamtoney Oct 29, 2019
f44e98e
Add failing test
liamtoney Oct 31, 2019
e737ca8
Add legend to index.rst
liamtoney Oct 31, 2019
557149d
Remove unneeded decorator
liamtoney Oct 31, 2019
850a96a
Merge branch 'master' into add-legend
weiji14 Oct 31, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/api/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Plotting data and laying out the map:
Figure.contour
Figure.grdcontour
Figure.grdimage
Figure.legend
Figure.logo
Figure.image
Figure.shift_origin
Expand Down
46 changes: 46 additions & 0 deletions pygmt/base_plotting.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ def grdcontour(self, grid, **kwargs):
Do not draw contours with less than `cut` number of points.
S : string or int
Resample smoothing factor.
l : str
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

grdcontour doesn't support -l option now. Currently only plot supports auto-label.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolving in #357.

Add a legend entry for the symbol or line being plotted.
{J}
{R}
{B}
Expand Down Expand Up @@ -241,6 +243,7 @@ def grdimage(self, grid, **kwargs):
G="color",
W="pen",
i="columns",
l="label",
C="cmap",
)
@kwargs_to_strings(R="sequence", i="sequence_comma")
Expand Down Expand Up @@ -530,3 +533,46 @@ def image(self, imagefile, **kwargs):
with Session() as lib:
arg_str = " ".join([imagefile, build_arg_string(kwargs)])
lib.call_module("image", arg_str)

@fmt_docstring
@use_alias(R="region", J="projection", D="position", F="box")
@kwargs_to_strings(R="sequence")
def legend(self, spec=None, **kwargs):
"""
Plot legends on maps.

Makes legends that can be overlaid on maps. Reads specific legend-related
information from either a) an input file or b) a list containing a list
of figure handles and a list of corresponding labels. Unless otherwise
noted, annotations will be made using the primary annotation font and
size in effect (i.e., FONT_ANNOT_PRIMARY).

Full option list at :gmt-docs:`legend.html`

{aliases}

Parameters
----------
spec : None or str
Either None (default) for using the automatically generated legend
specification file, or a filename pointing to the legend specification file.
{J}
{R}
position (D) : str
``'[g|j|J|n|x]refpoint+wwidth[/height][+jjustify][+lspacing][+odx[/dy]]'``
Defines the reference point on the map for the legend.
box (F) : bool or str
``'[+cclearances][+gfill][+i[[gap/]pen]][+p[pen]][+r[radius]][+s[[dx/dy/][shade]]]'``
Without further options, draws a rectangular border around the
legend using **MAP_FRAME_PEN**.
"""
kwargs = self._preprocess(**kwargs)
with Session() as lib:
if spec is None:
specfile = ""
elif data_kind(spec) == "file":
specfile = spec
else:
raise GMTInvalidInput("Unrecognized data type: {}".format(type(spec)))
arg_str = " ".join([specfile, build_arg_string(kwargs)])
lib.call_module("legend", arg_str)
Binary file added pygmt/tests/baseline/test_legend_entries.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pygmt/tests/baseline/test_legend_position.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pygmt/tests/baseline/test_legend_specfile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
108 changes: 108 additions & 0 deletions pygmt/tests/test_legend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
"""
Tests for legend
"""
import pytest

from .. import Figure
from ..exceptions import GMTInvalidInput
from ..helpers import GMTTempFile
weiji14 marked this conversation as resolved.
Show resolved Hide resolved


@pytest.mark.mpl_image_compare
def test_legend_position():
"""
Try positioning with each of the four legend coordinate systems.
"""

fig = Figure()

fig.basemap(region=[-2, 2, -2, 2], frame=True)

positions = ["jTR+jTR", "g0/1", "n0.2/0.2", "x4i/2i/2i"]

for i, position in enumerate(positions):

fig.plot(x=[0], y=[0], style="p10p", label=i)
fig.legend(position=position, box=True)

return fig


@pytest.mark.mpl_image_compare
def test_legend_entries():
"""
Test different marker types/shapes.
"""

fig = Figure()

fig.basemap(projection="x1i", region=[0, 7, 3, 7], frame=True)

fig.plot(
data="@Table_5_11.txt",
style="c0.15i",
color="lightgreen",
pen="faint",
l="Apples",
)
fig.plot(data="@Table_5_11.txt", pen="1.5p,gray", l='"My lines"')
fig.plot(data="@Table_5_11.txt", style="t0.15i", color="orange", l="Oranges")

fig.legend(position="JTR+jTR")

return fig


@pytest.mark.mpl_image_compare
def test_legend_specfile():
"""
Test specfile functionality.
"""

specfile_contents = """
G -0.1i
H 24 Times-Roman My Map Legend
D 0.2i 1p
N 2
V 0 1p
S 0.1i c 0.15i p300/12 0.25p 0.3i This circle is hachured
S 0.1i e 0.15i yellow 0.25p 0.3i This ellipse is yellow
S 0.1i w 0.15i green 0.25p 0.3i This wedge is green
S 0.1i f0.1i+l+t 0.25i blue 0.25p 0.3i This is a fault
S 0.1i - 0.15i - 0.25p,- 0.3i A dashed contour
S 0.1i v0.1i+a40+e 0.25i magenta 0.25p 0.3i This is a vector
S 0.1i i 0.15i cyan 0.25p 0.3i This triangle is boring
V 0 1p
D 0.2i 1p
N 1
G 0.05i
G 0.05i
G 0.05i
L 9 4 R Smith et al., @%5%J. Geophys. Res., 99@%%, 2000
G 0.1i
P
T Let us just try some simple text that can go on a few lines.
T There is no easy way to predetermine how many lines will be required,
T so we may have to adjust the box height to get the right size box.
"""

with GMTTempFile() as specfile:

with open(specfile.name, "w") as file:
file.write(specfile_contents)

fig = Figure()

fig.basemap(projection="x6i", region=[0, 1, 0, 1], frame=True)
fig.legend(specfile.name, position="JTM+jCM+w5i")

return fig
weiji14 marked this conversation as resolved.
Show resolved Hide resolved


def test_legend_fails():
"""
Test legend fails with invalid spec
"""
fig = Figure()
with pytest.raises(GMTInvalidInput):
fig.legend(spec=["@Table_5_11.txt"])