# frykit
一个配合 Matplotlib 和 Cartopy 使用的工具箱,主要由 `shp` 和 `plot` 模块组成。
`shp` 模块的功能是:
- 读取中国行政区划数据
- 创建多边形掩膜(mask)
- 多边形在不同投影坐标系之间的变换
`plot` 模块的功能包括:
- 读取中国行政区划数据
- 向地图添加中国国界和省界
- 利用国界和省界对填色图做裁剪(白化)
- 设置地图刻度
- 添加风矢量图的图例
- 添加指北针
- 添加地图比例尺
- 制作离散色表
没有文档,但是每个函数都有详细的 docstring,可以在 Python命令行中通过 `help` 函数查看,或者在 IDE 中查看。
这个包只是作者自用的小工具集,函数编写粗糙,可能存在不少 bug,还请多多交流指正。类似的更完备的包还请移步 [gma](https://gma.luosgeo.com/) 或 [EOmaps](https://github.com/raphaelquast/EOmaps)。
## 安装
```
pip install frykit
```
依赖为 `cartopy>=0.20.0`。
`python<3.9.0` 时请指定 `pip install frykit==0.2.5`。
## 示例
### 读取中国行政区划
```Python
import frykit.shp as fshp
# 读取国界.
country = fshp.get_cn_shp(level='国')
# 读取省界.
provinces = fshp.get_cn_shp(level='省')
anhui = fshp.get_cn_shp(level='省', province='安徽省')
# 读取市界.
cities = fshp.get_cn_shp(level='市')
hefei = fshp.get_cn_shp(level='市', city='合肥市')
cities_of_anhui = fshp.get_cn_shp(level='市', province='安徽省')
```
返回结果为 Shapely 的多边形对象,可以进行交并等几何运算。
行政区划的 shapefile 文件来自 [ChinaAdminDivisonSHP](https://github.com/GaryBikini/ChinaAdminDivisonSHP) 项目,已从 GCJ-02 坐标系处理到了 WGS84 坐标系上。文件都在 `frykit.DATA_DIRPATH` 指向的目录里。
### 绘制中国国界和省界
```Python
# 绘制国界.
fplt.add_cn_border(ax)
# 绘制省界.
fplt.add_cn_province(ax)
fplt.add_cn_province(ax, name=['安徽省', '江苏省'])
```
`ax` 可以是 `Axes` 或 `GeoAxes`。
### 绘制任意多边形
```Python
import shapely.geometry as sgeom
# 绘制一个多边形.
polygon = sgeom.polygon(...)
fplt.add_polygon(ax, polygon)
# 绘制多个多边形并填色.
pc = fplt.add_polygons(ax, polygons, array=data, cmap=cmap, norm=norm)
cbar = fig.colorbar(pc, ax=ax)
```
Cartopy 的 `GeoAxes.add_geometries` 会自动去除 `polygons` 中不在 `GeoAxes` 显示范围内的多边形,破坏 `polygons` 和 `array` 的一一对应关系,打乱填色的结果。工具箱中的 `add_polygons` 函数不会进行这一操作,能够产生正确的填色结果。
### 裁剪填色图
```Python
cf = ax.contourf(lon, lat, data, transform=data_crs)
# 用国界或省界裁剪.
fplt.clip_by_cn_border(cf)
fplt.clip_by_cn_province(cf, '河北省')
```
被裁剪的对象还可以是 `contour`、`clabel`、`pcolormesh`、`quiver` 等方法的返回值。
当用于裁剪的多边形超出 `GeoAxes` 的显示范围时,直接用 `Artist.set_clip_path` 做裁剪会发生填色图出界的现象([cartopy/issues/2052](https://github.com/SciTools/cartopy/issues/2052))。工具箱内的 `clip_by_xxx` 系列函数对此进行了处理。
### 加速绘制和裁剪
绘制多边形和裁剪填色图过程中需要对多边形进行坐标变换,工具箱默认进行速度更快,但结果不够严格的变换方法。快速和严格两种变换方法间的切换为:
```Python
enable_fast_transform()
disable_fast_transform()
```
`add_cn_xxx` 系列函数在多次调用时会通过缓存节省读取国界和省界数据的时间开销。如果能维持对多边形对象的引用,`add_polygon`、`add_polygons` 和 `clip_by_xxx` 系列函数在多次调用时会通过缓存节省多边形坐标变换的时间开销。
### 添加指北针和比例尺
```Python
fplt.add_compass(ax1, 0.95, 0.8, size=15, style='star')
scale = fplt.add_map_scale(ax1, 0.36, 0.8, length=1000)
scale.set_xticks([0, 500, 1000])
```
指北针会自动指向所在位置处的北向,也可以通过 `angle` 参数手动指定角度。
比例尺的长度通过 `GeoAxes` 中心处单位长度和实际距离的比值计算得到。比例尺本身由一个压扁了的 `Axes` 模拟,所以可通过 `set_xticks` 等方法修改样式。
### 定位南海小地图
```Python
sub_ax = fig.add_subplot(projection=map_crs)
sub_ax.set_extent([105, 120, 2, 25], crs=data_crs)
fplt.move_axes_to_corner(sub_ax, ax)
```
需要先确定主图和子图的显示范围,再利用 `move_axes_to_corner` 函数将子图缩小并定位到主图的角落。
### 添加风矢量图例
```Python
fplt.add_quiver_legend(Q, U=10, width=0.15, height=0.12)
```
在 `Axes` 的角落添加一个白色矩形背景的风矢量图例。可以通过 `rect_kwargs` 字典控制矩形的样式,通过 `key_kwargs` 字典控制 `quiverkey` 的样式。
### 添加经纬度方框
```Python
fplt.add_box(ax, [lon0, lon1, lat0, lat1], transform=ccrs.PlateCarree())
```
当 `ax` 是 `GeoAxes` 时会对方框上的点插值,以保证方框在 `ax` 的坐标系里足够平滑。
### 离散 colorbar
```Python
# 一个颜色对应一个刻度的定性colorbar.
colors = [
'orangered', 'orange', 'yellow',
'limegreen', 'royalblue', 'darkviolet'
]
cmap, norm, ticks = fplt.make_qualitative_cmap(colors)
cbar = fplt.plot_colormap(cmap, norm)
cbar.set_ticks(ticks)
cbar.set_ticklabels(colors)
# 保证零值区间对应白色的离散colorbar.
import cmaps
boundaries = [-10, -5, -2, -1, 1, 2, 5, 10, 20, 50, 100]
norm = fplt.CenteredBoundaryNorm(boundaries)
cbar = fplt.plot_colormap(cmaps.BlueWhiteOrangeRed, norm)
cbar.set_ticks(boundaries)
```

### 详细介绍
工具箱的原理和使用场景可见下面几篇博文:
- [Cartopy 系列:探索 shapefile](https://zhajiman.github.io/post/cartopy_shapefile/)
- [Cartopy 系列:裁剪填色图出界问题](https://zhajiman.github.io/post/cartopy_clip_outside/)
- [CALIPSO L2 VFM 产品的读取和绘制(with Python)](https://zhajiman.github.io/post/calipso_vfm/)
- [Matplotlib 系列:colormap 的设置](https://zhajiman.github.io/post/matplotlib_colormap/)
### 示例效果
`cd` 到包的 `example` 目录里可以执行示例脚本:






Raw data
{
"_id": null,
"home_page": "https://github.com/ZhaJiMan/frykit",
"name": "frykit",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "",
"author": "ZhaJiMan",
"author_email": "915023793@qq.com",
"download_url": "https://files.pythonhosted.org/packages/64/b1/54d4fdd3fee34ee2df09e29c7598fce9e39c1737338dc9ee163c82e3a782/frykit-0.3.2.post1.tar.gz",
"platform": null,
"description": "# frykit\r\n\r\n\u4e00\u4e2a\u914d\u5408 Matplotlib \u548c Cartopy \u4f7f\u7528\u7684\u5de5\u5177\u7bb1\uff0c\u4e3b\u8981\u7531 `shp` \u548c `plot` \u6a21\u5757\u7ec4\u6210\u3002\r\n\r\n`shp` \u6a21\u5757\u7684\u529f\u80fd\u662f\uff1a\r\n\r\n- \u8bfb\u53d6\u4e2d\u56fd\u884c\u653f\u533a\u5212\u6570\u636e\r\n- \u521b\u5efa\u591a\u8fb9\u5f62\u63a9\u819c\uff08mask\uff09\r\n- \u591a\u8fb9\u5f62\u5728\u4e0d\u540c\u6295\u5f71\u5750\u6807\u7cfb\u4e4b\u95f4\u7684\u53d8\u6362\r\n\r\n`plot` \u6a21\u5757\u7684\u529f\u80fd\u5305\u62ec\uff1a\r\n\r\n- \u8bfb\u53d6\u4e2d\u56fd\u884c\u653f\u533a\u5212\u6570\u636e\r\n- \u5411\u5730\u56fe\u6dfb\u52a0\u4e2d\u56fd\u56fd\u754c\u548c\u7701\u754c\r\n- \u5229\u7528\u56fd\u754c\u548c\u7701\u754c\u5bf9\u586b\u8272\u56fe\u505a\u88c1\u526a\uff08\u767d\u5316\uff09\r\n- \u8bbe\u7f6e\u5730\u56fe\u523b\u5ea6\r\n- \u6dfb\u52a0\u98ce\u77e2\u91cf\u56fe\u7684\u56fe\u4f8b\r\n- \u6dfb\u52a0\u6307\u5317\u9488\r\n- \u6dfb\u52a0\u5730\u56fe\u6bd4\u4f8b\u5c3a\r\n- \u5236\u4f5c\u79bb\u6563\u8272\u8868\r\n\r\n\u6ca1\u6709\u6587\u6863\uff0c\u4f46\u662f\u6bcf\u4e2a\u51fd\u6570\u90fd\u6709\u8be6\u7ec6\u7684 docstring\uff0c\u53ef\u4ee5\u5728 Python\u547d\u4ee4\u884c\u4e2d\u901a\u8fc7 `help` \u51fd\u6570\u67e5\u770b\uff0c\u6216\u8005\u5728 IDE \u4e2d\u67e5\u770b\u3002\r\n\r\n\u8fd9\u4e2a\u5305\u53ea\u662f\u4f5c\u8005\u81ea\u7528\u7684\u5c0f\u5de5\u5177\u96c6\uff0c\u51fd\u6570\u7f16\u5199\u7c97\u7cd9\uff0c\u53ef\u80fd\u5b58\u5728\u4e0d\u5c11 bug\uff0c\u8fd8\u8bf7\u591a\u591a\u4ea4\u6d41\u6307\u6b63\u3002\u7c7b\u4f3c\u7684\u66f4\u5b8c\u5907\u7684\u5305\u8fd8\u8bf7\u79fb\u6b65 [gma](https://gma.luosgeo.com/) \u6216 [EOmaps](https://github.com/raphaelquast/EOmaps)\u3002\r\n\r\n## \u5b89\u88c5\r\n\r\n```\r\npip install frykit\r\n```\r\n\r\n\u4f9d\u8d56\u4e3a `cartopy>=0.20.0`\u3002\r\n\r\n`python<3.9.0` \u65f6\u8bf7\u6307\u5b9a `pip install frykit==0.2.5`\u3002\r\n\r\n## \u793a\u4f8b\r\n\r\n### \u8bfb\u53d6\u4e2d\u56fd\u884c\u653f\u533a\u5212\r\n\r\n```Python\r\nimport frykit.shp as fshp\r\n\r\n# \u8bfb\u53d6\u56fd\u754c.\r\ncountry = fshp.get_cn_shp(level='\u56fd')\r\n\r\n# \u8bfb\u53d6\u7701\u754c.\r\nprovinces = fshp.get_cn_shp(level='\u7701')\r\nanhui = fshp.get_cn_shp(level='\u7701', province='\u5b89\u5fbd\u7701')\r\n\r\n# \u8bfb\u53d6\u5e02\u754c.\r\ncities = fshp.get_cn_shp(level='\u5e02')\r\nhefei = fshp.get_cn_shp(level='\u5e02', city='\u5408\u80a5\u5e02')\r\ncities_of_anhui = fshp.get_cn_shp(level='\u5e02', province='\u5b89\u5fbd\u7701')\r\n```\r\n\r\n\u8fd4\u56de\u7ed3\u679c\u4e3a Shapely \u7684\u591a\u8fb9\u5f62\u5bf9\u8c61\uff0c\u53ef\u4ee5\u8fdb\u884c\u4ea4\u5e76\u7b49\u51e0\u4f55\u8fd0\u7b97\u3002\r\n\r\n\u884c\u653f\u533a\u5212\u7684 shapefile \u6587\u4ef6\u6765\u81ea [ChinaAdminDivisonSHP](https://github.com/GaryBikini/ChinaAdminDivisonSHP) \u9879\u76ee\uff0c\u5df2\u4ece GCJ-02 \u5750\u6807\u7cfb\u5904\u7406\u5230\u4e86 WGS84 \u5750\u6807\u7cfb\u4e0a\u3002\u6587\u4ef6\u90fd\u5728 `frykit.DATA_DIRPATH` \u6307\u5411\u7684\u76ee\u5f55\u91cc\u3002\r\n\r\n### \u7ed8\u5236\u4e2d\u56fd\u56fd\u754c\u548c\u7701\u754c\r\n\r\n```Python\r\n# \u7ed8\u5236\u56fd\u754c.\r\nfplt.add_cn_border(ax)\r\n\r\n# \u7ed8\u5236\u7701\u754c.\r\nfplt.add_cn_province(ax)\r\nfplt.add_cn_province(ax, name=['\u5b89\u5fbd\u7701', '\u6c5f\u82cf\u7701'])\r\n```\r\n\r\n`ax` \u53ef\u4ee5\u662f `Axes` \u6216 `GeoAxes`\u3002\r\n\r\n### \u7ed8\u5236\u4efb\u610f\u591a\u8fb9\u5f62\r\n\r\n```Python\r\nimport shapely.geometry as sgeom\r\n\r\n# \u7ed8\u5236\u4e00\u4e2a\u591a\u8fb9\u5f62.\r\npolygon = sgeom.polygon(...)\r\nfplt.add_polygon(ax, polygon)\r\n\r\n# \u7ed8\u5236\u591a\u4e2a\u591a\u8fb9\u5f62\u5e76\u586b\u8272.\r\npc = fplt.add_polygons(ax, polygons, array=data, cmap=cmap, norm=norm)\r\ncbar = fig.colorbar(pc, ax=ax)\r\n```\r\n\r\nCartopy \u7684 `GeoAxes.add_geometries` \u4f1a\u81ea\u52a8\u53bb\u9664 `polygons` \u4e2d\u4e0d\u5728 `GeoAxes` \u663e\u793a\u8303\u56f4\u5185\u7684\u591a\u8fb9\u5f62\uff0c\u7834\u574f `polygons` \u548c `array` \u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\uff0c\u6253\u4e71\u586b\u8272\u7684\u7ed3\u679c\u3002\u5de5\u5177\u7bb1\u4e2d\u7684 `add_polygons` \u51fd\u6570\u4e0d\u4f1a\u8fdb\u884c\u8fd9\u4e00\u64cd\u4f5c\uff0c\u80fd\u591f\u4ea7\u751f\u6b63\u786e\u7684\u586b\u8272\u7ed3\u679c\u3002\r\n\r\n### \u88c1\u526a\u586b\u8272\u56fe\r\n\r\n```Python\r\ncf = ax.contourf(lon, lat, data, transform=data_crs)\r\n\r\n# \u7528\u56fd\u754c\u6216\u7701\u754c\u88c1\u526a.\r\nfplt.clip_by_cn_border(cf)\r\nfplt.clip_by_cn_province(cf, '\u6cb3\u5317\u7701')\r\n```\r\n\r\n\u88ab\u88c1\u526a\u7684\u5bf9\u8c61\u8fd8\u53ef\u4ee5\u662f `contour`\u3001`clabel`\u3001`pcolormesh`\u3001`quiver` \u7b49\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u3002\r\n\r\n\u5f53\u7528\u4e8e\u88c1\u526a\u7684\u591a\u8fb9\u5f62\u8d85\u51fa `GeoAxes` \u7684\u663e\u793a\u8303\u56f4\u65f6\uff0c\u76f4\u63a5\u7528 `Artist.set_clip_path` \u505a\u88c1\u526a\u4f1a\u53d1\u751f\u586b\u8272\u56fe\u51fa\u754c\u7684\u73b0\u8c61\uff08[cartopy/issues/2052](https://github.com/SciTools/cartopy/issues/2052)\uff09\u3002\u5de5\u5177\u7bb1\u5185\u7684 `clip_by_xxx` \u7cfb\u5217\u51fd\u6570\u5bf9\u6b64\u8fdb\u884c\u4e86\u5904\u7406\u3002\r\n\r\n### \u52a0\u901f\u7ed8\u5236\u548c\u88c1\u526a\r\n\r\n\u7ed8\u5236\u591a\u8fb9\u5f62\u548c\u88c1\u526a\u586b\u8272\u56fe\u8fc7\u7a0b\u4e2d\u9700\u8981\u5bf9\u591a\u8fb9\u5f62\u8fdb\u884c\u5750\u6807\u53d8\u6362\uff0c\u5de5\u5177\u7bb1\u9ed8\u8ba4\u8fdb\u884c\u901f\u5ea6\u66f4\u5feb\uff0c\u4f46\u7ed3\u679c\u4e0d\u591f\u4e25\u683c\u7684\u53d8\u6362\u65b9\u6cd5\u3002\u5feb\u901f\u548c\u4e25\u683c\u4e24\u79cd\u53d8\u6362\u65b9\u6cd5\u95f4\u7684\u5207\u6362\u4e3a\uff1a\r\n\r\n```Python\r\nenable_fast_transform()\r\ndisable_fast_transform()\r\n```\r\n\r\n`add_cn_xxx` \u7cfb\u5217\u51fd\u6570\u5728\u591a\u6b21\u8c03\u7528\u65f6\u4f1a\u901a\u8fc7\u7f13\u5b58\u8282\u7701\u8bfb\u53d6\u56fd\u754c\u548c\u7701\u754c\u6570\u636e\u7684\u65f6\u95f4\u5f00\u9500\u3002\u5982\u679c\u80fd\u7ef4\u6301\u5bf9\u591a\u8fb9\u5f62\u5bf9\u8c61\u7684\u5f15\u7528\uff0c`add_polygon`\u3001`add_polygons` \u548c `clip_by_xxx` \u7cfb\u5217\u51fd\u6570\u5728\u591a\u6b21\u8c03\u7528\u65f6\u4f1a\u901a\u8fc7\u7f13\u5b58\u8282\u7701\u591a\u8fb9\u5f62\u5750\u6807\u53d8\u6362\u7684\u65f6\u95f4\u5f00\u9500\u3002\r\n\r\n### \u6dfb\u52a0\u6307\u5317\u9488\u548c\u6bd4\u4f8b\u5c3a\r\n\r\n```Python\r\nfplt.add_compass(ax1, 0.95, 0.8, size=15, style='star')\r\nscale = fplt.add_map_scale(ax1, 0.36, 0.8, length=1000)\r\nscale.set_xticks([0, 500, 1000])\r\n```\r\n\r\n\u6307\u5317\u9488\u4f1a\u81ea\u52a8\u6307\u5411\u6240\u5728\u4f4d\u7f6e\u5904\u7684\u5317\u5411\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7 `angle` \u53c2\u6570\u624b\u52a8\u6307\u5b9a\u89d2\u5ea6\u3002\r\n\r\n\u6bd4\u4f8b\u5c3a\u7684\u957f\u5ea6\u901a\u8fc7 `GeoAxes` \u4e2d\u5fc3\u5904\u5355\u4f4d\u957f\u5ea6\u548c\u5b9e\u9645\u8ddd\u79bb\u7684\u6bd4\u503c\u8ba1\u7b97\u5f97\u5230\u3002\u6bd4\u4f8b\u5c3a\u672c\u8eab\u7531\u4e00\u4e2a\u538b\u6241\u4e86\u7684 `Axes` \u6a21\u62df\uff0c\u6240\u4ee5\u53ef\u901a\u8fc7 `set_xticks` \u7b49\u65b9\u6cd5\u4fee\u6539\u6837\u5f0f\u3002\r\n\r\n### \u5b9a\u4f4d\u5357\u6d77\u5c0f\u5730\u56fe\r\n\r\n```Python\r\nsub_ax = fig.add_subplot(projection=map_crs)\r\nsub_ax.set_extent([105, 120, 2, 25], crs=data_crs)\r\nfplt.move_axes_to_corner(sub_ax, ax)\r\n```\r\n\r\n\u9700\u8981\u5148\u786e\u5b9a\u4e3b\u56fe\u548c\u5b50\u56fe\u7684\u663e\u793a\u8303\u56f4\uff0c\u518d\u5229\u7528 `move_axes_to_corner` \u51fd\u6570\u5c06\u5b50\u56fe\u7f29\u5c0f\u5e76\u5b9a\u4f4d\u5230\u4e3b\u56fe\u7684\u89d2\u843d\u3002\r\n\r\n### \u6dfb\u52a0\u98ce\u77e2\u91cf\u56fe\u4f8b\r\n\r\n```Python\r\nfplt.add_quiver_legend(Q, U=10, width=0.15, height=0.12)\r\n```\r\n\r\n\u5728 `Axes` \u7684\u89d2\u843d\u6dfb\u52a0\u4e00\u4e2a\u767d\u8272\u77e9\u5f62\u80cc\u666f\u7684\u98ce\u77e2\u91cf\u56fe\u4f8b\u3002\u53ef\u4ee5\u901a\u8fc7 `rect_kwargs` \u5b57\u5178\u63a7\u5236\u77e9\u5f62\u7684\u6837\u5f0f\uff0c\u901a\u8fc7 `key_kwargs` \u5b57\u5178\u63a7\u5236 `quiverkey` \u7684\u6837\u5f0f\u3002\r\n\r\n### \u6dfb\u52a0\u7ecf\u7eac\u5ea6\u65b9\u6846\r\n\r\n```Python\r\nfplt.add_box(ax, [lon0, lon1, lat0, lat1], transform=ccrs.PlateCarree())\r\n```\r\n\r\n\u5f53 `ax` \u662f `GeoAxes` \u65f6\u4f1a\u5bf9\u65b9\u6846\u4e0a\u7684\u70b9\u63d2\u503c\uff0c\u4ee5\u4fdd\u8bc1\u65b9\u6846\u5728 `ax` \u7684\u5750\u6807\u7cfb\u91cc\u8db3\u591f\u5e73\u6ed1\u3002\r\n\r\n### \u79bb\u6563 colorbar\r\n\r\n```Python\r\n# \u4e00\u4e2a\u989c\u8272\u5bf9\u5e94\u4e00\u4e2a\u523b\u5ea6\u7684\u5b9a\u6027colorbar.\r\ncolors = [\r\n 'orangered', 'orange', 'yellow',\r\n 'limegreen', 'royalblue', 'darkviolet'\r\n]\r\ncmap, norm, ticks = fplt.make_qualitative_cmap(colors)\r\ncbar = fplt.plot_colormap(cmap, norm)\r\ncbar.set_ticks(ticks)\r\ncbar.set_ticklabels(colors)\r\n\r\n# \u4fdd\u8bc1\u96f6\u503c\u533a\u95f4\u5bf9\u5e94\u767d\u8272\u7684\u79bb\u6563colorbar.\r\nimport cmaps\r\nboundaries = [-10, -5, -2, -1, 1, 2, 5, 10, 20, 50, 100]\r\nnorm = fplt.CenteredBoundaryNorm(boundaries)\r\ncbar = fplt.plot_colormap(cmaps.BlueWhiteOrangeRed, norm)\r\ncbar.set_ticks(boundaries)\r\n```\r\n\r\n\r\n\r\n### \u8be6\u7ec6\u4ecb\u7ecd\r\n\r\n\u5de5\u5177\u7bb1\u7684\u539f\u7406\u548c\u4f7f\u7528\u573a\u666f\u53ef\u89c1\u4e0b\u9762\u51e0\u7bc7\u535a\u6587\uff1a\r\n\r\n- [Cartopy \u7cfb\u5217\uff1a\u63a2\u7d22 shapefile](https://zhajiman.github.io/post/cartopy_shapefile/)\r\n- [Cartopy \u7cfb\u5217\uff1a\u88c1\u526a\u586b\u8272\u56fe\u51fa\u754c\u95ee\u9898](https://zhajiman.github.io/post/cartopy_clip_outside/)\r\n- [CALIPSO L2 VFM \u4ea7\u54c1\u7684\u8bfb\u53d6\u548c\u7ed8\u5236\uff08with Python\uff09](https://zhajiman.github.io/post/calipso_vfm/)\r\n- [Matplotlib \u7cfb\u5217\uff1acolormap \u7684\u8bbe\u7f6e](https://zhajiman.github.io/post/matplotlib_colormap/)\r\n\r\n### \u793a\u4f8b\u6548\u679c\r\n\r\n`cd` \u5230\u5305\u7684 `example` \u76ee\u5f55\u91cc\u53ef\u4ee5\u6267\u884c\u793a\u4f8b\u811a\u672c\uff1a\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n",
"bugtrack_url": null,
"license": "",
"summary": "A simple toolbox for Matplotib and Cartopy",
"version": "0.3.2.post1",
"project_urls": {
"Homepage": "https://github.com/ZhaJiMan/frykit"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "64b154d4fdd3fee34ee2df09e29c7598fce9e39c1737338dc9ee163c82e3a782",
"md5": "80d1dc076e275843ab2db281c4ce195b",
"sha256": "89ae5c4342c645f30f422f795ebf1da7b8af22aa822b0f555c76c73a4b6ac268"
},
"downloads": -1,
"filename": "frykit-0.3.2.post1.tar.gz",
"has_sig": false,
"md5_digest": "80d1dc076e275843ab2db281c4ce195b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 38203121,
"upload_time": "2023-11-26T12:32:54",
"upload_time_iso_8601": "2023-11-26T12:32:54.390322Z",
"url": "https://files.pythonhosted.org/packages/64/b1/54d4fdd3fee34ee2df09e29c7598fce9e39c1737338dc9ee163c82e3a782/frykit-0.3.2.post1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-11-26 12:32:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ZhaJiMan",
"github_project": "frykit",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "frykit"
}