前言
交流群里有读友提问:如何在地球投影中添加指定的纬圈。我抽空尝试了一下,分享给大家。

当无地图投影时
在 python 的 matplotlib.pyplot 和 matplotlib.patches中,有很多内置的函数可以帮助我们绘制矩形、圆形、椭圆等图案。
以圆形为例,可以使用 matplotlib.patches.Circle 方法进行绘制,只需要提供圆心和半径即可。其他可选参数如下,包括常见的线宽linewidth, 线型linestyle=, 颜色color等。此外,还可以接收地图投影transform参数。

code
import matplotlib.pyplot as plt
import matplotlib.patches as patches
# 创建一个图形对象和子图
fig, ax = plt.subplots()
# 创建一个空心圆形对象
circle = patches.Circle((2.5, 2.5), radius=1, linewidth=2, edgecolor='black', facecolor='none')
# 将圆形添加到子图中
ax.add_patch(circle)
# 设置坐标轴范围
ax.set_xlim([0, 5])
ax.set_ylim([0, 5])
# 设置坐标轴纵横比例
ax.set_aspect('equal')
# 显示图形
plt.show()
result

其他
除了圆形以外,可以用matplotlib.patches.Ellipse绘制椭圆、用matplotlib.patches.Rectangle绘制矩形、用matplotlib.patches.Arrow绘制箭头、用matplotlib.patches.Polygon绘制任意形状的多边形等。他们的参数都比较相似,具体可见官网,不再一一详细阐述。
当存在地图投影时
前面提到过,matplotlib.patches.xxxx 方法可以接收 transform 地图投影参数,但在实际使用时发现该参数在极地投影的情况下,不能实现想要的效果,建议使用gridlines。因为matplotlib.patches方法 只是一个平面的绘图,无法真正的识别出投影的纬圈。
1、非极地投影
以lat-lon投影为例,令纬度0°、经度0°为圆心,15°为半径,绘制圆形:
code
import matplotlib.pyplot as plt
from cartopy import crs as ccrs
from matplotlib.patches import Circle
# 创建绘图窗口和地图投影
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
# 设置地图的显示范围为-180到180经度,0到90纬度
ax.set_extent([-180, 180, -90, 90], ccrs.PlateCarree())
# 添加海洋背景
ax.stock_img()
# 添加国界线
ax.coastlines(resolution='110m', linewidth=0.5)
# 添加圆圈到地图上
circle = Circle((0, 0), radius=15, transform=ccrs.PlateCarree(),
linewidth=2, linestyle='-', edgecolor='yellow', facecolor='none')
ax.add_patch(circle)
# 显示地图
plt.show()
result

2、极地投影
以极射赤平投影为例,绘制75°N的纬度圈(黄色标注),gridlines有很多可选参数,大家可以官网了解一下:
code
import matplotlib.pyplot as plt
from cartopy import crs as ccrs
# 创建绘图窗口和地图投影
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.NorthPolarStereo())
# 设置地图的显示范围为-180到180经度,0到90纬度
ax.set_extent([-180, 180, 0, 90], ccrs.PlateCarree())
# 设置网格线颜色
ax.gridlines(color='black',alpha=0.2,linestyle='--')
# 设置75N的网格线颜色为黄色
ax.gridlines(xlocs=[], ylocs=[10, 30, 60, 75], color=[ 'red', 'blue', 'yellow', 'gray'],
linewidth=2, linestyle='-', draw_labels=True)
# 添加海洋背景
ax.stock_img()
# 添加国界线
ax.coastlines(resolution='110m', linewidth=0.5)
# 显示地图
plt.show()
result
