Python實現(xiàn)地圖可視化案例詳解
?前言
Python的地圖可視化庫很多,Matplotlib庫雖然作圖很強(qiáng)大,但只能做靜態(tài)地圖。而我今天要講的是交互式地圖庫,分別為pyecharts、folium,掌握這兩個庫,基本可以解決你的地圖可視化需求。
一、pyecharts
首先,必須說說強(qiáng)大的pyecharts庫,簡單易用又酷炫,幾乎可以制作任何圖表。pyecharts有v0.5和v1兩個版本,兩者不兼容,最新的v1版本開始支持鏈?zhǔn)秸{(diào)用,采用options配置圖表。pyecharts在制作地圖方面,包含Map、Geo和Bmap三類,使用Map類支持世界、國家、省市和區(qū)縣四級地圖,使用前需獨(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__)
毋庸置疑,肯定是最新版本啦,版本號為1.6.2。
Map
在制作地圖前,首先要有數(shù)據(jù),我從Wind數(shù)據(jù)庫導(dǎo)出了全國各省GDP總量數(shù)據(jù),命名為GDP.xlsx,如下圖所示。
有了數(shù)據(jù),咱們就可以用python開始操作了,先把需要的庫import一下。
import pandas as pd #pandas是強(qiáng)大的數(shù)據(jù)處理庫 from pyecharts.charts import Map from pyecharts import options as opts
用pandas讀取GDP.xlsx,提取2019年各省GDP數(shù)據(jù)為例,我們來制作地圖。這里注意下zip() 函數(shù),它用于將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的對象。
data = pd.read_excel('GDP.xlsx') province = list(data["province"]) gdp = list(data["2019_gdp"]) list = [list(z) for z in zip(province,gdp)]
我們來打印下list,長這樣:
其實就是列表里嵌套列表的數(shù)據(jù)結(jié)構(gòu),只有這種結(jié)構(gòu)把數(shù)據(jù)添加到地圖中去。我們用Map類中的常用方法add、set_global_opts和render來配置地圖。
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傳入,地圖類型為中國地圖 .render("Map1.html") )
運(yùn)行以上代碼,用瀏覽器打開生成的Map1.html,效果如下:
有朋友可能會問了,地圖倒是有了,可你這地圖不好區(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個區(qū)間 ) ) .add("GDP",list,maptype="china") .render("Map2.html") )
運(yùn)行以上代碼,用瀏覽器打開生成的Map2.html,效果如下:
怎么樣,這下效果是不是好多了,顏色越紅代表GDP越高。你所在的省份2019年GDP處于哪個顏色段呢?當(dāng)然,對于有些審美較高的朋友可能還是無法滿足你的要求。
既然如此,那我再優(yōu)化下代碼,給地圖添加主題。添加主題很簡單,只要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)行一下看看效果:
有沒有B格上升n個level的感覺,如果你還不滿意,ok,pyecharts內(nèi)置了10余種主題任你切換。蘿卜青菜各有所愛,自個調(diào)去吧~
Geo
Geo與Map類似,可以通過設(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是百度地圖的一個接口,你如果Map和Geo搞明白了,Bmap也是分分鐘可以搞定的。不過,有一點(diǎn)要注意,你要先到百度地圖開放平臺注冊,獲取AK才可以調(diào)用哦。注冊地址:https://lbsyun.baidu.com/index.php注冊獲得AK,就可以開心制作地圖啦,以熱力圖為例,代碼如下。
#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)行后,長這樣:
二、folium
你以為以上幾個地圖就能滿足我查理對數(shù)據(jù)可視化美感的追求,那你太小看查理了,我經(jīng)過研究,發(fā)現(xiàn)folium庫才是吊炸天的存在。
首先,我用python調(diào)取了高德地圖API接口,獲得了廣州市近6000個景點(diǎn)的地理數(shù)據(jù),保存為poi_scenic_spot.csv。以下為部分?jǐn)?shù)據(jù):
然后安裝folium庫,設(shè)置刺激戰(zhàn)場底圖,當(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)場底圖 # 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ùn)行了下,效果如下:
哈哈哈哈,好大一只紅燒雞。
熱力圖有點(diǎn)中看不中用啊,看這圖我也很難搞清楚廣州的景點(diǎn)分布情況。那咱換個別的圖試試。
#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')
看效果!
你就說酷不酷,炫不炫?
結(jié) 語
查理自認(rèn)為以上歸納還算完整,當(dāng)然,python的地圖庫還有很多,值得進(jìn)一步挖掘。
到此這篇關(guān)于Python實現(xiàn)地圖可視化案例詳解的文章就介紹到這了,更多相關(guān)Python地圖可視化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學(xué)習(xí)率設(shè)置的操作
這篇文章主要介紹了pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學(xué)習(xí)率設(shè)置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05通過Jython調(diào)用Python腳本的實現(xiàn)方法
Jython 是 Python 的純 Java 實現(xiàn)。她無縫地結(jié)合了 Java 類與 Python,使用戶能以 Python 語言的語法編寫在 Java 虛擬機(jī)上運(yùn)行的 軟件,本文重點(diǎn)給大家介紹通過Jython調(diào)用Python腳本的實現(xiàn)方法,一起看看吧2021-06-06Python實現(xiàn)爬取天氣數(shù)據(jù)并可視化分析
這篇文章主要和大家分享一個用Python實現(xiàn)的小功能:獲取天氣數(shù)據(jù),進(jìn)行可視化分析,帶你直觀了解天氣情況!感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02python實現(xiàn)Dijkstra算法的最短路徑問題
這篇文章主要介紹了python實現(xiàn)Dijkstra算法的最短路徑問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06