cartopy是英国气象局开发的一款用于地理空间数据处理的python库,支持创建并发布高质量地图,随着basemap的停止维护,cartopy已成Python中地理绘图的首选模块,其最简单的地图即为海岸线的线条图,示例如下
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
plt.show()
PlateCarree是可利投影,圆柱投影的原理是将地物投影到圆柱面上再展开,将这种投影作为一种坐标映射提供给坐标轴,便可得到一个cartopy定义的坐标轴对象GeoAxes
type(ax)
# <class 'cartopy.mpl.geoaxes.GeoAxes'>
GeoAxes显然继承自Axes,除了matplotlib中的函数之外,还封装了一些用于地图绘制的函数。
coastlines即海岸线,由此得到的地图是极致的线条风格,光秃秃得什么都没有,并不好看。通过stock_img函数,可以为地图添加低分辨率的地形图背景,示例如下,看上去十分不错,但需要注意,这个图目前就只有这一张。
ax = plt.axes(projection=ccrs.PlateCarree(180))
ax.stock_img()
plt.show()
matplotlib中提供了非常多的绘图函数,cartopy对下列诸图进行了重载,有关这些图形的示例,可参考:python35种绘图函数总结,3D、统计、流场,实用性拉满
绘图函数 | 图形类别 |
---|---|
scatter | 散点图 |
barbs | 风场图 |
quiver | 向量场图 |
streamplot | 流场图 |
contour | 等高线 |
contourf | 填充等高线 |
pcolor | 矩阵伪彩图 |
pcolormesh | 矩阵伪彩图 |
hexbin | 钻石图 |
和Axes中的绘图函数相比,这些重载后的方法普遍添加了transform参数,下面以风场图为例,进行绘制,此图来自于官网,但对其绘图代码进行了精简。
首先创建示例数据
import numpy as np
import cartopy.crs as ccrs
def sample_data(shape=(20, 30)):
crs = ccrs.RotatedPole(pole_longitude=177.5, pole_latitude=37.5)
x = np.linspace(311.9, 391.1, shape[1])
y = np.linspace(-23.6, 24.8, shape[0])
X, Y = np.deg2rad(np.meshgrid(x, y))
u = 10 * (2 * np.cos(2 * X + 3 * (Y + 30)) ** 2)
v = 20 * np.cos(6 * np.deg2rad(X))
return x, y, u, v, crs
下面是绘图代码
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.set_extent([-90, 80, 10, 85], crs=ccrs.PlateCarree())
ax.stock_img()
ax.coastlines()
x, y, u, v, vector_crs = sample_data(shape=(10, 14))
ax.barbs(x, y, u, v, length=5,
sizes=dict(emptybarb=0.25, spacing=0.2, height=0.5),
lw=0.95, transform=vector_crs)
plt.show()