分享

[虾神GIS制图课堂]四色地图配色法

 godxiasad 2023-04-21 发布于北京
2021年的最后一天,本年度最后一篇推送,不过,如果要说是过年的话:

[花絮]三与迷之自信





人类自古有各种数字迷信,西方特别迷信3:
——毕达哥拉斯认为,3是宇宙的基础,是最完美的数字
所以,学术上牛顿有物理三大定律,
政治上有三权分立,
连西方大部分国家的国旗都三色旗:
今日乳法 (1/1)

所以,数学也是一样,费马猜想四色猜想哥德巴赫猜想被认为是近代数学三大难题。
当然,在国内最出名号称民科身份证的哥德巴赫猜想(如果你没有证明过哥德巴赫猜想,都不好意思说自己是民科)……据说,中科院数学所每年收到的有关哥猜的证明信能绕地球一圈。
但是,不出所料,就是里面肯定没有一篇是对的:其中绝大多数错误更是甚至都不超出中学数学的常识范围。比如传说中的把d约掉:

还有用企图用初中数学证明哥德巴赫猜想的:

最后,信件实在太多了,数学所的研究人员全部转职为审稿人也都搞不定,所以最有研究人员都只能定下一个潜规则:所有有关哥猜的信件,都不看、不评、不研究:

……但是出于礼貌都会回信告知其正确的途径是:先写成论文,再向学术期刊投稿。(不过所有的民科,都认为论文是官科对民科的压榨,因为他们不会写论文……)
然而,依然有无数想着一鸣惊人的民科,想靠一个草稿本就打遍天下无敌手……他们不远万里,带着自己的草稿蹲守在中科院数学与系统科学研究门口,要求专家鉴定。
好吧,说到这里,民科领域也有三大最出名的目标,分别是永动机、相对论和哥猜……传说百度的民科吧里面,永动机每天都会被发明32次,
而相对论每天都会被推翻无数次,不过这些年哥猜好像落伍了,民科们转向玩量子力学了……
好了,花絮到此为止。
我在以前写空间统计里面的中位数中心算法的时候,简单介绍过费马大定理,今天我们想给大家介绍三大数学难题里面的另外一个,就是“四色猜想”问题。
四色猜想可以简单描述为:任意地图的划分区域,都可以只使用四种颜色来进行渲染,并且保证没有任意两个邻接的区域内的颜色相同。如下图所示:
不管你用何种奇葩诡异的图形,都不可能在一个平面或者球面上构建五个以上两两相邻的区域:这个是二维平面的拓扑学和图形学上面的一个基本理论或者说固有属性:即平面内不可出现交叉而没有公共点的两条直线
之所以称之为“猜想”,就是因为没有具体的证明方法,所以一百多年来,无数数学家和爱好者,都希望证明或者推翻这个猜想,但是不管他们构建任何奇葩的图形组合,都只能从侧面上证明这个定理的有效。
俗话说:只要马力大,板砖也能飞……计算机面世之后,自然开启了数学定律的暴力破解时代。1976年6月,在美国伊利诺斯大学的两台不同的电子计算机上,几个数学家用了1200个小时,作了100亿个判断,结果依然证明了没有任何一张地图是需要五色的,从某种程度上“验证”四色猜想的正确性。
不过计算机给出来的证明毕竟没有太有力的理论说服力(计算机推理不可能给出合理的思考过程),特别不管计算机发展得再高级,也无法穷尽所有的可能性,所以这个四色猜想一直还在不断的“猜想”中。
一个多世纪以来,数学家们为证明这条定理绞尽脑汁,所引进的概念与方法刺激了拓扑学与图论的生长、发展。在“四色问题”的研究过程中,不少新的数学理论随之产生,也发展了很多数学计算技巧。如将地图的着色问题化为图论问题,丰富了图论的内容。不仅如此,“四色问题”在有效地设计航空班机日程表,设计计算机的编码程序上都起到了推动作用。
虽然四种颜色就可以对地图就行标识性渲染了(每个斑块都与相邻斑块颜色不一样),但是我国的标准地图一直采用的是五色标识法,如下所示:


比如自然资源部给出来的这张标准地图,就用了下面五种颜色:
当然,每个省(斑块)的配色方式,并非是一成不变的,比如下面这1699号地图,依然是这五种颜色,但是各个省的配色又不一样。即:全局上是统一用这五种颜色,但是局部上,每种颜色的使用、分布以及相邻规则,都不受限制。


那么怎么进行五色(四色)配图呢?很多年前,虾神和同事们讨论过这个问题,但是大多都是采用自己写算法来实现的,原理就是先构建空间关系矩阵,然后分类挑选出不相邻的部分,给予一个颜色标号就行。
但是现在不用这么麻烦了,今天给大家介绍一个非常简单的工具包来实现五色地图的绘制方法,先看结果:
这里要推荐的包,就是经典的地图配色分级包:mapclassfiy

访问地址:https:///project/mapclassify/

我们在介绍栅格配色的时候,已经对这个包进行了简介,这里就不赘述了,大家可以去翻以前的文章:
栅格数据配色的几种小技巧
今天要介绍的mapclassify下面的一个配色方法:
mapclassify.greedy
我们来看看这个方法是干嘛的:

greedy(gdf, strategy='balanced',     balance='count', min_colors=4,     sw='queen', min_distance=None,     silence_warnings=True, interchange=False)    Color GeoDataFrame using various strategies of     greedy (topological) colouring.       Attempts to color a GeoDataFrame using as     few colors as possible, where no    neighbours can have same color as     the feature itself. Offers various strategies    ported from QGIS or implemented within networkX     for greedy graph coloring.       ``greedy`` will return pandas.Series     representing assinged color codes.
官方的解释是:在这个方法会使用各种贪婪(拓扑)着色策略为你的GeoDataFrame进行着色渲染。
算法会尝试使用尽可能少的颜色为 GeoDataFrame 进行着色,而且保证任何没有任何一个要素的邻居会具有与要素本身相同的颜色。
里面提供了提供若干种策略供选择,算法移植从QGIS中进行移植,并且在networkx中实现(所以这个包需要依赖于networkx包)。
 最后返回表示分配的颜色代码的 pandas.Series。

我们来看一个例子:
我们使用中国的省级行政区划,然后利用greedy方法,可以看见,唯一值只有四种:
然后渲染一下:
注意,我这里使用了strategy参数(分配策略),这个参数默认情况下用的balanced(平衡策略,而平衡策略最少得5种颜色……当然,也可以增加更多的颜色分配)而采用其他的策略,就都是四色分配法了:

每种算法的具体说明,请参考:
Adrian Kosowski, and Krzysztof Manuszewski, Classical Coloring of Graphs, Graph Colorings, 2-19, 2004. ISBN 0-8218-3458-4.
论文地址:
https://fileadmin.cs./cs/Personal/Andrzej_Lingas/k-m.pdf

当然,我们也可以绘制一个复杂点的,比如山东县级数据,一共137个区县:

如果做四色分布,结果如下:

其他的参数,大家可以参考官方代码帮助,下面我们给出中国地图的绘制方法,里面比较核心的地方,就是怎么制作中国国界线那一圈带阴影的边界:
实际上以前看过虾神的文章的同学都知道,这种阴影的作法,就是对国界线进行多环缓冲区,我们放大就会发现,这是很多圈组成的:
代码如下:
然后就可以绘图了:

所有的代码都在老地方:
https:///godxia/python_map_visualization
009四色图可视化

打完收工
虽然是公历年,好歹也是过年了,所以最后:

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多