[蝦神GIS製圖課堂]四色地圖配色法

2022-01-01 21:00:01

2021年的最後一天,本年度最後一篇推播,不過,如果要說是過年的話:

圖片

[花絮]三與迷之自信

人類自古有各種數位迷信,西方特別迷信3:

圖片

——畢達哥拉斯認為,3是宇宙的基礎,是最完美的數位

所以,學術上牛頓有物理三大定律,

政治上有三權分立,

連西方大部分國家的國旗都三色旗:

圖片

今日乳法 (1/1)

所以,數學也是一樣,費馬猜想四色猜想哥德巴赫猜想被認為是近代數學三大難題。

當然,在國內最出名號稱民科身份證的哥德巴赫猜想(如果你沒有證明過哥德巴赫猜想,都不好意思說自己是民科)……據說,中科院數學所每年收到的有關哥猜的證明信能繞地球一圈。

但是,不出所料,就是裡面肯定沒有一篇是對的:其中絕大多數錯誤更是甚至都不超出中學數學的常識範圍。比如傳說中的把d約掉:

 

還有用企圖用初中數學證明哥德巴赫猜想的:

最後,信件實在太多了,數學所的研究人員全部轉職為審稿人也都搞不定,所以最有研究人員都只能定下一個潛規則:所有有關哥猜的信件,都不看、不評、不研究:

 

……但是出於禮貌都會回信告知其正確的途徑是:先寫成論文,再向學術期刊投稿。(不過所有的民科,都認為論文是官科對民科的壓榨,因為他們不會寫論文……)

然而,依然有無數想著一鳴驚人的民科,想靠一個草稿本就打遍天下無敵手……他們不遠萬里,帶著自己的草稿蹲守在中科院數學與系統科學研究門口,要求專家鑑定。

 

好吧,說到這裡,民科領域也有三大最出名的目標,分別是永動機、相對論和哥猜……傳說百度的民科吧裡面,永動機每天都會被髮明32次,

 

而相對論每天都會被推翻無數次,不過這些年哥猜好像落伍了,民科們轉向玩量子力學了……

好了,花絮到此為止。

我在以前寫空間統計裡面的中位數中心演演算法的時候,簡單介紹過費馬大定理,今天我們想給大家介紹三大數學難題裡面的另外一個,就是「四色猜想」問題。

四色猜想可以簡單描述為:任意地圖的劃分割區域,都可以只使用四種顏色來進行渲染,並且保證沒有任意兩個鄰接的區域內的顏色相同。如下圖所示:

 

不管你用何種奇葩詭異的圖形,都不可能在一個平面或者球面上構建五個以上兩兩相鄰的區域:這個是二維平面的拓撲學和圖學上面的一個基本理論或者說固有屬性:即平面內不可出現交叉而沒有公共點的兩條直線

之所以稱之為「猜想」,就是因為沒有具體的證明方法,所以一百多年來,無數數學家和愛好者,都希望證明或者推翻這個猜想,但是不管他們構建任何奇葩的圖形組合,都只能從側面上證明這個定理的有效。

俗話說:只要馬力大,板磚也能飛……計算機面世之後,自然開啟了數學定律的暴力破解時代。1976年6月,在美國伊利諾斯大學的兩臺不同的電子計算機上,幾個數學家用了1200個小時,作了100億個判斷,結果依然證明了沒有任何一張地圖是需要五色的,從某種程度上「驗證」四色猜想的正確性。

不過計算機給出來的證明畢竟沒有太有力的理論說服力(計算機推理不可能給出合理的思考過程),特別不管計算機發展得再高階,也無法窮盡所有的可能性,所以這個四色猜想一直還在不斷的「猜想」中。

一個多世紀以來,數學家們為證明這條定理絞盡腦汁,所引進的概念與方法刺激了拓撲學與圖論的生長、發展。在「四色問題」的研究過程中,不少新的數學理論隨之產生,也發展了很多數學計算技巧。如將地圖的著色問題化為圖論問題,豐富了圖論的內容。不僅如此,「四色問題」在有效地設計航空班機日程表,設計計算機的編碼程式上都起到了推動作用。

雖然四種顏色就可以對地圖就行標識性渲染了(每個斑塊都與相鄰斑塊顏色不一樣),但是我國的標準地圖一直採用的是五色標識法,如下所示:

 

比如自然資源部給出來的這張標準地圖,就用了下面五種顏色:

 

當然,每個省(斑塊)的配色方式,並非是一成不變的,比如下面這1699號地圖,依然是這五種顏色,但是各個省的配色又不一樣。即:全域性上是統一用這五種顏色,但是區域性上,每種顏色的使用、分佈以及相鄰規則,都不受限制。

 

那麼怎麼進行五色(四色)配圖呢?很多年前,蝦神和同事們討論過這個問題,但是大多都是採用自己寫演演算法來實現的,原理就是先構建空間關係矩陣,然後分類挑選出不相鄰的部分,給予一個顏色標號就行。

但是現在不用這麼麻煩了,今天給大家介紹一個非常簡單的工具包來實現五色地圖的繪製方法,先看結果:

 

這裡要推薦的包,就是經典的地圖配色分級包:mapclassfiy

 

存取地址:https://pypi.org/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.lth.se/cs/Personal/Andrzej_Lingas/k-m.pdf

當然,我們也可以繪製一個複雜點的,比如山東縣級資料,一共137個區縣:

 

如果做四色分佈,結果如下:

 

其他的引數,大家可以參考官方程式碼幫助,下面我們給出中國地圖的繪製方法,裡面比較核心的地方,就是怎麼製作中國國界線那一圈帶陰影的邊界:

 

實際上以前看過蝦神的文章的同學都知道,這種陰影的作法,就是對國界線進行多環緩衝區,我們放大就會發現,這是很多圈組成的:

 

程式碼如下:

 

然後就可以繪圖了:

圖片

所有的程式碼都在老地方:

https://gitee.com/godxia/python_map_visualization

009四色圖視覺化

打完收工

雖然是公曆年,好歹也是過年了,所以最後:

圖片