社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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

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

气象学家公众号交流群

加入


前言

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

当无地图投影时

在 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
 
349 次点击