Skip to content

Commit

Permalink
Figure.subplot: Fix strange positioning issues after exiting subplot (#…
Browse files Browse the repository at this point in the history
…2427)

Co-authored-by: Wei Ji <[email protected]>
  • Loading branch information
seisman and weiji14 authored Mar 16, 2023
1 parent 139c97e commit 598a5ab
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 4 deletions.
2 changes: 1 addition & 1 deletion examples/gallery/images/grdgradient_shading.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,6 @@
panel=True,
)

fig.colorbar(position="x9.0c/-1.1c+w10c/0.25c+h", frame="a2000f500+lElevation (m)")
fig.colorbar(position="JBC+w10c/0.25c+h", frame="a2000f500+lElevation (m)")

fig.show()
11 changes: 8 additions & 3 deletions pygmt/src/subplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,12 +154,17 @@ def subplot(self, nrows=1, ncols=1, **kwargs):
"Please provide either one of 'figsize' or 'subsize' only."
)

with Session() as lib:
try:
# Need to use separate sessions for "subplot begin" and "subplot end".
# Otherwise, "subplot end" will use the last session, which may cause
# strange positioning issues for later plotting calls.
# See https://github.com/GenericMappingTools/pygmt/issues/2426.
try:
with Session() as lib:
arg_str = " ".join(["begin", f"{nrows}x{ncols}", build_arg_string(kwargs)])
lib.call_module(module="subplot", args=arg_str)
yield
finally:
finally:
with Session() as lib:
v_arg = build_arg_string({"V": kwargs.get("V")})
lib.call_module(module="subplot", args=f"end {v_arg}")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
outs:
- md5: 976a01a8c9f583918c00b5a81fddaf84
size: 12112
path: test_subplot_outside_plotting_positioning.png
16 changes: 16 additions & 0 deletions pygmt/tests/test_subplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,19 @@ def test_subplot_nrows_ncols_less_than_one_error():
with pytest.raises(GMTInvalidInput):
with fig.subplot(nrows=0, ncols=-1, figsize=("2c", "1c")):
pass


@pytest.mark.mpl_image_compare
def test_subplot_outside_plotting_positioning():
"""
Plotting calls are correctly positioned after exiting subplot.
This is a regression test for
https://github.com/GenericMappingTools/pygmt/issues/2426.
"""
fig = Figure()
with fig.subplot(nrows=1, ncols=2, figsize=(10, 5)):
fig.basemap(region=[0, 10, 0, 10], projection="X?", frame=True, panel=True)
fig.basemap(region=[0, 10, 0, 10], projection="X?", frame=True, panel=True)
fig.colorbar(position="JBC+w5c+h", cmap="turbo", frame=True)
return fig

0 comments on commit 598a5ab

Please sign in to comment.