Python實(shí)現(xiàn)地圖可視化案例詳解
?前言
Python的地圖可視化庫(kù)很多,Matplotlib庫(kù)雖然作圖很強(qiáng)大,但只能做靜態(tài)地圖。而我今天要講的是交互式地圖庫(kù),分別為pyecharts、folium,掌握這兩個(gè)庫(kù),基本可以解決你的地圖可視化需求。
一、pyecharts
首先,必須說(shuō)說(shuō)強(qiáng)大的pyecharts庫(kù),簡(jiǎn)單易用又酷炫,幾乎可以制作任何圖表。pyecharts有v0.5和v1兩個(gè)版本,兩者不兼容,最新的v1版本開(kāi)始支持鏈?zhǔn)秸{(diào)用,采用options配置圖表。pyecharts在制作地圖方面,包含Map、Geo和Bmap三類,使用Map類支持世界、國(guó)家、省市和區(qū)縣四級(jí)地圖,使用前需獨(dú)立安裝。so,pip它們!
pip install pyecharts pip install echarts-countries-pypkg pip install echarts-china-provinces-pypkg pip install echarts-china-cities-pypkg pip install echarts-china-counties-pypkg
pip完之后,查看下pyecharts版本。
import pyecharts print(pyecharts.__version__)
毋庸置疑,肯定是最新版本啦,版本號(hào)為1.6.2。
Map
在制作地圖前,首先要有數(shù)據(jù),我從Wind數(shù)據(jù)庫(kù)導(dǎo)出了全國(guó)各省GDP總量數(shù)據(jù),命名為GDP.xlsx,如下圖所示。

有了數(shù)據(jù),咱們就可以用python開(kāi)始操作了,先把需要的庫(kù)import一下。
import pandas as pd #pandas是強(qiáng)大的數(shù)據(jù)處理庫(kù) from pyecharts.charts import Map from pyecharts import options as opts
用pandas讀取GDP.xlsx,提取2019年各省GDP數(shù)據(jù)為例,我們來(lái)制作地圖。這里注意下zip() 函數(shù),它用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象。
data = pd.read_excel('GDP.xlsx')
province = list(data["province"])
gdp = list(data["2019_gdp"])
list = [list(z) for z in zip(province,gdp)]我們來(lái)打印下list,長(zhǎng)這樣:

其實(shí)就是列表里嵌套列表的數(shù)據(jù)結(jié)構(gòu),只有這種結(jié)構(gòu)把數(shù)據(jù)添加到地圖中去。我們用Map類中的常用方法add、set_global_opts和render來(lái)配置地圖。
c = (
Map(init_opts=opts.InitOpts(width="1000px", height="600px")) #初始化地圖大小
.set_global_opts(
title_opts=opts.TitleOpts(title="2019年各省GDP分布圖 單位:億元"), #配置標(biāo)題
visualmap_opts=opts.VisualMapOpts(
type_ = "scatter" #散點(diǎn)類型
)
)
.add("GDP",list,maptype="china") #將list傳入,地圖類型為中國(guó)地圖
.render("Map1.html")
)運(yùn)行以上代碼,用瀏覽器打開(kāi)生成的Map1.html,效果如下:

有朋友可能會(huì)問(wèn)了,地圖倒是有了,可你這地圖不好區(qū)分不同省的GDP大小呀。不慌,我們繼續(xù)優(yōu)化以上代碼,給不同省依據(jù)GDP的大小配置不同的顏色,讓你一目了然。
c = (
Map(init_opts=opts.InitOpts(width="1000px", height="600px")) #可切換主題
.set_global_opts(
title_opts=opts.TitleOpts(title="2019年各省GDP分布圖 單位:億元"),
visualmap_opts=opts.VisualMapOpts(
min_=1000,
max_=110000,
range_text = ['GDP總量(億)顏色區(qū)間:', ''], #分區(qū)間
is_piecewise=True, #定義圖例為分段型,默認(rèn)為連續(xù)的圖例
pos_top= "middle", #分段位置
pos_left="left",
orient="vertical",
split_number=10 #分成10個(gè)區(qū)間
)
)
.add("GDP",list,maptype="china")
.render("Map2.html")
)運(yùn)行以上代碼,用瀏覽器打開(kāi)生成的Map2.html,效果如下:

怎么樣,這下效果是不是好多了,顏色越紅代表GDP越高。你所在的省份2019年GDP處于哪個(gè)顏色段呢?當(dāng)然,對(duì)于有些審美較高的朋友可能還是無(wú)法滿足你的要求。
既然如此,那我再優(yōu)化下代碼,給地圖添加主題。添加主題很簡(jiǎn)單,只要import下ThemeType,然后將主題添加到Mpa()方法內(nèi)。我以ThemeType.DARK為例看下效果。
from pyecharts.globals import ThemeType #引入主題 Map(init_opts=opts.InitOpts(width="1000px", height="600px",theme = ThemeType.DARK)) #添加主題ThemeType.DARK
運(yùn)行一下看看效果:

有沒(méi)有B格上升n個(gè)level的感覺(jué),如果你還不滿意,ok,pyecharts內(nèi)置了10余種主題任你切換。蘿卜青菜各有所愛(ài),自個(gè)調(diào)去吧~

Geo
Geo與Map類似,可以通過(guò)設(shè)置maptype參數(shù)選擇地圖類型,所支持的方法也和Map類似,我這里就不贅述了,直接貼代碼。
#Geo地圖-漣漪圖
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType
data = pd.read_excel('GDP.xlsx')
province = list(data["province"])
gdp = list(data["2019_gdp"])
list = [list(z) for z in zip(province,gdp)]
print(list)
c = (
Geo()
.add_schema(maptype="china")
.add(
"geo",
list, #傳入數(shù)據(jù)
symbol_size=10, large_threshold=110000, #設(shè)置漣漪大小
type_=ChartType.EFFECT_SCATTER, #地圖類型為漣漪圖
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=110000),title_opts=opts.TitleOpts(title="2019年各省GDP漣漪圖"))
.render("Geomap1.html")
)運(yùn)行一下,效果如下:

Bmap
Bmap是百度地圖的一個(gè)接口,你如果Map和Geo搞明白了,Bmap也是分分鐘可以搞定的。不過(guò),有一點(diǎn)要注意,你要先到百度地圖開(kāi)放平臺(tái)注冊(cè),獲取AK才可以調(diào)用哦。注冊(cè)地址:https://lbsyun.baidu.com/index.php注冊(cè)獲得AK,就可以開(kāi)心制作地圖啦,以熱力圖為例,代碼如下。
#Bmap-散點(diǎn)圖、熱力圖和漣漪圖
import pandas as pd
from pyecharts.charts import BMap
from pyecharts import options as opts
from pyecharts.globals import ChartType
data = pd.read_excel('GDP.xlsx')
province = list(data["province"])
gdp = list(data["2019_gdp"])
list = [list(z) for z in zip(province,gdp)]
print(list)
c = (
BMap(init_opts=opts.InitOpts(width="1000px", height="600px"))
.add_schema(baidu_ak="你的AK", center=[120.13066322374, 30.240018034923])
.add(
"GDP",
list,
type_="heatmap", #scatter為散點(diǎn)圖,heatmap為熱力圖,ChartType.EFFECT_SCATTER為漣漪圖
label_opts=opts.LabelOpts(formatter="")
)
.set_global_opts(
title_opts=opts.TitleOpts(title="2019年各省GDP熱力圖"), visualmap_opts=opts.VisualMapOpts(max_=110000)
)
.render("Bmap1.html")
)運(yùn)行后,長(zhǎng)這樣:

二、folium
你以為以上幾個(gè)地圖就能滿足我查理對(duì)數(shù)據(jù)可視化美感的追求,那你太小看查理了,我經(jīng)過(guò)研究,發(fā)現(xiàn)folium庫(kù)才是吊炸天的存在。
首先,我用python調(diào)取了高德地圖API接口,獲得了廣州市近6000個(gè)景點(diǎn)的地理數(shù)據(jù),保存為poi_scenic_spot.csv。以下為部分?jǐn)?shù)據(jù):

然后安裝folium庫(kù),設(shè)置刺激戰(zhàn)場(chǎng)底圖,當(dāng)然你也可以換其他底圖玩,代碼中提供了mapbox底圖、高德底圖等,任你隨意切換。
#folium-熱力圖
import pandas as pd
import folium
from folium import plugins
data = pd.read_csv('./poi_scenic_spot.csv',encoding='utf-8')
# heatmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True) # 繪制地圖,確定聚焦點(diǎn),默認(rèn)底圖(加載慢)
heatmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='stamen Terrain') #刺激戰(zhàn)場(chǎng)底圖
# heatmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='Mapbox Bright') #mapbox底圖
# heatmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='stamentoner') #黑白底圖
# heatmap1 = folium.Map( #高德底圖
# location=[23.122373,113.268027],
# zoom_start=15,
# control_scale = True,
# tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
# attr='© <a rel="external nofollow" >高德地圖</a>'
# )
folium.Marker([23.122373,113.268027],popup='<i>查理</i>',icon=folium.Icon(icon='cloud',color='green')).add_to(heatmap1) #創(chuàng)建中心標(biāo)記
heatmap1.add_child(plugins.HeatMap([[row["lat"],row["lon"]] for name, row in data.iterrows()])) #傳入經(jīng)緯度
heatmap1.save("folium_map1.html") #生成網(wǎng)頁(yè)迫不及待運(yùn)行了下,效果如下:

哈哈哈哈,好大一只紅燒雞。
熱力圖有點(diǎn)中看不中用啊,看這圖我也很難搞清楚廣州的景點(diǎn)分布情況。那咱換個(gè)別的圖試試。
#folium-聚合散點(diǎn)地圖
import pandas as pd
import folium
from folium import plugins
data = pd.read_csv('./poi_scenic_spot.csv',encoding='utf-8')
plotmap1 = folium.Map(location=[23.122373,113.268027], zoom_start=10,control_scale = True,tiles='stamentoner')
folium.Marker([23.122373,113.268027],popup='<p style="color: green">我是J哥</p>',icon=folium.Icon(icon='cloud',color='green')).add_to(plotmap1) #創(chuàng)建中心標(biāo)記
plotmap1.add_child(plugins.MarkerCluster([[row["lat"],row["lon"]] for name, row in data.iterrows()]))
plotmap1.save('folium_map2.html')看效果!

你就說(shuō)酷不酷,炫不炫?
結(jié) 語(yǔ)
查理自認(rèn)為以上歸納還算完整,當(dāng)然,python的地圖庫(kù)還有很多,值得進(jìn)一步挖掘。
到此這篇關(guān)于Python實(shí)現(xiàn)地圖可視化案例詳解的文章就介紹到這了,更多相關(guān)Python地圖可視化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學(xué)習(xí)率設(shè)置的操作
這篇文章主要介紹了pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學(xué)習(xí)率設(shè)置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
通過(guò)Jython調(diào)用Python腳本的實(shí)現(xiàn)方法
Jython 是 Python 的純 Java 實(shí)現(xiàn)。她無(wú)縫地結(jié)合了 Java 類與 Python,使用戶能以 Python 語(yǔ)言的語(yǔ)法編寫(xiě)在 Java 虛擬機(jī)上運(yùn)行的 軟件,本文重點(diǎn)給大家介紹通過(guò)Jython調(diào)用Python腳本的實(shí)現(xiàn)方法,一起看看吧2021-06-06
python爬蟲(chóng)進(jìn)階之協(xié)程詳解
這篇文章主要介紹了python爬蟲(chóng)進(jìn)階之協(xié)程詳解,coroutine中文翻譯叫協(xié)程,在 Python 中昌指代為協(xié)程對(duì)象類型,可以將協(xié)程對(duì)象注冊(cè)到時(shí)間循環(huán)中被調(diào)用,需要的朋友可以參考下2023-08-08
FFT快速傅里葉變換的python實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了FFT快速傅里葉變換的python實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Python3實(shí)現(xiàn)二叉樹(shù)的最大深度
這篇文章主要介紹了Python3實(shí)現(xiàn)二叉樹(shù)的最大深度, 文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python實(shí)現(xiàn)爬取天氣數(shù)據(jù)并可視化分析
這篇文章主要和大家分享一個(gè)用Python實(shí)現(xiàn)的小功能:獲取天氣數(shù)據(jù),進(jìn)行可視化分析,帶你直觀了解天氣情況!感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02
python實(shí)現(xiàn)Dijkstra算法的最短路徑問(wèn)題
這篇文章主要介紹了python實(shí)現(xiàn)Dijkstra算法的最短路徑問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

