Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -27,6 +27,7 @@ Plotting map elements
Figure.basemap
Figure.coast
Figure.colorbar
Figure.directional_rose
Figure.hlines
Figure.inset
Figure.legend
Expand Down
1 change: 1 addition & 0 deletions pygmt/figure.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@ def _repr_html_(self) -> str:
coast,
colorbar,
contour,
directional_rose,
grdcontour,
grdimage,
grdview,
Expand Down
1 change: 1 addition & 0 deletions pygmt/src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from pygmt.src.config import config
from pygmt.src.contour import contour
from pygmt.src.dimfilter import dimfilter
from pygmt.src.directional_rose import directional_rose
from pygmt.src.filter1d import filter1d
from pygmt.src.grd2cpt import grd2cpt
from pygmt.src.grd2xyz import grd2xyz
Expand Down
108 changes: 108 additions & 0 deletions pygmt/src/directional_rose.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
"""
directional_rose - Add a map directional rose.
"""

from collections.abc import Sequence
from typing import Literal

from pygmt._typing import AnchorCode
from pygmt.alias import Alias, AliasSystem
from pygmt.clib import Session
from pygmt.helpers import build_arg_list, fmt_docstring
from pygmt.params import Box, Position
from pygmt.src._common import _parse_position

__doctest_skip__ = ["directional_rose"]


@fmt_docstring
def directional_rose(
self,
position: Position | Sequence[float | str] | AnchorCode | None = None,
width: float | str | None = None,
fancy: Literal[1, 2, 3] | bool = False,
labels: Sequence[str] | bool = False,
box: Box | bool = False,
verbose: Literal["quiet", "error", "warning", "timing", "info", "compat", "debug"]
| bool = False,
panel: int | Sequence[int] | bool = False,
perspective: str | bool = False,
transparency: float | None = None,
):
"""
Add a directional rose on the map.

Parameters
----------
position
Position of the directional rose on the plot. It can be specified in multiple
ways:

- A :class:`pygmt.params.Position` object to fully control the reference point,
anchor point, and offset.
- A sequence of two values representing the x and y coordinates in plot
coordinates, e.g., ``(1, 2)`` or ``("1c", "2c")``.
- A :doc:`2-character justification code </techref/justification_codes>` for a
position inside the plot, e.g., ``"TL"`` for Top Left corner inside the plot.

If not specified, defaults to the bottom-left corner of the plot.
width
Width of the rose in plot coordinates, or append unit ``%`` for a size in
percentage of plot width [Default is 10%].
fancy
Get a fancy rose. The fanciness level can be set to 1, 2, or 3:

- Level 1 draws the two principal E-W, N-S orientations
- Level 2 adds the two intermediate NW-SE and NE-SW orientations
- Level 3 adds the four minor orientations WNW-ESE, NNW-SSE, NNE-SSW, and
ENE-WSW

If set to ``True``, defaults to level 1.
labels
A sequence of four strings to label the cardinal points W, E, S, N. Use an empty
string to skip a specific label. If set to ``True``, default labels are used
(``["W", "E", "S", "N"]`` for a fancy rose and ``["", "", "", "N"]`` for a
simple rose).
box
Draw a background box behind the directional rose. If set to ``True``, a simple
rectangular box is drawn using :gmt-term:`MAP_FRAME_PEN`. To customize the box
appearance, pass a :class:`pygmt.params.Box` object to control style, fill, pen,
and other box properties.
$verbose
$panel
$perspective
$transparency

Examples
--------
>>> import pygmt
>>> fig = pygmt.Figure()
>>> fig.basemap(region=[0, 80, 0, 30], projection="M10c", frame=True)
>>> fig.directional_rose()
>>> fig.show()
"""
self._activate_figure()

position = _parse_position(
position,
kwdict={"width": width, "fancy": fancy, "labels": labels},
default=Position("BL", cstype="inside"), # Default to BL.
)

aliasdict = AliasSystem(
F=Alias(box, name="box"),
Td=[
Alias(position, name="position"),
Alias(width, name="width", prefix="+w"),
Alias(fancy, name="fancy", prefix="+f"),
Alias(labels, name="labels", prefix="+l", sep=",", size=4),
],
).add_common(
V=verbose,
c=panel,
p=perspective,
t=transparency,
)

with Session() as lib:
lib.call_module(module="basemap", args=build_arg_list(aliasdict))
5 changes: 5 additions & 0 deletions pygmt/tests/baseline/test_directional_rose.png.dvc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
outs:
- md5: c1c167a826132bcdabc3b032438db01e
size: 8319
hash: md5
path: test_directional_rose.png
5 changes: 5 additions & 0 deletions pygmt/tests/baseline/test_directional_rose_complex.png.dvc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
outs:
- md5: 7a7eabd0036dc9b744e54dfbc398fc6e
size: 9772
hash: md5
path: test_directional_rose_complex.png
5 changes: 5 additions & 0 deletions pygmt/tests/baseline/test_directional_rose_fancy.png.dvc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
outs:
- md5: 7498ed12efd8b956a0fe13d18e0e3ea9
size: 8648
hash: md5
path: test_directional_rose_fancy.png
45 changes: 45 additions & 0 deletions pygmt/tests/test_directional_rose.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""
Test Figure.directional_rose.
"""

import pytest
from pygmt import Figure
from pygmt.params import Position


@pytest.mark.mpl_image_compare
def test_directional_rose():
"""
Test the Figure.directional_rose method with default position and width.
"""
fig = Figure()
fig.basemap(region=[0, 80, 0, 30], projection="M10c", frame=True)
fig.directional_rose()
return fig


@pytest.mark.mpl_image_compare
def test_directional_rose_fancy():
"""
Test the Figure.directional_rose method with default position and width.
"""
fig = Figure()
fig.basemap(region=[0, 80, 0, 30], projection="M10c", frame=True)
fig.directional_rose(fancy=True)
return fig


@pytest.mark.mpl_image_compare
def test_directional_rose_complex():
"""
Test the Figure.directional_rose method with more parameters.
"""
fig = Figure()
fig.basemap(region=[0, 80, 0, 30], projection="M10c", frame=True)
fig.directional_rose(
position=Position((50, 0), cstype="mapcoords", anchor="MC", offset=(1, 1)),
width="1c",
labels=["", "", "", "N"],
fancy=2,
)
return fig
3 changes: 2 additions & 1 deletion pygmt/tests/test_inset.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ def test_inset_context_manager():
fig.basemap(region=[-74, -69.5, 41, 43], projection="M9c", frame=True)
with fig.inset(position="jBL+w3c+o0.2c", clearance=0.2, box=True):
fig.basemap(region="g", projection="G47/-20/?", frame="afg")
fig.basemap(rose="jTR+w3c") # Pass rose argument with basemap after the inset
# Plot an rose after the inset
fig.directional_rose(position="TR", width="3c")
return fig
Loading