爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1206|回复: 20

[经验总结] 配合 cartopy 使用的中国地图包:frykit

[复制链接]
发表于 2025-3-16 11:40:59 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 灭火器 于 2025-3-16 19:42 编辑

项目仓库:https://github.com/ZhaJiMan/frykit
详细介绍:https://zhajiman.github.io/post/frykit/

这个包写了有很久了,最近更新了一波,发到家园宣传一下,有人用才能找出 bug,希望能多得到反馈。之前有个单词拼写错误的 bug 硬是半年才被别人发现……
功能是:

- 自带中国省市县的行政区划数据,无需准备 shapefile 或者 geojson 文件
- 0.7.0 开始自带两套数据,一套高德地图 api 的,一套天地图去年公开的,任选。
- 一个函数快速绘制,快速标注
- 地图白化、指北针、比例尺等小工具

用法类似下面:

  1. import matplotlib.pyplot as plt
  2. import cartopy.crs as ccrs
  3. import frykit.plot as fplt

  4. crs = ccrs.PlateCarree()
  5. ax = plt.axes(projection=crs)

  6. fplt.add_cn_border(ax)  # 添加国界
  7. fplt.add_cn_province(ax)  # 添加省界
  8. fplt.add_cn_city(ax)  # 添加市界
  9. fplt.add_cn_district(ax)  # 添加县界
  10. fplt.add_cn_line(ax)  # 添加九段线

  11. fplt.label_cn_province(ax)  # 添加省名
  12. fplt.label_cn_city(ax)  # 添加市名
  13. fplt.label_cn_district(ax)  # 添加县名

  14. # 用国界裁剪填色图
  15. cf = ax.contourf(lon, lat, data, transform=crs)
  16. fplt.clip_by_cn_border(cf)

  17. fplt.add_compass(ax, 0.1, 0.9)  # 添加指北针
  18. fplt.add_scale_bar(ax, 0.1, 0.1)  # 添加比例尺
复制代码

效果图如下
fill.png

最新的 0.7.x 版本安装方式是:

  1. pip install frykit[data]
复制代码


conda 包还不会弄,以后有空学学。

评分

参与人数 4金钱 +96 贡献 +15 体力 +80 收起 理由
gdou_lyc + 20 + 5 很给力!
尽头的尽头 + 46 + 8 + 80 很给力!
付亚男 + 20 + 2 很给力!
贫道敬孔 + 10

查看全部评分

密码修改失败请联系微信:mofangbao
 楼主| 发表于 2025-8-11 08:58:03 | 显示全部楼层
本帖最后由 灭火器 于 2025-8-11 09:09 编辑
gdou_lyc 发表于 2025-8-9 10:01
感谢大神提供的工具!!想问问大神,我南海小图里contouf填色是没问题的,但是用quiver画风矢量不显示,想 ...
  1. from typing import cast

  2. import frykit.plot as fplt
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. from cartopy.mpl.geoaxes import GeoAxes
  6. from scipy.ndimage import gaussian_filter

  7. # 读取数据
  8. data = fplt.load_test_data()
  9. X, Y = np.meshgrid(data.lon, data.lat)
  10. t2m = gaussian_filter(data.t2m - 273.15, sigma=1)
  11. u10 = gaussian_filter(data.u10, sigma=1)
  12. v10 = gaussian_filter(data.v10, sigma=1)

  13. # 设置投影
  14. map_crs = fplt.CN_AZIMUTHAL_EQUIDISTANT
  15. data_crs = fplt.PLATE_CARREE

  16. # 准备地图
  17. fig = plt.figure(figsize=(8, 5))
  18. main_ax = fig.add_subplot(projection=map_crs)
  19. mini_ax = fplt.add_mini_axes(main_ax)
  20. main_ax = cast(GeoAxes, main_ax)
  21. mini_ax = cast(GeoAxes, mini_ax)
  22. main_ax.set_extent((74, 136, 13, 57), crs=data_crs)
  23. mini_ax.set_extent((105, 122, 2, 25), crs=data_crs)
  24. for ax in [main_ax, mini_ax]:
  25.     fplt.add_cn_province(ax, lw=0.25)
  26.     fplt.add_cn_line(ax)

  27. # 绘制气温
  28. for i, ax in enumerate([main_ax, mini_ax]):
  29.     cf = ax.contourf(
  30.         X,
  31.         Y,
  32.         t2m,
  33.         levels=np.linspace(-10, 35, 10),
  34.         cmap="plasma",
  35.         extend="both",
  36.         transform=data_crs,
  37.         transform_first=True,
  38.     )
  39.     fplt.clip_by_cn_border(cf)
  40.     if i == 0:
  41.         fig.colorbar(cf, ax=ax, label="Temperature (℃)")

  42. # 用 stride 替代 regrid_shape
  43. stride = 6
  44. s = np.s_[::stride, ::stride]

  45. # 绘制风场
  46. # 用 inches 单位保证大图小图里的箭头大小相同
  47. quiver_kwargs = dict(
  48.     x=X[s],
  49.     y=Y[s],
  50.     u=u10[s],
  51.     v=v10[s],
  52.     scale=30,
  53.     scale_units="inches",
  54.     units="inches",
  55.     width=0.01,
  56.     headwidth=4,
  57.     transform=data_crs,
  58. )
  59. main_Q = main_ax.quiver(**quiver_kwargs)
  60. mini_Q = mini_ax.quiver(**quiver_kwargs)
  61. fplt.clip_by_cn_border(main_Q)
  62. fplt.clip_by_cn_border(mini_Q)
  63. fplt.add_quiver_legend(main_Q, U=10, height=0.12, loc="lower left")

  64. fplt.savefig("quiver.png")
  65. plt.close(fig)
复制代码

quiver.png

  1. matplotlib==3.10.5
  2. cartopy==0.25.0
  3. frykit==0.7.5.post1
复制代码

我这里画出来是正常的,就直接画
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

发表于 2025-3-16 12:21:14 | 显示全部楼层
太好了,就是感激像楼主这样的人,之前我使用cartopy时对于它里面的国界定义标注错误不爽,一直以来只画海岸线,要更细还得用shp
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-3-16 12:37:31 | 显示全部楼层
很好的工作,如果方便,可以上传到conda-forge 源中。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-3-16 12:45:54 | 显示全部楼层
好东西,dd
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

发表于 2025-3-16 13:14:58 | 显示全部楼层
是炸鸡人,哈哈
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-3-16 13:18:52 | 显示全部楼层
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

发表于 2025-3-16 14:46:20 | 显示全部楼层
大佬太强了,必须赞,必须顶!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-3-16 16:12:57 | 显示全部楼层
用过,很好用,没有长江、黄河等湖泊和河流数据
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-3-16 16:19:30 | 显示全部楼层
炸鸡人大佬我是认得,你的教程真的牛!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2025-3-16 19:17:23 | 显示全部楼层
插眼,感谢大佬了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表