Cartopy学习使用

Python

This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.

昨天本来打算用 matplotlibCartopy 画几张海温图的,结果意外发现我的 Arch Linux 更新软件包以后,估计是 libc 版本太新导致 matplotlib break 了,只要一调用 plt.show 或者是 plt.savefig 必崩,给我人整傻了,又是更换内核又是搞虚拟机,今天下午临时装了一个 Ubuntu 22.04 用着,白白折腾了一天的时间 🤡。

更新:我发现不是 matplotlib break 了,是 Cartopy 和新版的 Shapely 不兼容导致的。执行以下命令从源码重新安装 Shapely 即可恢复正常。

1
pip install "shapely<2" --no-binary shapely --force-reinstall

我之前就用过 Cartopy,但是并不是特别熟。今天画海温图的时候顺便探索了一下,发现了几件有趣的事情,所以分享一下。

Pycharm 中使用 Cartopy 时没有属性和方法提示

这是困扰我许久的问题了,在使用 Cartopy 时,如果要绘制多个子图,通常会以一下方法绘图

1
2
3
fig = plt.figure()
ax = fig.add_subplot()
ax.plot()

但是奇怪的是,敲完 ax 以后竟然没有任务有关的方法提示,原因是 Pycharm 并不知道 ax 的类型是什么 (同理,对于 fig 类似。)。我们要做的,就是给变量添加上类型注解。

1
2
3
4
5
6
from matplotlib.figure import Figure
from cartopy.mpl.geoaxes import GeoAxes

fig: Figure = plt.figure()
ax: GeoAxes = fig.add_subplot()
ax.plot()

Cartopy 设置图片的显示范围

set_extent 函数一定要放到绘制完图片后的下一行,否则最后图片的显示范围会出现异常

Cartopy 的 minor 参数

在添加经纬度坐标的时候,通常要使用以下函数添加坐标

1
2
ax.set_xticks(A, crs=projection)
ax.set_yticks(B, crs=projection)

这里的 AB 通常是一个列表、数组之类的,我一般都是直接根据经纬度范围直接用 np.arange 生成,例如

1
2
3
4
# 经度范围:120 - 170 °E
# 纬度范围:5 °S - 5 °N
ax.set_xticks(np.arange(-170, -110, 20), crs=projection)
ax.set_yticks(np.arange(-5, 10, 5), crs=projection)

但是今天下午上课太困了,错写成了下面的代码

1
2
3
4
# 经度范围:120 - 170 °E
# 纬度范围:5 °S - 5 °N
ax.set_xticks(np.arange(-170, -110), 20, crs=projection)
ax.set_yticks(np.arange(-5, 5), 5, crs=projection)

于是我神奇的发现,该代码不仅没有出错 ,绘制出的坐标也是正确的,而且还多出了小刻度

然后我去翻阅了 Cartopy 的手册中 set_ticks 的部分

image-20221017212204820

按道理来讲,这里的 20 和 5 应该是赋给了形参 minor,于是我把 20 和 5 换成了 minor=True,发现得出了一个一模一样的图。没想到我犯个困还能无意中发现这么一个好用的参数,好耶!

Cartopy 绘图中心经度和数据经度问题

今天发现,使用兰伯特投影画地图时,需要注意一下中心经度设置和数据经度设置的问题。

  • 当使用 0° 为中心经度时,数据的经度需要使用 0 - 360 的形式
  • 当使用 180° 为中心经度时,数据的经度需要使用 -180 - 180 的形式

Author: Syize

Permalink: https://blog.syize.cn/2022/10/17/learn-cartopy/

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog

Comments