Cartopy is a Python package that provides easy creation of maps, using matplotlib, for the analysis and visualisation of geospatial data.
In order to create a map with cartopy and matplotlib, we typically need to import pyplot from matplotlib and cartopy's crs (coordinate reference system) submodule. These are typically imported as follows:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
Cartopy's matplotlib interface is set up via the projection
keyword when constructing a matplotlib Axes
/ SubAxes
instance. The resulting axes instance has new methods, such as the coastlines()
method, which are specific to drawing cartographic data:
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
plt.show()
To draw cartographic data, we use the the standard matplotlib plotting routines with an additional transform keyword argument. The value of the transform argument should be the cartopy coordinate reference system of the data being plotted:
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
ax.set_global()
plt.plot([-100, 50], [25, 25], linewidth=4, transform=ccrs.Geodetic())
plt.show()
Notice that unless we specify a map extent (we did so via the set_global
method in this case) the map will zoom into the range of the plotted data.
We can add graticule lines and tick labels to the map using the gridlines method (this currently is limited to just a few coordinate reference systems):
ax = plt.axes(projection=ccrs.Mercator())
ax.coastlines()
gl = ax.gridlines(draw_labels=True)
plt.show()
We can control the specific tick values by using matplotlib's locator object, and the formatting can be controlled with matplotlib formatters:
import matplotlib.ticker as mticker
from cartopy.mpl.gridliner import LATITUDE_FORMATTER
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
gl = ax.gridlines(draw_labels=True)
gl.xlocator = mticker.FixedLocator([-180, -45, 0, 45, 180])
gl.yformatter = LATITUDE_FORMATTER
plt.show()
Cartopy cannot currently label all types of projection, though more work is intended on this functionality in the future.
Exercise 1:
The following snippet of code produces coordinate arrays and some data in a rotated pole coordinate system. The coordinate system for the x
and y
values, which is similar to that found in the some limited area models of Europe, has a projection "north pole" at 177.5 longitude and 37.5 latitude.
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
x = np.linspace(310, 390, 25)
y = np.linspace(-24, 25, 35)
x2d, y2d = np.meshgrid(x, y)
data = np.cos(np.deg2rad(y2d) * 4) + np.sin(np.deg2rad(x2d) * 4)
1. Define a cartopy coordinate reference system which represents a rotated pole with a pole latitude of 37.5 and a pole longitude of 177.5.
2. Produce a map, with coastlines, using the coordinate reference system created in #1.
3. Produce a map, with coastlines, in a Plate Carree projection with a pcolormesh of the data generated by the code snippet provided at the beginning of the example. Remember that the data is supplied in the rotated coordinate system defined in #1.