pygmt.GMTDataArrayAccessor
- class pygmt.GMTDataArrayAccessor(xarray_obj)[source]
GMT accessor for
xarray.DataArray.The gmt accessor extends
xarray.DataArrayto store GMT-specific properties for grids, which are important for PyGMT to correctly process and plot the grids. The gmt accessor contains the following properties:registration: Grid registration typepygmt.enums.GridRegistration.gtype: Grid coordinate system typepygmt.enums.GridType.
Examples
For GMT’s built-in remote datasets, these GMT-specific properties are automatically determined and you can access them as follows:
>>> from pygmt.datasets import load_earth_relief >>> # Use the global Earth relief grid with 1 degree spacing >>> grid = load_earth_relief(resolution="01d", registration="pixel") >>> # See if grid uses Gridline or Pixel registration >>> grid.gmt.registration <GridRegistration.PIXEL: 1> >>> # See if grid is in Cartesian or Geographic coordinate system >>> grid.gmt.gtype <GridType.GEOGRAPHIC: 1>
For
xarray.DataArraygrids created by yourself,registrationandgtypedefault toGridRegistration.GRIDLINEandGridType.CARTESIAN(i.e., a gridline-registered, Cartesian grid). You need to set the correct properties before passing it to PyGMT functions:>>> import numpy as np >>> import xarray as xr >>> import pygmt >>> from pygmt.enums import GridRegistration, GridType >>> # Create a DataArray in gridline coordinates of sin(lon) * cos(lat) >>> interval = 2.5 >>> lat = np.arange(90, -90 - interval, -interval) >>> lon = np.arange(0, 360 + interval, interval) >>> longrid, latgrid = np.meshgrid(lon, lat) >>> data = np.sin(np.deg2rad(longrid)) * np.cos(np.deg2rad(latgrid)) >>> grid = xr.DataArray(data, coords=[("latitude", lat), ("longitude", lon)]) >>> # Default to a gridline-registered Cartesian grid >>> grid.gmt.registration <GridRegistration.GRIDLINE: 0> >>> grid.gmt.gtype <GridType.CARTESIAN: 0> >>> # Manually set it to a gridline-registered geographic grid >>> grid.gmt.registration = GridRegistration.GRIDLINE >>> grid.gmt.gtype = GridType.GEOGRAPHIC >>> grid.gmt.registration <GridRegistration.GRIDLINE: 0> >>> grid.gmt.gtype <GridType.GEOGRAPHIC: 1>
Notes
Due to the limitations of xarray accessors, the GMT accessors are created once per
xarray.DataArrayinstance. You may lose these GMT-specific properties when manipulating grids (e.g., arithmetic and slice operations) or when accessing axarray.DataArrayfrom axarray.Dataset. In these cases, you need to manually set these properties before passing the grid to PyGMT.Inplace assignment operators like
*=don’t create new instances, so the properties are still kept:>>> grid *= 2.0 >>> grid.gmt.registration <GridRegistration.GRIDLINE: 0> >>> grid.gmt.gtype <GridType.GEOGRAPHIC: 1>
Other grid operations (e.g., arithmetic or slice operations) create new instances, so the properties will be lost:
>>> # grid2 is a slice of the original grid >>> grid2 = grid[0:30, 50:80] >>> # Properties are reset to the default values for new instance >>> grid2.gmt.registration <GridRegistration.GRIDLINE: 0> >>> grid2.gmt.gtype <GridType.CARTESIAN: 0> >>> # Need to set these properties before passing the grid to PyGMT >>> grid2.gmt.registration = grid.gmt.registration >>> grid2.gmt.gtype = grid.gmt.gtype >>> grid2.gmt.registration <GridRegistration.GRIDLINE: 0> >>> grid2.gmt.gtype <GridType.GEOGRAPHIC: 1>
Accessing a
xarray.DataArrayfrom axarray.Datasetalways creates new instances, so these properties are always lost. The workaround is to assign thexarray.DataArrayinto a variable:>>> ds = xr.Dataset({"zval": grid}) >>> ds.zval.gmt.registration <GridRegistration.GRIDLINE: 0> >>> ds.zval.gmt.gtype <GridType.CARTESIAN: 0> >>> # Manually set these properties won't work as expected >>> ds.zval.gmt.registration = GridRegistration.GRIDLINE >>> ds.zval.gmt.gtype = GridType.GEOGRAPHIC >>> ds.zval.gmt.registration, ds.zval.gmt.gtype (<GridRegistration.GRIDLINE: 0>, <GridType.CARTESIAN: 0>) >>> # workaround: assign the DataArray into a variable >>> zval = ds.zval >>> zval.gmt.registration, zval.gmt.gtype (<GridRegistration.GRIDLINE: 0>, <GridType.CARTESIAN: 0>) >>> zval.gmt.registration = GridRegistration.GRIDLINE >>> zval.gmt.gtype = GridType.GEOGRAPHIC >>> zval.gmt.registration, zval.gmt.gtype (<GridRegistration.GRIDLINE: 0>, <GridType.GEOGRAPHIC: 1>)
Attributes
- property GMTDataArrayAccessor.gtype: GridType
Grid coordinate system type
pygmt.enums.GridType.
- property GMTDataArrayAccessor.registration: GridRegistration
Grid registration type
pygmt.enums.GridRegistration.