In [ ]:
%matplotlib inline
%config InlineBackend.figure_format = "retina"
from matplotlib import rcParams
rcParams["savefig.dpi"] = 200
# rcParams["font.size"] = 8
import warnings
warnings.filterwarnings("ignore")
# turn off pandas html repr:
# does not gracefully survive the ipynb -> rst -> html conversion
import pandas as pd
pd.set_option("display.notebook_repr_html", False)
regionmask includes support for regions defined as geopandas GeoDataFrame. These are often shapefiles, which can be opened in the formats .zip or .shp with geopandas.read_file(url_or_path).
There are two possibilities:
mask_geopandas or mask_3D_geopandas. Regions object (regionmask's internal data container) using from_geopandas.As always, start with the imports:
In [ ]:
import cartopy.crs as ccrs
import geopandas as gp
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pooch
import regionmask
regionmask.__version__
In [ ]:
file = pooch.retrieve(
"https://pubs.usgs.gov/of/2006/1187/basemaps/continents/continents.zip", None
)
continents = gp.read_file("zip://" + file)
display(continents)
In [ ]:
lon = np.arange(-180, 180)
lat = np.arange(-90, 90)
mask = regionmask.mask_geopandas(continents, lon, lat)
Let's plot the new mask:
In [ ]:
f, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()))
mask.plot(
ax=ax, transform=ccrs.PlateCarree(), add_colorbar=False,
)
ax.coastlines(color="0.1");
Similarly a 3D boolean mask can be created from a GeoDataFrame:
In [ ]:
mask_3D = regionmask.mask_3D_geopandas(continents, lon, lat)
and plotted:
In [ ]:
from matplotlib import colors as mplc
cmap1 = mplc.ListedColormap(["none", "#9ecae1"])
f, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()))
mask_3D.sel(region=0).plot(
ax=ax, transform=ccrs.PlateCarree(), add_colorbar=False, cmap=cmap1,
)
ax.coastlines(color="0.1");
In [ ]:
continents_regions = regionmask.from_geopandas(continents)
continents_regions
This creates default names ("Region0", ..., "RegionN") and abbreviations ("r0", ..., "rN").
However, it is often advantageous to use columns of the GeoDataFrame as names and abbrevs. If no column with abbreviations is available, you can use abbrevs='_from_name', which creates unique abbreviations using the names column.
In [ ]:
continents_regions = regionmask.from_geopandas(
continents, names="CONTINENT", abbrevs="_from_name", name="continent"
)
continents_regions
As usual the newly created Regions object can be plotted on a world map:
In [ ]:
continents_regions.plot(label="name", coastlines=False);
And to create mask a mask for arbitrary latitude/ longitude grids:
In [ ]:
lon = np.arange(0, 360)
lat = np.arange(-90, 90)
mask = continents_regions.mask(lon, lat)
which can then be plotted
In [ ]:
f, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()))
h = mask.plot(
ax=ax,
transform=ccrs.PlateCarree(),
cmap="Reds",
add_colorbar=False,
levels=np.arange(-0.5, 8),
)
cbar = plt.colorbar(h, shrink=0.625, pad=0.025, aspect=12)
cbar.set_ticks(np.arange(8))
cbar.set_ticklabels(continents_regions.names)
ax.coastlines(color="0.2")
continents_regions.plot_regions(add_label=False);