前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用python在地球投影中轻松添加图形标注

用python在地球投影中轻松添加图形标注

作者头像
自学气象人
发布2023-09-05 17:51:08
5670
发布2023-09-05 17:51:08
举报
文章被收录于专栏:自学气象人

前言

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

当无地图投影时

在 python 的 matplotlib.pyplot 和 matplotlib.patches中,有很多内置的函数可以帮助我们绘制矩形、圆形、椭圆等图案。

以圆形为例,可以使用 matplotlib.patches.Circle 方法进行绘制,只需要提供圆心和半径即可。其他可选参数如下,包括常见的线宽linewidth, 线型linestyle=, 颜色color等。此外,还可以接收地图投影transform参数。

code
代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 当无地图投影时
      • 当存在地图投影时
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档