From 424e497186d388712515b24f2982ae7f7539355c Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Wed, 6 Nov 2019 18:04:31 +1300 Subject: [PATCH 1/2] Allow passing in Red, Green, Blue grids into grdimage Using the sequence_space converter to allow for multiple grid inputs into `grdimage`. Useful when users want to make an RGB image plot e.g. from Landsat images (Bands 4,3,2). --- pygmt/base_plotting.py | 7 ++++--- .../tests/baseline/test_grdimage_rgb_files.png | Bin 0 -> 53825 bytes pygmt/tests/test_grdimage.py | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 pygmt/tests/baseline/test_grdimage_rgb_files.png diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index 90648e02d6a..a77b9e75467 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -288,12 +288,13 @@ def grdcontour(self, grid, **kwargs): @fmt_docstring @use_alias(R="region", J="projection", W="pen", B="frame", I="shading", C="cmap") - @kwargs_to_strings(R="sequence") + @kwargs_to_strings(R="sequence", grid="sequence_space") def grdimage(self, grid, **kwargs): """ Project grids or images and plot them on maps. Takes a grid file name or an xarray.DataArray object as input. + Alternatively, pass in a list of red, green, blue grids to be imaged. Full option list at :gmt-docs:`grdimage.html` @@ -301,9 +302,9 @@ def grdimage(self, grid, **kwargs): Parameters ---------- - grid : str or xarray.DataArray + grid : str, xarray.DataArray or list The file name of the input grid or the grid loaded as a DataArray. - + A list of red, green, blue grids can also be provided instead. """ kwargs = self._preprocess(**kwargs) kind = data_kind(grid, None, None) diff --git a/pygmt/tests/baseline/test_grdimage_rgb_files.png b/pygmt/tests/baseline/test_grdimage_rgb_files.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf59a2f873063d6b639c295e128f220139b5990 GIT binary patch literal 53825 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 G|9=2y9{)!G literal 0 HcmV?d00001 diff --git a/pygmt/tests/test_grdimage.py b/pygmt/tests/test_grdimage.py index 72759137f0f..5d34ec49dfd 100644 --- a/pygmt/tests/test_grdimage.py +++ b/pygmt/tests/test_grdimage.py @@ -41,6 +41,14 @@ def test_grdimage_file(): return fig +@pytest.mark.mpl_image_compare +def test_grdimage_rgb_files(): + "Plot an image using Red, Green, and Blue file inputs" + fig = Figure() + fig.grdimage(grid=["@earth_relief_60m", "@earth_relief_60m", "@earth_relief_60m"]) + return fig + + def test_grdimage_fails(): "Should fail for unrecognized input" fig = Figure() From 201664b42db7c8acf15f07b31442c6d11f68c8ea Mon Sep 17 00:00:00 2001 From: Wei Ji Date: Mon, 11 Nov 2019 16:45:16 +1300 Subject: [PATCH 2/2] Enable passing in a list of RGB xarray.DataArray grids into grdimage Extends `grdimage` to accept a list of individual red, green and blue xarray.DataArrays for plotting. Had to revert using the 'sequence_space' decorator as it would not work nicely for multiple grids... Implementation uses the contextlib.ExitStack method to create multiple virtual grid files and enter multiple contexts (similar to 3448972f991b515b9dd35a750af993473590aceb). Also added one test case with dummy data, but could do with more to capture edge cases. --- pygmt/base_plotting.py | 36 +++++++++++++++--- .../tests/baseline/test_grdimage_rgb_grid.png | Bin 0 -> 14068 bytes pygmt/tests/test_grdimage.py | 25 ++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 pygmt/tests/baseline/test_grdimage_rgb_grid.png diff --git a/pygmt/base_plotting.py b/pygmt/base_plotting.py index a77b9e75467..83f882ebb71 100644 --- a/pygmt/base_plotting.py +++ b/pygmt/base_plotting.py @@ -2,6 +2,7 @@ Base class with plot generating commands. Does not define any special non-GMT methods (savefig, show, etc). """ +import contextlib import csv import os import numpy as np @@ -288,7 +289,7 @@ def grdcontour(self, grid, **kwargs): @fmt_docstring @use_alias(R="region", J="projection", W="pen", B="frame", I="shading", C="cmap") - @kwargs_to_strings(R="sequence", grid="sequence_space") + @kwargs_to_strings(R="sequence") def grdimage(self, grid, **kwargs): """ Project grids or images and plot them on maps. @@ -304,18 +305,41 @@ def grdimage(self, grid, **kwargs): ---------- grid : str, xarray.DataArray or list The file name of the input grid or the grid loaded as a DataArray. - A list of red, green, blue grids can also be provided instead. + For plotting RGB grids, pass in a list made up of either file names or + DataArrays to the individual red, green and blue grids. """ kwargs = self._preprocess(**kwargs) - kind = data_kind(grid, None, None) + + if isinstance(grid, list): + if all([data_kind(g) == "file" for g in grid]): + kind = "file" + grid = " ".join(grid) + elif all([data_kind(g) == "grid" for g in grid]): + kind = "grid" + else: + kind = data_kind(grid) + with Session() as lib: if kind == "file": - file_context = dummy_context(grid) + file_contexts = [dummy_context(grid)] elif kind == "grid": - file_context = lib.virtualfile_from_grid(grid) + if isinstance(grid, list): + file_contexts = [ + lib.virtualfile_from_grid(grid[0]), + lib.virtualfile_from_grid(grid[1]), + lib.virtualfile_from_grid(grid[2]), + ] + else: + file_contexts = [lib.virtualfile_from_grid(grid)] else: raise GMTInvalidInput("Unrecognized data type: {}".format(type(grid))) - with file_context as fname: + with contextlib.ExitStack() as stack: + fname = " ".join( + [ + stack.enter_context(file_context) + for file_context in file_contexts + ] + ) arg_str = " ".join([fname, build_arg_string(kwargs)]) lib.call_module("grdimage", arg_str) diff --git a/pygmt/tests/baseline/test_grdimage_rgb_grid.png b/pygmt/tests/baseline/test_grdimage_rgb_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a2a69302abfe0f78fac6268a8cb3376d9bd446 GIT binary patch literal 14068 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 literal 0 HcmV?d00001 diff --git a/pygmt/tests/test_grdimage.py b/pygmt/tests/test_grdimage.py index 5d34ec49dfd..7e88ff717e7 100644 --- a/pygmt/tests/test_grdimage.py +++ b/pygmt/tests/test_grdimage.py @@ -3,6 +3,7 @@ """ import numpy as np import pytest +import xarray as xr from .. import Figure from ..exceptions import GMTInvalidInput @@ -49,6 +50,30 @@ def test_grdimage_rgb_files(): return fig +@pytest.mark.mpl_image_compare +def test_grdimage_rgb_grid(): + "Plot an image using Red, Green, and Blue xarray.DataArray inputs" + red = xr.DataArray( + data=[[128, 0, 0], [128, 0, 0]], + dims=("lat", "lon"), + coords={"lat": [0, 1], "lon": [2, 3, 4]}, + ) + green = xr.DataArray( + data=[[0, 128, 0], [0, 128, 0]], + dims=("lat", "lon"), + coords={"lat": [0, 1], "lon": [2, 3, 4]}, + ) + blue = xr.DataArray( + data=[[0, 0, 128], [0, 0, 128]], + dims=("lat", "lon"), + coords={"lat": [0, 1], "lon": [2, 3, 4]}, + ) + + fig = Figure() + fig.grdimage(grid=[red, green, blue], projection="x5c", frame=True) + return fig + + def test_grdimage_fails(): "Should fail for unrecognized input" fig = Figure()