(数据科学学习手札133)利用geopandas绘制拓扑着色地图
本文示例代码及文件已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
我们在绘制某些地图时,为了凸显出每个独立的区域,需要满足拓扑着色
要求,即所有相邻的区域不可以用同一种颜色绘制
,以前的手绘地图需要绘制者自行思考设计具体的着色规则,而现如今通过计算机的辅助,我们可以快速生成大量的着色方案。
今天我们就来学习配合geopandas
如何快速实现地图的拓扑着色。
2 基于mapclassify的地图拓扑着色
对于着色方案的生成,我们需要使用到mapclassify
这个第三方库,以前我的geopandas
系列文章分层设色篇也介绍过其中的诸多功能,而本文需要使用到其特殊的greedy
功能。
以中国县级单元矢量边界数据为例,它包含了共2900个县级单元的行政区划面矢量要素:
对于这样一个典型的面要素众多的地图,利用mapclassify.greedy()
,我们可以基于面要素之间的邻接拓扑关系,快速生成一定配色数量的方案出来,greedy()
的主要参数如下:
- gdf:GeoDataFrame型,用于传入待处理的地理数据框
- strategy:str型,用于设定拓扑着色所采取的具体策略,默认为
balanced
(这也是QGIS
中拓扑着色所使用的方法),其余可选策略有'largest_first'
、'random_sequential'
、'smallest_last'
、'independent_set'
、'connected_sequential_bfs'
、'connected_sequential_dfs'
、'connected_sequential'
、'saturation_largest_first'
、'DSATUR'
等,详细介绍见https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.coloring.greedy_color.html
- balance:str型,当
strategy='balanced'
时,用于设定如何进行“平衡”着色,默认为'count'
,可选项如下,其中除了'count'
方式以外,其余方式均需要输入的GeoDataFrame
为投影坐标系:- count:尽量保持每种颜色对应的面要素数量平衡
- area:尽量保持每种颜色对应的面要素面积之和平衡
- centroid:尽量保持每种颜色对应的面要素之间重心距离平衡
- distance:尽量保持每种颜色对应的面要素之间拓扑距离平衡
- min_colors:int型,当
strategy='balanced'
时,用于设置色彩方案至少的色彩数量,最后运算产生的色彩划分结果可能会大于这个参数 - sw:str型,用于设定拓扑邻接关系判定策略,
'rook'
表示共边邻接,'queen'
表示共点邻接,默认为'queen'
- min_distance:数值型,默认为
None
,有时由于数据质量、精度的原因,可能会导致肉眼看起来的邻接实际上仍然存在一定的“间距”,这时就可以使用min_distance
参数来设定距离阈值来帮助greedy
捕捉相邻面要素关系,即面要素两两之间拓扑距离小于min_distance
时也视作“邻接”
知晓了greedy()
的主要参数后,我们下面来演示如何使用它来辅助制作拓扑着色地图。
首先我们需要向greedy()
中传入对应的面要素GeoDataFrame
,greedy()
会根据我们的参数设定为每一个面生成一个标签,我们只需要将此标签列作为绘图着色映射列即可,可以看到最终得到的标签方案中共有7种不同标签,虽然按照四色问题的猜想,任何拓扑着色地图只需要4种颜色即可完成色彩填充,但在有限的计算时间内,greedy()
给出了还不错的方案:
按照标签进行颜色分配:
放大仔细发现,每个邻接的区域的确实现了颜色不重合:
而如果你希望用自定义色彩值来配合标签字段进行映射,则可以参考我下面的做法,将具体的颜色值譬如16进制色彩字符串传入color
参数,这里使用到以前介绍过多次的配色库palettable
:
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
最新文章
- int[] convert byte[]
- 第一章,Linux常用命令
- IOS开发--待研究源码(持续添加更新)
- Srum框架
- Sql 随机生成日期时间
- Mysql自定义变量的使用
- RenderPartial: No overload for method 'Write' takes 0 arguments
- 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
- MVC思想概述
- IPerf——网络测试工具介绍与源码解析(4)
- MySQL root密码忘记,原来还有更优雅的解法!
- memset赋值
- maven使用配置
- s4-6 二层交换
- UI中新增一个右击按钮的过程
- ReactiveCocoa 5.0 初次了解
- [Luogu 3398] 仓鼠找sugar
- Python3.2官方文档翻译--标准库概览(一)
- Oracle之SYSDBA的使用
- 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式
热门文章
- 电脑盘符为什么从C盘开始?A盘和B盘去哪了?
- 《手把手教你》系列技巧篇(四十七)-java+ selenium自动化测试-判断元素是否显示(详解教程)
- 学习java的第十六天
- 1005.K次取反后最大化的数组和
- 零基础学习java------34---------登录案例,域,jsp(不太懂),查询商品列表案例(jstl标签)
- 【leetcode】153. Find Minimum in Rotated Sorted Array
- C++类的定义,成员函数的定义,对象的创建与使用
- RestTemplate的exchange()方法,解决put和delete请求拿不到返回值的问题
- Restful、SOAP、RPC、SOA、微服务之间的区别
- python数据预处理和特性选择后列的映射