原來(lái)炫酷的可視化地圖,用Python就能搞定!

對(duì)于可視化地圖,?我們之前講過(guò)Pyecharts
還有應(yīng)該就是一些網(wǎng)站了,現(xiàn)成的工具,不需要敲代碼。
比如下面就是用Pyecharts做的5G手機(jī)可視化地圖~

而對(duì)于Matplotlib,目前還沒(méi)有使用它繪制過(guò)地圖。
所以在查閱相關(guān)資料的時(shí)候,又發(fā)現(xiàn)了大佬造的輪子。
Python+Selenium+Matplotlib,實(shí)現(xiàn)中國(guó)地圖可視化。
地圖數(shù)據(jù)來(lái)源于民政部,真實(shí)可靠。
項(xiàng)目地址:https://gitee.com/jixuanfan/Map-of-China

由于小F之前一直用「GitHub」保存代碼,壓根就沒(méi)有注冊(cè)「Gitee」。
而作者的代碼以及相關(guān)數(shù)據(jù)是上傳到「Gitee」上,需要注冊(cè)下載。
不想注冊(cè)那么多賬號(hào),所以查了一下在不登錄情況下,能否下載項(xiàng)目代碼。
CURL,是一個(gè)利用URL語(yǔ)法在命令行下工作的文件傳輸工具。
#?在倉(cāng)庫(kù)地址(https://gitee.com/jixuanfan/Map-of-China)
#?后面拼接/repository/archive/master.zip
#?下載本例項(xiàng)目代碼
curl?-o?data.zip??https://gitee.com/jixuanfan/Map-of-China/repository/archive/master.zip
Windows或許需要安裝,那還是老老實(shí)實(shí)注冊(cè)賬號(hào),然后下載項(xiàng)目代碼。
Mac和Linux應(yīng)該都是內(nèi)置CURL,直接使用命令就行,無(wú)需安裝。
/ 01 / 地圖數(shù)據(jù)獲取
Get_Map,基于Python爬蟲,主要用到Selenium+正則。
Selenium是一個(gè)用于測(cè)試網(wǎng)站的自動(dòng)化測(cè)試工具,這里我們主要是用它來(lái)模擬瀏覽器操作,進(jìn)而獲取地圖數(shù)據(jù)。
安裝教程網(wǎng)上都有,推薦使用谷歌瀏覽器,驅(qū)動(dòng)文件和瀏覽器版本需一致。
獲取地圖數(shù)據(jù)的兩個(gè)接口地址。
#?首頁(yè)URL,獲取當(dāng)前所有行政區(qū)劃的代碼
http://xzqh.mca.gov.cn/map
#?查詢URL,獲取國(guó)家或省市的具體地圖數(shù)據(jù)
http://xzqh.mca.gov.cn/defaultQuery?
首先是獲取行政區(qū)劃的代碼,最小應(yīng)該是到縣一級(jí)。
繪制不同類型的地圖,所需要的數(shù)據(jù)獲取函數(shù)如下。
行政代碼不清楚,網(wǎng)上查詢一下就好咯~
import?Map_of_China?as?Map
#?創(chuàng)建獲取地圖數(shù)據(jù)對(duì)象
M=Map.Get_Map()
#?獲取首頁(yè)全國(guó)各省的地圖數(shù)據(jù)
M.Get_country()
#?獲取一組省份內(nèi)各地級(jí)行政區(qū)劃的數(shù)據(jù)
M.Get_provinces([32,43])
#?自動(dòng)獲取全國(guó)尚未獲取的省份數(shù)據(jù)
M.Get_provinces_auto()
#?獲取一組地級(jí)市內(nèi)各縣級(jí)行政區(qū)劃的數(shù)據(jù)
M.Get_cities([3201,3203])
#?自動(dòng)獲取某個(gè)省尚未獲取的縣級(jí)行政區(qū)劃數(shù)據(jù)
M.Get_cities_auto(32)
#?獲取全國(guó)所有縣級(jí)行政區(qū)劃的數(shù)據(jù)(合并在一張地圖中)
M.Get_country_county()
數(shù)據(jù)主要包括形狀、形狀顏色、形狀輪廓、文字、文字位置、標(biāo)注點(diǎn)形狀、標(biāo)注點(diǎn)位置等。

具體爬取代碼、數(shù)據(jù)解析及函數(shù)的相關(guān)參數(shù),查看Map_of_China.py文件可知。
/ 02 /? 地圖數(shù)據(jù)呈現(xiàn)
Draw_Map,基于Matplotlib繪制地圖。
01. 繪制省/地級(jí)/縣級(jí)行政區(qū)劃的輪廓
import?Map_of_China?as?Map
#?創(chuàng)建獲取地圖數(shù)據(jù)對(duì)象
M?=?Map.Get_Map()
#?創(chuàng)建繪制地圖對(duì)象
D?=?Map.Draw_Map()
#?#獲取首頁(yè)全國(guó)各省的地圖數(shù)據(jù)
M.Get_country()
#?江蘇地圖
D.Draw_single_shape('Data/Country/320000.txt',?LC=[116,?169,?221],
???????????????????????????????????FC=[96,?139,?219],?BC='w',?lw=2,?title='江蘇輪廓',
???????????????????????????????????img_path='jiansu.jpg')
#?獲取各省份內(nèi)各地級(jí)行政區(qū)劃的數(shù)據(jù)
M.Get_provinces([32])
#?南京地圖
D.Draw_single_shape('Data/Province/32-江蘇/320100.txt',?LC='k',?FC=None,?
???????????????????????????????????title='南京輪廓',?img_path='nanjing.jpg')
得到結(jié)果如下。


函數(shù)可設(shè)置的參數(shù),有線條、填充、背景顏色,以及線寬、標(biāo)題、圖片保存路徑等。

02. 繪制全國(guó)地圖
import?Map_of_China?as?Map
#?創(chuàng)建獲取地圖數(shù)據(jù)對(duì)象
M?=?Map.Get_Map()
#?創(chuàng)建繪制地圖對(duì)象
D?=?Map.Draw_Map()
#?繪制全國(guó)地圖
D.Draw_country(FC=True,?img_path='china.jpg',?arg={'provName':?False,
?????????????????????????'city_name':?True,?'city_pos':?True,?'sea':?False},?title='中國(guó)地圖')
因?yàn)榍懊嬉呀?jīng)把全國(guó)的地圖數(shù)據(jù)爬取下來(lái),所以這里就省去了下載數(shù)據(jù)的代碼。
得到結(jié)果如下。

配色方案,默認(rèn)設(shè)置為民政部官網(wǎng)上的配色。

有一些參數(shù)和輪廓圖相同,不過(guò)也添加了一些新的參數(shù)。
比如南海地圖位置,顯示省份名稱,省份名稱顏色等。
03. 繪制省份地圖
import?Map_of_China?as?Map
#?創(chuàng)建獲取地圖數(shù)據(jù)對(duì)象
M?=?Map.Get_Map()
#?獲取廣東省份內(nèi)各地級(jí)行政區(qū)劃的數(shù)據(jù)
M.Get_provinces([44])
#?創(chuàng)建繪制地圖對(duì)象
D?=?Map.Draw_Map()
#?繪制廣東省地圖
D.Draw_province('廣東',?FC=True,?LC='w',?arg={'other':?True,?'city_pos':?True,?'city_name':?True},
????????????????????????????img_path='guangdong.jpg')
對(duì)于省份數(shù)據(jù),前面小F只爬取了江蘇省,所以這里需要爬取廣東省的地圖數(shù)據(jù)才行。
得到結(jié)果如下。

繪制省份地圖函數(shù)對(duì)應(yīng)的參數(shù)有。

code可為省份的2位編碼或者名稱,此處設(shè)置為「廣東」。
函數(shù)還包含繪制熱力圖的參數(shù),data和by_val。
arg中的other設(shè)置為False時(shí),表現(xiàn)不顯示周圍省份或城市的地圖,默認(rèn)參數(shù)為True,即顯示。

04. 地級(jí)行政單位地圖
import?Map_of_China?as?Map
#?創(chuàng)建獲取地圖數(shù)據(jù)對(duì)象
M?=?Map.Get_Map()
#?獲取南京、深圳行政區(qū)劃的數(shù)據(jù)
M.Get_cities([3201,?4403])
#?創(chuàng)建繪制地圖對(duì)象
D?=?Map.Draw_Map()
#?南京地圖(默認(rèn)樣式)
D.Draw_city('3201',?img_path='nanjing_city.jpg')
#?深圳地圖(自定義樣式)
D.Draw_city('深圳',?FC=True,?LC='w',?arg={'other':?True,?'city_pos':?True,?'city_name':?True},
?????????????????????img_path='shenzhen.jpg')
得到結(jié)果如下。


此處code為地級(jí)市的四位編碼。

import?Map_of_China?as?Map
#?創(chuàng)建獲取地圖數(shù)據(jù)對(duì)象
M?=?Map.Get_Map()
#?創(chuàng)建繪制地圖對(duì)象
D?=?Map.Draw_Map()
#?文件路徑
src?=?'Example/GDP-2018.csv'
#?按數(shù)據(jù)的相對(duì)大小(排名)顯示
D.Show_data(src,?by_val=False,?arg={'default_color':?[0.6,?0.6,?0.6],?'sea':?False},
?????????????????????img_path='gdp.jpg',?title='2018年各省市GDP')
得到結(jié)果如下。

CSV文件具體內(nèi)容格式如下。

第一列為區(qū)域名稱或者編碼,第二列為數(shù)值。
數(shù)據(jù)處理模塊在Map_of_China.py文件中。

參數(shù)by_val,絕對(duì)大小和相對(duì)大小,通常應(yīng)該都會(huì)選擇絕對(duì)大小這種方式展示的。
就是作者的這個(gè)熱力圖,是沒(méi)有圖例的,等待更新~
#?省級(jí)數(shù)據(jù)
D.Show_data('Example/江蘇人口2018.txt',?'32',?by_val=True,?title='江蘇人口2018',
????????????img_path='jiangsu_2018_1.jpg')
#?配置地圖中的樣式
D.Show_data('Example/江蘇人口2018.txt',?'32',?by_val=True,?LC='w',?title='江蘇人口2018',
????????????arg={'city_name':?True,?'city_pos':?True,?'other':?True},
????????????img_path='jiangsu_2018_2.jpg')
TXT格式的數(shù)據(jù)也能使用。



06. 繪制氣泡圖
#?氣泡圖
D.Bubble(src='Example/GDP-2018.csv',?title='2018年各省市GDP',?img_path='GDP_bubble.png')
得到結(jié)果如下。

氣泡顏色默認(rèn)為黃色,可自定義參數(shù)。

發(fā)現(xiàn)和Pyecharts好像,相信在修改地圖配色、文本字體及位置后,地圖會(huì)變得更好看!
不過(guò)限于時(shí)間,下期小F再來(lái)說(shuō)一說(shuō)~

還有幾個(gè)功能,坐等大佬更新~
相關(guān)代碼及文件我已上傳公眾號(hào),回復(fù)「地圖」即可獲取。
如此就不需要你自己注冊(cè)賬號(hào),直接就能使用。
萬(wàn)水千山總是情,點(diǎn)個(gè)? ?? 行不行。
-END-
掃碼添加早小起,進(jìn)入Python技術(shù)交流群
