"""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)