• Python Cartopy地图投影【3】


    上两期文章见:
    Python Cartopy地图投影【1】
    第一期文章内容纲要:

    step1: 开始地图投影
    step2: GeoAxes 的常用方法
    2.1 add_feature:添加海岸线、河流、湖泊等地理特征
    2.2 gridlines:添加网格线以及相应标签等

    Python Cartopy地图投影【2】
    第二期文章内容纲要:

    2.3 set_extent:设置地理边界
    2.4 set_boundary:裁剪子图形状
    step3: 三种常见地图投影与实用技巧
    3.1 等距网格投影 PlateCarree
    3.2 兰伯特投影 LambertConformal
    3.3 NorthPolarStereo (北)极地投影

    step4 Cartopy 与 matplotlib 的结合

    什么叫 Cartopy 与 matplotlib 的结合呢?就是用 matplotli 来画图、用 cartopy 来创建地图投影以及添加相应的地理特征要素。
    在这里插入图片描述

    import xarray as xr  # 用于读取数据
    import matplotlib.pyplot as plt  # 用于绘图基础
    import cartopy.crs as ccrs  # 用于调用投影
    import cartopy.feature as cfeature  # 用于调用地理特征要素
    f = xr.open_dataset('air.mon.mean.nc')  # 读取数据
    t = f['air'].loc[:, 500, :, :][0]  # 取出第一个时刻的500hPa的温度场
    lat = f['lat']  # 取出经度
    lon = f['lon']  # 取出纬度
    plt.figure(figsize=(5, 5))  # 创建figure对象
    # ax1为Axes
    ax1 = plt.subplot(1, 2, 1)  # 创建1行2列的第一个axes
    c1 = ax1.contour(lon, lat, t)  # 绘制温度等值线
    ax1.set_title('Axes')  # 标题
    # ax2为GeoAxes
    ax2 = plt.subplot(1, 2, 2, projection=ccrs.PlateCarree())  # 创建1行2列的第二个GeoAxes
    c2 = ax2.contour(lon, lat, t, transform=ccrs.PlateCarree())  # 绘制等值线
    ax2.add_feature(cfeature.COASTLINE)  # 添加海岸线
    ax2.set_title('GeoAxes')  # 添加标题
    plt.show();  # 展示图形
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    我们来看看在极坐标投影上绘图时,是否添加 transform 参数会分别得到怎样的结果?

    # 极坐标投影是否添加transform参数的效果对比
    import matplotlib.pyplot as plt
    import numpy as np  # 用于生成圆形的参数
    import cartopy.crs as ccrs
    import cartopy.feature as cfeature  # 用于调用地理特征要素
    import matplotlib.path as mpath  # 用于生成极坐标的圆形边界
    
    f = xr.open_dataset('/home/mw/input/moyu1828/air.mon.mean.nc')  # 读取数据
    t = f['air'].loc[:, 500, :, :][0]  # 取出第一个时刻的500hPa的温度场
    lat = f['lat']  # 读取纬度
    lon = f['lon']  # 读取经度
    
    theta = np.linspace(0, 2*np.pi, 100)  # 生成极坐标圆形方程的theta参数
    center, radius = [0.5, 0.5], 0.5  # 圆心和半径
    verts = np.vstack([np.sin(theta), np.cos(theta)]).T
    circle = mpath.Path(verts * radius + center)  # 生成圆形边界
    
    fig = plt.figure(figsize=[5, 5])  # 生成figure对象
    # 第一个子图,绘图时设置transform参数
    # 生成1行2列第一个的北极极地投影子图
    ax1 = fig.add_subplot(1, 2, 1, projection=ccrs.NorthPolarStereo())
    ax1.set_extent([-180, 180, 30, 90], ccrs.PlateCarree())  # 设置投影范围为30°-90°N半球
    ax1.gridlines()  # 绘制网格线
    ax1.add_feature(cfeature.COASTLINE)  # 添加海岸线
    ax1.set_boundary(circle, transform=ax1.transAxes)  # 设置子图边界
    # 绘制等值线,指定transform=ccrs.PlateCarree()
    ax1.contour(lon, lat, t, transform=ccrs.PlateCarree())
    # 第二个子图,绘图时不设置transform参数
    # 生成1行2列第二个的北极极地投影子图
    ax2 = fig.add_subplot(1, 2, 2, projection=ccrs.NorthPolarStereo())
    ax2.set_extent([-180, 180, 30, 90], ccrs.PlateCarree())  # 设置投影范围为30°-90°N半球
    ax2.gridlines()  # 绘制网格线
    ax2.add_feature(cfeature.COASTLINE)  # 添加海岸线
    ax2.set_boundary(circle, transform=ax2.transAxes)  # 设置子图边界
    ax2.contour(lon, lat, t)  # 绘制等值线,没有指定transform=ccrs.PlateCarree()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

  • 相关阅读:
    2000-2021年上市公司全要素生产率数据(LP法)(含原始数据、计算代码、计算结果)
    JSP SSH 产品质量追溯管理统myeclipse开发mysql数据库MVC模式java编程网页设计
    Python 文件简单操作
    【火热招募】一文看懂华为云IoT Edge边缘计算开发者大赛技术亮点
    力扣labuladong一刷day14天翻转单链表共2题
    使用流水线插件实现持续集成、持续部署
    韩顺平0基础学java——第15天
    Java IO流
    2022年下半年系统架构设计师上午真题及答案解析
    Vue3+node.js网易云音乐实战项目(七)
  • 原文地址:https://blog.csdn.net/weixin_45492560/article/details/133440864