第八星系人气爱 发表于 2024-2-29 19:56:15

Python |frykit包介绍

本帖最后由 第八星系人气爱 于 2024-2-29 20:08 编辑

我们在使用Matplotlib和Cartopy绘制气象地图时常常需要繁琐的步骤:1.提前准备中国行政区划的shapefile。2.用cartopy.io.shpreader或 GeoPandas 读取 shapefile。3.用 GeoAxes.add_geometries 绘制行政区划。4.用 maskout.shp2clip 裁剪变量填色图。
并且这里面坑也很多:1.读取 shapefile 时可能遇到编码问题。2.add_geometries 画大量多边形时速度很慢。3.网上流传的 maskout 版本太多,有的只能 Basemap 用,有的没考虑投影,有的不能白化 imshow 和 pcolormesh 的结果。为此笔者开发了 frykit 包来简化这套流程。frykit 自带最新的中国地图数据(来自高德地图 API),提供便捷的画图函数和白化函数。
相比功能类似的其他包,frykit的特色是:1.针对画图速度有很大优化。2.白化支持多种投影,不会出现南海出界问题。3.提供自动方向的指北针和算出来的比例尺。4.除了给GeoAxes用,还可以给普通的Axes用。5.主要功能均由简单的函数实现,学习成本低。6.安装包体积小,依赖少。
下面通过一些例子介绍其用法
1.安装       pip install frykit==0.4.2post1
依赖为<div align="left"><font size="2" face="Tahoma">       python>=3.9.0</font></div><div align="left"><font size="2" face="Tahoma">       cartopy>=0.20.0</font></div><div align="left"><font size="2" face="Tahoma">       pandas>=1.2.0</font></div>绘制国界和九段线frykit 默认采用黑线无填充的样式。import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import frykit.plot as fplt

crs = ccrs.PlateCarree()
fig = plt.figure()
ax = fig.add_subplot(projection=crs)
fplt.add_cn_border(ax)
fplt.add_nine_line(ax)
绘制省界直接调用 add_cn_province(ax) 会画出所有省。如果在参数里提供单个省名可以只画一个省;在参数里提供一组省名可以画多个省。fig = plt.figure()
ax = fig.add_subplot(projection=crs)
fplt.add_cn_province(ax)
绘制市界同样地,add_cn_city 既可以绘制所有市,也可以绘制单个市或多个市。这里用等距方位投影演示 add_cn_city 的速度。fig = plt.figure()
ax = fig.add_subplot(projection=fplt.CN_AZIMUTHAL_EQUIDISTANT)
ax.set_extent(, crs=crs)
fplt.add_cn_city(ax)
下面这段代码是 add_geometries 版本。在笔者的电脑上 add_cn_city 只需要 1.6 秒,而 add_geometries 需要 35 秒
import frykit.shp as fshp

fig = plt.figure()
ax = fig.add_subplot(projection=fplt.CN_AZIMUTHAL_EQUIDISTANT)
ax.set_extent(, crs=crs)
ax.add_geometries(fshp.get_cn_city(), crs, fc='none', ec='k', lw=0.5)
地图白化frykit 的白化只需 clip_by_cn_border 一个函数,能正确处理等距方位投影,南海小图也没有常见的出界情况。此外 frykit 里还有用单个省或市做白化的 clip_by_cn_province 和 clip_by_cn_city 函数。
其中 move_axes_to_corner 用来将南海小图严丝合缝地移动到主图的右下角,整段程序完全没有用到 add_axes。# 读取frykit自带的测试数据. 需要安装xarray和NetCDF4.
ds = fplt.load_test_nc()
X, Y = np.meshgrid(ds['longitude'], ds['latitude'])
Z = ds['t2m'] - 273.15

# 设置主地图和小地图.
fig = plt.figure()
main_ax = fig.add_subplot(projection=fplt.CN_AZIMUTHAL_EQUIDISTANT)
mini_ax = fig.add_subplot(projection=fplt.CN_AZIMUTHAL_EQUIDISTANT)
main_ax.set_extent(, crs=crs)
mini_ax.set_extent(, crs=crs)
# 将小地图移动到主地图的右下角.
fplt.move_axes_to_corner(mini_ax, main_ax)

for ax in :
    # 添加国界和九段线.
    fplt.add_cn_border(ax)
    fplt.add_nine_line(ax)
    cf = ax.contourf(
      X, Y, Z, 20,
      cmap='turbo',
      transform=crs,
      transform_first=True
    )
    # 裁剪填色图.
    fplt.clip_by_cn_border(cf)
         更多例子可见:
   https://github.com/ZhaJiMan/frykit
微信搜索“第八星系人造大气理论爱好者”公众号,关注获取文章数据
页: [1]
查看完整版本: Python |frykit包介绍