在matplotlib中使用Cartopy#

漂亮简单的地图#

Cartopy公开了一个界面,可以使用matplotlib轻松创建地图。创建基本地图只需告诉Matplotlib使用特定的地图投影,然后将一些海岸线添加到轴上即可:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()

# Save the plot by calling plt.savefig() BEFORE plt.show()
plt.savefig('coastlines.pdf')
plt.savefig('coastlines.png')

plt.show()

(Source code)

../_images/intro-1.png

Matplotlib使用的可用投影列表可在 Cartopy投影列表 页.

线 plt.axes(projection=ccrs.PlateCarree()) 搭建 GeoAxes 实例公开了各种其他地图相关方法,在上一个示例的情况下,我们使用了 coastlines() 方法将海岸线添加到地图中。

要保存图形,请使用Matplotlib的 savefig() 功能

让我们在不同的投影中创建另一个地图,并利用 stock_img() 将收件箱图像添加到地图的方法:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

ax = plt.axes(projection=ccrs.Mollweide())
ax.stock_img()
plt.show()

(Source code)

../_images/intro-2.png

此时,尝试一下 picking your own projection 并创建一张带有顶部带有海岸线图像的地图。

向地图添加数据#

一旦您按照您想要的方式获得了地图,就可以以与普通Matplotlib轴完全相同的方式将数据添加到其中。默认情况下,添加到GeoAxes的任何数据的坐标系与GeoAxes本身的坐标系相同,为了控制给定数据位于哪个坐标系中,您可以添加 transform 带有适当的关键字 cartopy.crs.CRS 实例:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

ny_lon, ny_lat = -75, 43
delhi_lon, delhi_lat = 77.23, 28.61

plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
         color='blue', linewidth=2, marker='o',
         transform=ccrs.Geodetic(),
         )

plt.plot([ny_lon, delhi_lon], [ny_lat, delhi_lat],
         color='gray', linestyle='--',
         transform=ccrs.PlateCarree(),
         )

plt.text(ny_lon - 3, ny_lat - 12, 'New York',
         horizontalalignment='right',
         transform=ccrs.Geodetic())

plt.text(delhi_lon + 3, delhi_lat - 12, 'Delhi',
         horizontalalignment='left',
         transform=ccrs.Geodetic())

plt.show()

(Source code)

../_images/intro-3.png

请注意纽约和德里之间的蓝色线在公寓上并不笔直 PlateCarree 地图,这是因为 Geodetic 坐标系是真正的球形坐标系,其中两点之间的线被定义为这些点之间的最短路径 on the globe 而不是2d Cartesian空间。

备注

默认情况下,Matplotlib会根据您绘制的数据自动设置轴的限制。因为cartopy实现了一个 GeoAxes 类,这相当于生成地图的限制。有时,这种自动缩放是一个理想的功能,而有时则不然。

要设置制图GeoAxes的范围,有几个方便的选项:

  • 对于“全局”地块,请使用 set_global()

  • 要在任何坐标系中基于边界框设置地图范围,请使用 set_extent()

  • 或者,可以在GeoAxes的原生坐标系中使用标准极限设置方法(例如 set_xlim()set_ylim() ).

next section 中,为更高级的基于地图的可视化提供了轮廓绘制和添加地理定位图像的示例。