Py学习  »  Python

气象编程 | 用Python在地球投影中轻松添加图形标注

气象学家 • 1 年前 • 318 次点击  

  第一时间获取气象科研资讯

气象学家公众号交流群

加入


前言

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

当无地图投影时

在 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






声明: 欢迎转载、转发本号原创内容,可留言区留言或者后台联系小编(微信:gavin7675)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。


往期推荐

 获取ERA5-Land陆面高分辨率再分析数据(32TB)

 1942-2022年中国地面气象站观测数据免费分享

 获取全球GPM降水数据,半小时/逐日(4TB)

 获取1998-2019 TRMM 3B42逐日降水数据

★ 获取最新版本CMIP6降尺度数据集30TB

★ 获取ERA5常用变量再分析数据26TB

 EC数据商店推出Python在线处理工具箱

★ EC打造实用气象Python工具Metview

★  机器学习简介及在短临天气预警中的应用

★ Nature-地球系统科学领域的深度学习及理解

★ 采用神经网络与深度学习来预报降水、温度

★ 灵魂拷问:ChatGPT对气象人的饭碗是福是祸?

★ 气象局是做啥的?气象局的薪水多少?

★ 一位气象学家尝试ChatGPT复现Nature子刊的研究,他真的会面临失业吗?!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/159339
 
318 次点击