Python實現(xiàn)地圖可視化案例詳解
?前言
Python的地圖可視化庫很多,Matplotlib庫雖然作圖很強大,但只能做靜態(tài)地圖。而我今天要講的是交互式地圖庫,分別為pyecharts、folium,掌握這兩個庫,基本可以解決你的地圖可視化需求。
一、pyecharts
首先,必須說說強大的pyecharts庫,簡單易用又酷炫,幾乎可以制作任何圖表。pyecharts有v0.5和v1兩個版本,兩者不兼容,最新的v1版本開始支持鏈式調(diào)用,采用options配置圖表。pyecharts在制作地圖方面,包含Map、Geo和Bmap三類,使用Map類支持世界、國家、省市和區(qū)縣四級地圖,使用前需獨立安裝。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ù)庫導出了全國各省GDP總量數(shù)據(jù),命名為GDP.xlsx,如下圖所示。

有了數(shù)據(jù),咱們就可以用python開始操作了,先把需要的庫import一下。
import pandas as pd #pandas是強大的數(shù)據(jù)處理庫 from pyecharts.charts import Map from pyecharts import options as opts
用pandas讀取GDP.xlsx,提取2019年各省GDP數(shù)據(jù)為例,我們來制作地圖。這里注意下zip() 函數(shù),它用于將可迭代的對象作為參數(shù),將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的對象。
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分布圖 單位:億元"), #配置標題
visualmap_opts=opts.VisualMapOpts(
type_ = "scatter" #散點類型
)
)
.add("GDP",list,maptype="china") #將list傳入,地圖類型為中國地圖
.render("Map1.html")
)運行以上代碼,用瀏覽器打開生成的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, #定義圖例為分段型,默認為連續(xù)的圖例
pos_top= "middle", #分段位置
pos_left="left",
orient="vertical",
split_number=10 #分成10個區(qū)間
)
)
.add("GDP",list,maptype="china")
.render("Map2.html")
)運行以上代碼,用瀏覽器打開生成的Map2.html,效果如下:

怎么樣,這下效果是不是好多了,顏色越紅代表GDP越高。你所在的省份2019年GDP處于哪個顏色段呢?當然,對于有些審美較高的朋友可能還是無法滿足你的要求。
既然如此,那我再優(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
運行一下看看效果:

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

Geo
Geo與Map類似,可以通過設置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, #設置漣漪大小
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")
)運行一下,效果如下:

Bmap
Bmap是百度地圖的一個接口,你如果Map和Geo搞明白了,Bmap也是分分鐘可以搞定的。不過,有一點要注意,你要先到百度地圖開放平臺注冊,獲取AK才可以調(diào)用哦。注冊地址:https://lbsyun.baidu.com/index.php注冊獲得AK,就可以開心制作地圖啦,以熱力圖為例,代碼如下。
#Bmap-散點圖、熱力圖和漣漪圖
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為散點圖,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")
)運行后,長這樣:

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

然后安裝folium庫,設置刺激戰(zhàn)場底圖,當然你也可以換其他底圖玩,代碼中提供了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) # 繪制地圖,確定聚焦點,默認底圖(加載慢)
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)建中心標記
heatmap1.add_child(plugins.HeatMap([[row["lat"],row["lon"]] for name, row in data.iterrows()])) #傳入經(jīng)緯度
heatmap1.save("folium_map1.html") #生成網(wǎng)頁迫不及待運行了下,效果如下:

哈哈哈哈,好大一只紅燒雞。
熱力圖有點中看不中用啊,看這圖我也很難搞清楚廣州的景點分布情況。那咱換個別的圖試試。
#folium-聚合散點地圖
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)建中心標記
plotmap1.add_child(plugins.MarkerCluster([[row["lat"],row["lon"]] for name, row in data.iterrows()]))
plotmap1.save('folium_map2.html')看效果!

你就說酷不酷,炫不炫?
結(jié) 語
查理自認為以上歸納還算完整,當然,python的地圖庫還有很多,值得進一步挖掘。
到此這篇關(guān)于Python實現(xiàn)地圖可視化案例詳解的文章就介紹到這了,更多相關(guān)Python地圖可視化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學習率設置的操作
這篇文章主要介紹了pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學習率設置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
通過Jython調(diào)用Python腳本的實現(xiàn)方法
Jython 是 Python 的純 Java 實現(xiàn)。她無縫地結(jié)合了 Java 類與 Python,使用戶能以 Python 語言的語法編寫在 Java 虛擬機上運行的 軟件,本文重點給大家介紹通過Jython調(diào)用Python腳本的實現(xiàn)方法,一起看看吧2021-06-06
Python實現(xiàn)爬取天氣數(shù)據(jù)并可視化分析
這篇文章主要和大家分享一個用Python實現(xiàn)的小功能:獲取天氣數(shù)據(jù),進行可視化分析,帶你直觀了解天氣情況!感興趣的小伙伴可以學習一下2022-02-02
python實現(xiàn)Dijkstra算法的最短路徑問題
這篇文章主要介紹了python實現(xiàn)Dijkstra算法的最短路徑問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06

