-
Notifications
You must be signed in to change notification settings - Fork 228
Wrap inset #788
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
willschlitzer
merged 81 commits into
GenericMappingTools:master
from
willschlitzer:wrap-inset
Feb 5, 2021
Merged
Wrap inset #788
Changes from all commits
Commits
Show all changes
81 commits
Select commit
Hold shift + click to select a range
b7eb160
Add inset_begin() and inset_end() to base_plotting.py
willschlitzer b2b0221
Fix inset kwargs decorator
willschlitzer 7bc6718
Update docstrings for inset_begin() in base_plotting.py
willschlitzer f77c4d0
Update API index for inset_begin() and inset_end()
willschlitzer 4d12ee6
Update location parameter explanation on inset_begin() in base_plotti…
willschlitzer 63795b7
Format inset_begin docstring to 79 character line limit
willschlitzer 253a0c6
Wording in inset_begin docstring
willschlitzer 11225e5
Adding line break in docstring
willschlitzer 8473286
Add margin and border doc strings for inset_begin() in base_plotting
willschlitzer 27fc16c
Add verbose alias to parameter list in inset_begin()
willschlitzer 72edffd
Update doc string for inset_begin() in base_plotting.py
willschlitzer 934b75e
Splitting up parameter headings in inset_begin()
willschlitzer 526abf0
Add test_inset.py
willschlitzer d720a57
Removing parameter heading breakdown for inset_begin
willschlitzer 983bb53
Fix test
willschlitzer db9fb9d
Use aliases for both instances of Figure.coast() in test_inset_aliases()
willschlitzer 4fead4c
Run make format
willschlitzer 610fdee
Add test_inset_end() to test_inset.py
willschlitzer f1548c3
Add test_inset_end_requirement() to test_inset.py
willschlitzer e479416
Update doc string for inset_end() in base_plotting.py
willschlitzer 8e3729b
Merge branch 'master' into wrap-inset
willschlitzer 4d0f3c8
Merge branch 'master' into wrap-inset
willschlitzer 0f30688
Add failing attempt for inset context manager
willschlitzer 891734c
Merge branch 'master' into wrap-inset
willschlitzer 857ead7
Update pygmt/base_plotting.py
willschlitzer e46075a
Merge branch 'wrap-inset' of https://github.com/willschlitzer/pygmt i…
willschlitzer 76673e1
Update inset with docstring and context manager
willschlitzer 89b677c
Remove inset_begin and inset_end
willschlitzer f608b9e
Update test_inset.py
willschlitzer d5ad8ad
Remove unused import from test_inset.py
willschlitzer c4d6dc0
Update api index.rst
willschlitzer ab48e96
Add gallery example with inset.py
willschlitzer ce22b30
Add gallery example with inset.py
willschlitzer 271e742
Add initial inset tutorials
willschlitzer 96bde3b
Complete inset tutorial
willschlitzer 5326f24
Add test_inset_context_manager() in test_inset.py
willschlitzer 8e3ffee
Remove inset.py sub-header
willschlitzer 6807a97
Add comment
willschlitzer 83aee63
Merge branch 'master' into wrap-inset
willschlitzer ed8c282
Add verbose handling to end inset
willschlitzer 50ad1f6
Merge branch 'master' into wrap-inset
willschlitzer 3e07e93
Move inset function to inset.py
willschlitzer 010cb94
Merge branch 'master' into wrap-inset
willschlitzer 38c420e
Update examples/tutorials/inset.py
willschlitzer 277e1c6
Update examples/tutorials/inset.py
willschlitzer 6613043
Change inset -F parameter from border to box
willschlitzer d79625a
Merge remote-tracking branch 'origin/wrap-inset' into wrap-inset
willschlitzer 383dc95
Update comment string in inset tutorial
willschlitzer c67658a
Fix tutorial
willschlitzer 532eb2e
Fix gallery plot
willschlitzer bc241da
Merge branch 'master' into wrap-inset
willschlitzer 9dfcf0d
Merge branch 'master' into wrap-inset
willschlitzer e5e591d
Refer to location argument as required in inset tutorial
willschlitzer 8602089
Update examples/gallery/plot/inset.py
willschlitzer cd24873
Update examples/tutorials/inset.py
willschlitzer 5d87061
Update examples/tutorials/inset.py
willschlitzer 330f592
Update pygmt/src/inset.py
willschlitzer 46ae07a
Update pygmt/tests/test_inset.py
willschlitzer a140244
Update pygmt/tests/test_inset.py
willschlitzer 924298f
Update pygmt/src/inset.py
willschlitzer d252354
Change location to position in inset gallery
willschlitzer f3eaa8e
Merge remote-tracking branch 'origin/wrap-inset' into wrap-inset
willschlitzer d6267e7
Change location to position in inset tutorial
willschlitzer 1434075
Remove unused imports from inset.py
willschlitzer ab9713c
Merge branch 'master' into wrap-inset
willschlitzer 0124265
Apply suggestions from code review
willschlitzer 336488b
Add example; rewrite doc string
willschlitzer 8968631
Apply suggestions from code review
willschlitzer d4443fe
Merge branch 'master' into wrap-inset
willschlitzer 7ecffd1
Fixing figure width issues in inset examples
willschlitzer ba47788
Apply suggestions from code review
willschlitzer 96df4a8
Apply suggestions from code review
willschlitzer 37705dc
Remove supplementary module comment
willschlitzer 276840e
Move pylint comment to top of src/__init__.py
willschlitzer 717e404
Update examples/gallery/plot/inset.py
willschlitzer 687ffb5
Update pygmt/src/inset.py
willschlitzer 741b770
Update pygmt/src/inset.py
willschlitzer 7c16b75
Update pygmt/src/inset.py
willschlitzer 7839399
Update examples/gallery/plot/inset.py
willschlitzer 716c03d
Update examples/tutorials/inset.py
willschlitzer 91d83fd
Fix inset end -V
weiji14 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
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,25 @@ | ||
""" | ||
Inset | ||
----- | ||
|
||
The :meth:`pygmt.Figure.inset` method adds an inset figure inside a larger | ||
figure. The function is called using a ``with`` statement, and its position, | ||
box, offset, and margin parameters are set. Within the ``with`` statement, | ||
PyGMT plotting functions can be called that add to the inset figure. | ||
""" | ||
import pygmt | ||
|
||
fig = pygmt.Figure() | ||
# Create the primary figure, setting the region to Madagascar, the land color to | ||
# "brown", the water to "lightblue", the shorelines width to "thin", and adding a frame | ||
fig.coast(region="MG+r2", land="brown", water="lightblue", shorelines="thin", frame="a") | ||
# Create an inset, setting the position to top left, the width to 3.5 centimeters, and | ||
# the x- and y-offsets to 0.2 centimeters. The margin is set to 0, and the border is "green". | ||
with fig.inset(position="jTL+w3.5c+o0.2c", margin=0, box="+pgreen"): | ||
# Create a figure in the inset using coast. This example uses the azimuthal | ||
# orthogonal projection centered at 47E, 20S. The land is set to "gray" and | ||
# Madagascar is highlighted in "red". | ||
fig.coast( | ||
region="g", projection="G47/-20/3.5c", land="gray", water="white", dcw="MG+gred" | ||
) | ||
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 |
---|---|---|
@@ -0,0 +1,110 @@ | ||
""" | ||
Adding an inset to the figure | ||
============================= | ||
|
||
To plot an inset figure inside another larger figure, we can use the | ||
:meth:`pygmt.Figure.inset` method. After a large figure has been created, | ||
call ``inset`` using a ``with`` statement, and new plot elements will be | ||
added to the inset figure instead of the larger figure. | ||
""" | ||
# sphinx_gallery_thumbnail_number = 4 | ||
|
||
import pygmt | ||
|
||
######################################################################################## | ||
# | ||
# Prior to creating an inset figure, a larger figure must first be plotted. In the | ||
# example below, :meth:`pygmt.Figure.coast` is used to create a map of the US state of | ||
# Massachusetts. | ||
|
||
fig = pygmt.Figure() | ||
fig.coast( | ||
region=[-74, -69.5, 41, 43], # Set bounding box of the large figure | ||
borders="2/thin", # Plot state boundaries with thin lines | ||
shorelines="thin", # Plot coastline with thin lines | ||
projection="M15c", # Set Mercator projection and size of 15 centimeter | ||
land="lightyellow", # Color land areas light yellow | ||
water="lightblue", # Color water areas light blue | ||
frame="a", # Set frame with annotation and major tick spacing | ||
) | ||
fig.show() | ||
|
||
######################################################################################## | ||
# | ||
# The :meth:`pygmt.Figure.inset` method uses a context manager, and is called using a | ||
# ``with`` statement. The ``position`` argument, including the inset width, is required | ||
# to plot the inset. Using the **j** argument, the location of the inset is | ||
# set to one of the 9 anchors (bottom-middle-top and left-center-right). In the | ||
# example below, ``BL`` sets the inset to the bottom left. The ``box`` argument can | ||
# set the fill and border of the inset. In the example below, ``+pblack`` sets the | ||
# border color to black and ``+gred`` sets the fill to red. | ||
|
||
fig = pygmt.Figure() | ||
fig.coast( | ||
region=[-74, -69.5, 41, 43], | ||
borders="2/thin", | ||
shorelines="thin", | ||
projection="M15c", | ||
land="lightyellow", | ||
water="lightblue", | ||
frame="a", | ||
) | ||
with fig.inset(position="jBL+w3c", box="+pblack+glightred"): | ||
# pass is used to exit the with statement as no plotting functions are called | ||
pass | ||
fig.show() | ||
|
||
######################################################################################## | ||
# | ||
# When using **j** to set the anchor of the inset, the default location is in | ||
# contact with the nearby axis or axes. The offset of the inset can be set with **+o**, | ||
# followed by the offsets along the x- and y-axis. If only one offset is | ||
# passed, it is applied to both axes. Each offset can have its own unit. In | ||
# the example below, the inset is shifted 0.5 centimeters on the x-axis and | ||
# 0.2 centimeters on the y-axis. | ||
|
||
fig = pygmt.Figure() | ||
fig.coast( | ||
region=[-74, -69.5, 41, 43], | ||
borders="2/thin", | ||
shorelines="thin", | ||
projection="M15c", | ||
land="lightyellow", | ||
water="lightblue", | ||
frame="a", | ||
) | ||
with fig.inset(position="jBL+w3c+o0.5c/0.2c", box="+pblack+glightred"): | ||
pass | ||
fig.show() | ||
|
||
######################################################################################## | ||
# | ||
# Standard plotting functions can be called from within the ``inset`` context manager. | ||
# The example below uses :meth:`pygmt.Figure.coast` to plot a zoomed out map that | ||
# selectively paints the state of Massachusetts to shows its location relative to | ||
# other states. | ||
|
||
fig = pygmt.Figure() | ||
fig.coast( | ||
region=[-74, -69.5, 41, 43], | ||
borders="2/thin", | ||
shorelines="thin", | ||
projection="M15c", | ||
land="lightyellow", | ||
water="lightblue", | ||
frame="a", | ||
) | ||
# This does not include an inset fill as it is covered by the inset figure | ||
with fig.inset(position="jBL+w3c+o0.5c/0.2c", box="+pblack"): | ||
# Use a plotting function to create a figure inside the inset | ||
fig.coast( | ||
region=[-80, -65, 35, 50], | ||
projection="M3c", | ||
willschlitzer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
land="gray", | ||
borders=[1, 2], | ||
shorelines="1/thin", | ||
water="white", | ||
# Use dcw to selectively highlight an area | ||
dcw="US.MA+gred", | ||
) | ||
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
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,132 @@ | ||
""" | ||
inset - Create inset figures. | ||
""" | ||
import contextlib | ||
|
||
from pygmt.clib import Session | ||
from pygmt.helpers import build_arg_string, fmt_docstring, kwargs_to_strings, use_alias | ||
|
||
|
||
@fmt_docstring | ||
@contextlib.contextmanager | ||
@use_alias(D="position", F="box", M="margin", N="no_clip", V="verbose") | ||
@kwargs_to_strings(D="sequence", M="sequence") | ||
def inset(self, **kwargs): | ||
r""" | ||
Create an inset figure to be placed within a larger figure. | ||
|
||
This function sets the position, frame, and margins for a smaller figure | ||
inside of the larger figure. Plotting functions that are called within the | ||
context manager are added to the inset figure. | ||
|
||
Full option list at :gmt-docs:`inset.html` | ||
|
||
{aliases} | ||
|
||
Parameters | ||
---------- | ||
position : str or list | ||
*xmin/xmax/ymin/ymax*\ [**+r**][**+u**\ *unit*]] \ | ||
| [**g**\|\ **j**\|\ **J**\|\ **n**\|\ **x**]\ *refpoint*\ | ||
**+w**\ *width*\ [/*height*][**+j**\ *justify*] | ||
[**+o**\ *dx*\ [/*dy*]] | ||
|
||
*This is the only required argument.* | ||
Define the map inset rectangle on the map. Specify the rectangle | ||
in one of three ways: | ||
|
||
Append **g**\ *lon*/*lat* for map (user) coordinates, | ||
**j**\ *code* or **J**\ *code* for setting the *refpoint* via a | ||
2-char justification code \ that refers to the (invisible) | ||
projected map bounding box, **n**\ *xn*/*yn* for normalized (0-1) | ||
bounding box coordinates, or **x**\ *x*/*y* for plot | ||
coordinates (inches, cm, points, append unit). | ||
All but **x** requires both ``region`` and ``projection`` to be | ||
specified. You can offset the reference point via | ||
**+o**\ *dx*/*dy* in the direction implied by *code* or | ||
**+j**\ *justify*. | ||
|
||
Alternatively, Give *west/east/south/north* of geographic | ||
rectangle bounded by parallels and meridians; append **+r** if the | ||
coordinates instead are the lower left and upper right corners of | ||
the desired rectangle. (Or, give *xmin/xmax/ymin/ymax* of bounding | ||
rectangle in projected coordinates and optionally | ||
append **+u**\ *unit* [Default coordinate unit is meter (e)]. | ||
|
||
Append **+w**\ *width*\ [/*height*] of bounding rectangle or box | ||
in plot coordinates (inches, cm, etc.). By default, the anchor | ||
point on the scale is assumed to be the bottom left corner (BL), | ||
but this can be changed by appending **+j** followed by a 2-char | ||
justification code *justify*. | ||
**Note**: If **j** is used then *justify* defaults to the same | ||
as *refpoint*, if **J** is used then *justify* defaults to the | ||
mirror opposite of *refpoint*. Specify inset box attributes via | ||
the ``box`` option [outline only]. | ||
box : str or bool | ||
[**+c**\ *clearances*][**+g**\ *fill*][**+i**\ [[*gap*/]\ | ||
*pen*]][**+p**\ [*pen*]][**+r**\ [*radius*]][**+s**\ | ||
[[*dx*/*dy*/][*shade*]]] | ||
|
||
If passed ``True``, this draws a rectangular box around the map | ||
inset using the default pen; specify a different pen | ||
with **+p**\ *pen*. Add **+g**\ *fill* to fill the logo box | ||
[Default is no fill]. | ||
Append **+c**\ *clearance* where *clearance* is either | ||
*gap*, *xgap*\ /\ *ygap*, or *lgap*\ /\ *rgap*\ /\ *bgap*\ /\ | ||
*tgap* where these items are uniform, separate in x- and | ||
y-direction, or individual side spacings between logo and border. | ||
Append **+i** to draw a secondary, inner border as well. We use a | ||
uniform *gap* between borders of 2\ **p** and the default pen | ||
unless other values are specified. Append **+r** to draw rounded | ||
rectangular borders instead, with a 6\ **p** corner radius. You | ||
can override this radius by appending another value. Append | ||
**+s** to draw an offset background shaded region. Here, *dx*/*dy* | ||
indicates the shift relative to the foreground frame | ||
[4\ **p**/-4\ **p**] and *shade* sets the fill style to use for | ||
shading [Default is gray50]. | ||
margin : int or str or list | ||
This is clearance that is added around the inside of the inset. | ||
Plotting will take place within the inner region only. The margins | ||
can be a single value, a pair of values separated (for setting | ||
separate horizontal and vertical margins), or the full set of four | ||
margins (for setting separate left, right, bottom, and top | ||
margins). When passing multiple values, it can be either a list or | ||
a string with the values separated by forward | ||
slashes [Default is no margins]. | ||
willschlitzer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
no_clip : bool | ||
Do NOT clip features extruding outside map inset boundaries [Default | ||
will clip]. | ||
{V} | ||
|
||
Examples | ||
-------- | ||
>>> import pygmt | ||
>>> | ||
>>> # Create the larger figure | ||
>>> fig = pygmt.Figure() | ||
>>> fig.coast(region="MG+r2", water="lightblue", shorelines="thin") | ||
>>> # Use a "with" statement to initialize the inset context manager | ||
>>> # Setting the position to top left and a width of 3.5 centimeters | ||
>>> with fig.inset(position="jTL+w3.5c+o0.2c", margin=0, box="+pgreen"): | ||
... # Map elements under the "with" statement are plotted in the inset | ||
... fig.coast( | ||
... region="g", | ||
... projection="G47/-20/3.5c", | ||
... land="gray", | ||
... water="white", | ||
... dcw="MG+gred", | ||
... ) | ||
... | ||
willschlitzer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
>>> # Map elements outside the "with" block are plotted in the main figure | ||
>>> fig.logo(position="jBR+o0.2c+w3c") | ||
willschlitzer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
>>> fig.show() | ||
<IPython.core.display.Image object> | ||
""" | ||
kwargs = self._preprocess(**kwargs) # pylint: disable=protected-access | ||
with Session() as lib: | ||
try: | ||
lib.call_module("inset", f"begin {build_arg_string(kwargs)}") | ||
yield | ||
finally: | ||
v_arg = build_arg_string({"V": kwargs.get("V")}) | ||
lib.call_module("inset", f"end {v_arg}".strip()) |
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,42 @@ | ||
""" | ||
Tests for the inset function. | ||
""" | ||
from pygmt import Figure | ||
from pygmt.helpers.testing import check_figures_equal | ||
|
||
|
||
@check_figures_equal() | ||
def test_inset_aliases(): | ||
""" | ||
Test the aliases for the inset function. | ||
""" | ||
fig_ref, fig_test = Figure(), Figure() | ||
fig_ref.basemap(R="MG+r2", B="afg") | ||
with fig_ref.inset(D="jTL+w3.5c+o0.2c", M=0, F="+pgreen"): | ||
fig_ref.basemap(R="g", J="G47/-20/4c", B="afg") | ||
|
||
fig_test.basemap(region="MG+r2", frame="afg") | ||
with fig_test.inset(position="jTL+w3.5c+o0.2c", margin=0, box="+pgreen"): | ||
fig_test.basemap(region="g", projection="G47/-20/4c", frame="afg") | ||
return fig_ref, fig_test | ||
|
||
|
||
@check_figures_equal() | ||
def test_inset_context_manager(): | ||
""" | ||
Test that the inset context manager works and, once closed, plotting | ||
elements are added to the larger figure. | ||
""" | ||
fig_ref, fig_test = Figure(), Figure() | ||
|
||
fig_ref.basemap(region=[-74, -69.5, 41, 43], projection="M9c", frame=True) | ||
fig_ref.basemap(rose="jTR+w3c") # Pass rose argument with basemap before the inset | ||
with fig_ref.inset(position="jBL+w3c+o0.2c", margin=0, box="+pblack"): | ||
fig_ref.basemap(region=[-80, -65, 35, 50], projection="M3c", frame="afg") | ||
|
||
fig_test.basemap(region=[-74, -69.5, 41, 43], projection="M9c", frame=True) | ||
with fig_test.inset(position="jBL+w3c+o0.2c", margin=0, box="+pblack"): | ||
fig_test.basemap(region=[-80, -65, 35, 50], projection="M3c", frame="afg") | ||
fig_test.basemap(rose="jTR+w3c") # Pass rose argument with basemap after the inset | ||
|
||
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.