Skip to main content

A simple toolbox for Matplotib and Cartopy

Project description

frykit

一个配合 Matplotlib 和 Cartopy 使用的工具箱,主要由 shpplot 模块组成。

shp 模块的功能是:

  • 读取中国行政区划数据
  • 创建多边形掩膜(mask)
  • 多边形坐标变换

plot 模块的功能包括:

  • 读取中国行政区划数据
  • 向地图添加中国国界和省界
  • 利用国界和省界对填色图进行裁剪(白化)
  • 设置地图刻度
  • 添加风矢量图的图例
  • 添加指北针
  • 添加地图比例尺

没有文档,但是每个函数都有详细的 docstring,可以在 Python命令行中通过 help 函数查看,或者在 IDE 中查看。

这个包只是作者自用的小工具集,函数编写粗糙,可能存在不少 bug,还请多多交流指正。类似的更完备的包还请移步 gmaEOmaps

安装

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 可以为 AxesGeoAxes。多次调用时能够通过缓存节省读取数据的时间开销。

绘制任意多边形

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 显示范围内的多边形,破坏 polygonsarray 的一一对应关系,打乱填色的结果。工具箱中的 add_polygons 函数不会进行这一操作,能够产生正确的填色结果。

裁剪填色图

cf = ax.contourf(lon, lat, data, transform=data_crs)
fplt.clip_by_cn_border(cf)

被裁剪的对象还可以是 contourclabelpcolormeshquiver 等方法的返回值。

当用于裁剪的多边形超出 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 目录里可以执行示例脚本:

axes

contourf

fill

nerv_style

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

frykit-0.2.2.tar.gz (40.5 MB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page