地圖可視化:geopandas繪制拓?fù)渲貓D

添加微信號"CNFeffery"加入技術(shù)交流群
?本文示例代碼及文件已上傳至我的
?Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
我們在繪制某些地圖時,為了凸顯出每個獨立的區(qū)域,需要滿足拓?fù)渲?/code>要求,即所有相鄰的區(qū)域不可以用同一種顏色繪制,以前的手繪地圖需要繪制者自行思考設(shè)計具體的著色規(guī)則,而現(xiàn)如今通過計算機的輔助,我們可以快速生成大量的著色方案。
今天我們就來學(xué)習(xí)配合geopandas如何快速實現(xiàn)地圖的拓?fù)渲?/p>

2 基于mapclassify的地圖拓?fù)渲?/span>
對于著色方案的生成,我們需要使用到mapclassify這個第三方庫,以前我的geopandas系列文章分層設(shè)色篇也介紹過其中的諸多功能,而本文需要使用到其特殊的greedy功能。
以中國縣級單元矢量邊界數(shù)據(jù)為例,它包含了共2900個縣級單元的行政區(qū)劃面矢量要素:

對于這樣一個典型的面要素眾多的地圖,利用mapclassify.greedy(),我們可以基于面要素之間的鄰接拓?fù)?/span>關(guān)系,快速生成一定配色數(shù)量的方案出來,greedy()的主要參數(shù)如下:
gdf:GeoDataFrame型,用于傳入待處理的地理數(shù)據(jù)框 strategy:str型,用于設(shè)定拓?fù)渲扇〉木唧w策略,默認(rèn)為 balanced(這也是QGIS中拓?fù)渲褂玫姆椒ǎ溆嗫蛇x策略有'largest_first'、'random_sequential'、'smallest_last'、'independent_set'、'connected_sequential_bfs'、'connected_sequential_dfs'、'connected_sequential'、'saturation_largest_first'、'DSATUR'等,詳細(xì)介紹見https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.coloring.greedy_color.htmlbalance:str型,當(dāng) strategy='balanced'時,用于設(shè)定如何進行“平衡”著色,默認(rèn)為'count',可選項如下,其中除了'count'方式以外,其余方式均需要輸入的GeoDataFrame為投影坐標(biāo)系:count:盡量保持每種顏色對應(yīng)的面要素數(shù)量平衡 area:盡量保持每種顏色對應(yīng)的面要素面積之和平衡 centroid:盡量保持每種顏色對應(yīng)的面要素之間「重心距離」平衡 distance:盡量保持每種顏色對應(yīng)的面要素之間「拓?fù)渚嚯x」平衡 min_colors:int型,當(dāng) strategy='balanced'時,用于設(shè)置色彩方案「至少」的色彩數(shù)量,最后運算產(chǎn)生的色彩劃分結(jié)果可能會大于這個參數(shù)sw:str型,用于設(shè)定拓?fù)溧徑雨P(guān)系判定策略, 'rook'表示「共邊鄰接」,'queen'表示「共點鄰接」,默認(rèn)為'queen'min_distance:數(shù)值型,默認(rèn)為 None,有時由于數(shù)據(jù)質(zhì)量、精度的原因,可能會導(dǎo)致肉眼看起來的鄰接實際上仍然存在一定的“間距”,這時就可以使用min_distance參數(shù)來設(shè)定距離閾值來幫助greedy捕捉相鄰面要素關(guān)系,即面要素兩兩之間拓?fù)渚嚯x小于min_distance時也視作“鄰接”
知曉了greedy()的主要參數(shù)后,我們下面來演示如何使用它來輔助制作拓?fù)渲貓D。
首先我們需要向greedy()中傳入對應(yīng)的面要素GeoDataFrame,greedy()會根據(jù)我們的參數(shù)設(shè)定為每一個面生成一個標(biāo)簽,我們只需要將此標(biāo)簽列作為繪圖著色映射列即可,可以看到最終得到的標(biāo)簽方案中共有7種不同標(biāo)簽,雖然按照四色問題的猜想,任何拓?fù)渲貓D只需要4種顏色即可完成色彩填充,但在有限的計算時間內(nèi),greedy()給出了還不錯的方案:

按照標(biāo)簽進行顏色分配:

放大仔細(xì)發(fā)現(xiàn),每個鄰接的區(qū)域的確實現(xiàn)了顏色不重合:

而如果你希望用自定義色彩值來配合標(biāo)簽字段進行映射,則可以參考我下面的做法,將具體的顏色值譬如16進制色彩字符串傳入color參數(shù),這里使用到以前介紹過多次的配色庫palettable:

以上就是本文的全部內(nèi)容,歡迎在評論區(qū)與我進行討論~

加入知識星球【我們談?wù)摂?shù)據(jù)科學(xué)】
400+小伙伴一起學(xué)習(xí)!
· 推薦閱讀?·
「Python實用秘技02」給Python函數(shù)定“鬧鐘”
「Python實用秘技03」導(dǎo)出項目的極簡環(huán)境依賴
