A simple toolbox for Matplotib and Cartopy
Project description
frykit
一个配合 Matplotlib 和 Cartopy 使用的工具箱,主要由 shp
和 plot
模块组成。
shp
模块的功能是:
- 读取中国行政区划数据
- 创建多边形掩膜(mask)
- 多边形坐标变换
plot
模块的功能包括:
- 读取中国行政区划数据
- 向地图添加中国国界和省界
- 利用国界和省界对填色图进行裁剪(白化)
- 设置地图刻度
- 添加风矢量图的图例
- 添加指北针
- 添加地图比例尺
没有文档,但是每个函数都有详细的 docstring,可以在 Python命令行中通过 help
函数查看,或者在 IDE 中查看。
这个包只是作者自用的小工具集,函数编写粗糙,可能存在不少 bug,还请多多交流指正。类似的更完备的包还请移步 gma 或 EOmaps。
安装
pip install frykit
依赖为 cartopy>=0.20.0
。如果觉得 Cartopy 不太好装,可以只复制所需函数的源码,然后自行修改到可以使用。
示例
读取中国行政区划
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 项目,坐标已从 GCJ-02 坐标系处理到了 WGS84 坐标系上。
绘制中国国界和省界
# 绘制中国国界.
fplt.add_cn_border(ax)
# 绘制中国省界.
fplt.add_cn_province(ax)
fplt.add_cn_province(ax, name=['安徽省', '江苏省'])
ax
可以为 Axes
或 GeoAxes
。多次调用时能够通过缓存节省读取数据的时间开销。
绘制任意多边形
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)
只要在主程序中维持对 polygon
的引用,就能在多次调用时通过缓存节省坐标变换的时间开销。
Cartopy 的 GeoAxes.add_geometries
会自动去除 polygons
中不在 GeoAxes
显示范围内的多边形,破坏 polygons
和 array
的一一对应关系,打乱填色的结果。工具箱中的 add_polygons
函数不会进行这一操作,能够产生正确的填色结果。
裁剪填色图
cf = ax.contourf(lon, lat, data, transform=data_crs)
fplt.clip_by_cn_border(cf)
被裁剪的对象还可以是 contour
、clabel
、pcolormesh
、quiver
等方法的返回值。
当用于裁剪的多边形超出 GeoAxes
的显示范围时,直接用 Artist.set_clip_path
做裁剪会发生填色图出界的现象(cartopy/issues/2052)。工具箱内的 clip_by_xxx
系列函数对此进行了处理。
加速绘制和裁剪
绘制多边形和裁剪填色图过程中需要对多边形进行坐标变换,工具箱默认进行速度更快,但结果不够严格的变换方法。快速和严格两种变换方法间的切换为:
enable_fast_transform()
disable_fast_transform()
添加指北针和比例尺
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])
指北针目前只是单纯指向图片上方,并不能真正指向所在地点的北方。
比例尺的尺寸是用 GeoAxes
中心处单位长度对应的距离计算得到。
定位南海小地图
sub_ax = fig.add_projection(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
函数将子图缩小并定位到主图的角落。
详细介绍
工具箱的原理和使用场景可见下面几篇博文:
效果图
cd
到包的 example
目录里可以执行示例脚本:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.