Source code for typhon.plots.maps

"""Functions related to plotting maps. """
from collections import namedtuple

from matplotlib import pyplot as plt


_CartopyError = ImportError(
    "You have to install `cartopy` to use functions located in `typhon.plots.maps`."
)


[docs] def worldmap( lat, lon, var=None, fig=None, ax=None, projection=None, bg=False, draw_grid=False, draw_coastlines=False, interpolation=False, **kwargs, ): """Plots the track of a variable on a worldmap. Args: lat: Array of latitudes. lon: Array of longitudes. var: Additional array for the variable to plot. If 1-dimensional, the variable is plotted as track changing the color according to a color map. If 2-dimensional, variable is plotted as contour plot. fig: A matplotlib figure object. If not given, the current figure is used. ax: A matplotlib axis object. If not given, a new axis object will be created in the current figure. projection: If no axis is given, specify here the cartopy projection. bg: If true, a background image will be drawn. draw_grid: draw_coastlines: **kwargs: Returns: Scatter plot objects. """ try: import cartopy.crs as ccrs except ImportError: raise _CartopyError # Default keyword arguments to pass to hist2d(). kwargs_defaults = { "cmap": "qualitative1", "s": 1, # This accelerates the drawing of many points: "rasterized": lat.size > 100_000, **kwargs, } if fig is None: fig = plt.gcf() if projection is None: if ax is None: projection = ccrs.PlateCarree() else: projection = ax.projection if ax is None: ax = fig.add_subplot(111, projection=projection) if bg: ax.stock_img() if draw_grid: ax.gridlines(draw_labels=True) if draw_coastlines: ax.coastlines() # It is counter-intuitive but if we want to plot our data with normal # latitudes and longitudes, we always have to set the transform to # PlateCarree (see https://github.com/SciTools/cartopy/issues/911) if var is None or len(var.shape) == 1: kwargs_defaults = { "cmap": "qualitative1", "s": 1, # This accelerates the drawing of many points: "rasterized": lat.size > 100_000, **kwargs, } plot = ax.scatter( lon, lat, c=var, transform=ccrs.PlateCarree(), **kwargs_defaults ) elif interpolation: kwargs_defaults = {**kwargs} plot = ax.contourf( lon, lat, var, transform=ccrs.PlateCarree(), **kwargs_defaults ) else: kwargs_defaults = {**kwargs} plot = ax.pcolormesh( lon, lat, var, transform=ccrs.PlateCarree(), **kwargs_defaults ) return plot
[docs] def get_cfeatures_at_scale(scale="110m"): """Return a collection of `NaturalEarthFeature` at given scale. Parameters: scale (str): The dataset scale, i.e. one of ‘10m’, ‘50m’, or ‘110m’. Corresponding to 1:10,000,000, 1:50,000,000, and 1:110,000,000 respectively. Returns: collections.namedtuple: Collection of :class:`~cartopy.feature.NaturalEarthFeature` Examples: >>> features = get_cfeatures_at_scale('50m') >>> print(features.COASTLINE.scale) '50m' """ try: from cartopy.feature import NaturalEarthFeature, COLORS except ImportError: raise _CartopyError d = {} d["BORDERS"] = NaturalEarthFeature( category="cultural", name="admin_0_boundary_lines_land", scale=scale, edgecolor="black", facecolor="none", ) d["STATES"] = NaturalEarthFeature( category="cultural", name="admin_1_states_provinces_lakes", scale=scale, edgecolor="black", facecolor="none", ) d["COASTLINE"] = NaturalEarthFeature( category="physical", name="coastline", scale=scale, edgecolor="black", facecolor="none", ) d["LAKES"] = NaturalEarthFeature( category="physical", name="lakes", scale=scale, edgecolor="face", facecolor=COLORS["water"], ) d["LAND"] = NaturalEarthFeature( category="physical", name="land", scale=scale, edgecolor="face", facecolor=COLORS["land"], zorder=-1, ) d["OCEAN"] = NaturalEarthFeature( category="physical", name="ocean", scale=scale, edgecolor="face", facecolor=COLORS["water"], zorder=-1, ) d["RIVERS"] = NaturalEarthFeature( category="physical", name="rivers_lake_centerlines", scale=scale, edgecolor=COLORS["water"], facecolor="none", ) NaturalEarthFeatures = namedtuple( typename="NaturalEarthFeatures", field_names=( "BORDERS", "STATES", "COASTLINE", "LAKES", "LAND", "OCEAN", "RIVERS", ), ) return NaturalEarthFeatures(**d)