Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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