干貨 | 使用pyecharts繪制交互式動態(tài)地圖
說到pyecharts,相信很多人不會陌生,一個(gè)優(yōu)秀的python可視化包。
pyecharts是中國人開發(fā)的,相比較matplotlib、seaborn等老牌可視化庫,pyecharts是十分符合國內(nèi)用戶習(xí)慣的,尤其在地理空間圖表方面。
本文是想試探一下pyecharts在繪制地理圖表方面的功底如何,那就開始吧!
安裝pyecharts
pyecharts支持pip、conda安裝,快捷方便,推薦在jupyter notebook環(huán)境下愉快的玩耍。
pip install pyecharts
本文python版本為3.6,演示環(huán)境為jupyter notebook。
pyecharts地理圖表可視化
1、導(dǎo)入相關(guān)模塊
pyecharts庫中負(fù)責(zé)地理坐標(biāo)系的模塊是Geo,負(fù)責(zé)地圖的模塊是Map,負(fù)責(zé)百度地圖的模塊是BMap,負(fù)責(zé)圖表配置的模塊是options。在 pyecharts 中,圖表的一切皆通過 options來修飾調(diào)整。
另提一句,因?yàn)樾枰玫桨咐龜?shù)據(jù),這里還需要導(dǎo)入樣本庫-sample
from example.commons import Faker
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ChartType, SymbolType
2、圖表輸出和顯示
在pyecharts中,圖表完成制作后通過render()函數(shù)輸出為html文件,你可以在render()中傳遞輸出地址參數(shù),將html文件保存到自定義的位置。
c = (
Geo()
.add_schema(maptype="china")
.add("geo", [list(z) for z in zip(Faker.provinces, Faker.values())])
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(),
title_opts=opts.TitleOpts(title="Geo-基本示例"),
)
)
c.render()# 輸出html格式
如果想在notebook中直接展示圖表,需要調(diào)用render_notebook()函數(shù)。
c.render_notebook()# 顯示地圖

Goe模塊常用函數(shù)介紹
再來看前面的中國地圖示例實(shí)現(xiàn)代碼:
c = (
Geo()
.add_schema(maptype="china")
.add("geo", [list(z) for z in zip(Faker.provinces, Faker.values())])
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(),
title_opts=opts.TitleOpts(title="Geo-基本示例"),
)
)
c.render_notebook()# 顯示地圖
大家可能會覺得這這代碼怎么看起來怪怪的,Geo()模塊后面連著很多函數(shù),這其實(shí)是python的鏈?zhǔn)秸{(diào)用,使代碼更加簡潔。
pyecharts所有方法都支持鏈?zhǔn)秸{(diào)用,當(dāng)然如果你喜歡單獨(dú)調(diào)用也可以的,像這樣:
geo = Geo()
geo.add_schema(maptype="china")
geo.add("geo", [list(z) for z in zip(Faker.provinces, Faker.values())])
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(),title_opts=opts.TitleOpts(title="Geo-基本示例"))
geo .render_notebook()# 顯示地圖
這兩種方法效果一樣,本文使用pyecharts推薦的鏈?zhǔn)秸{(diào)用方法。
可以清晰地看到,示例中Geo()模塊調(diào)用了五個(gè)功能函數(shù):
-
add_schema():控制地圖類型、視角中心點(diǎn)等 -
add():添加圖表名稱、傳入數(shù)據(jù)集、選擇geo圖類型、調(diào)整圖例等 -
set_series_opts():系列配置項(xiàng),可配置圖元樣式、文字樣式、標(biāo)簽樣式、點(diǎn)線樣式等 -
set_global_opts(): 全局配置項(xiàng),可配置標(biāo)題、動畫、坐標(biāo)軸、圖例等 -
render_notebook(): 在notebook中渲染顯示圖表

另外,Geo()模塊還有幾個(gè)功能函數(shù):
-
add_coordinate(): 新增一個(gè)坐標(biāo)點(diǎn) -
add_coordinate_json():以json形式新增多個(gè)坐標(biāo)點(diǎn) -
get_coordinate():根據(jù)地點(diǎn)查詢對應(yīng)坐標(biāo)
利用Geo繪制地理坐標(biāo)圖表
1、基本圖表
采用全國地圖,對各省的xx數(shù)據(jù)做分布展示,數(shù)據(jù)展示形式為圓點(diǎn)
c = (
Geo()
.add_schema(maptype="china")
.add("geo", [list(z) for z in zip(['江蘇','浙江','湖北','湖南','河南'], [22,34,27,53,42])])
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(),
title_opts=opts.TitleOpts(title="全國各省xx數(shù)據(jù)分布"),
)
)
c.render_notebook()

你可以更換數(shù)據(jù)展現(xiàn)形式,比如用熱力圖表示,只需在add()函數(shù)中添加參數(shù):type_=ChartType.HEATMAP

以北京作為底圖,展示北京市各區(qū)縣xx數(shù)據(jù)的分布。將函數(shù)add_schema(maptype="china")的maptype="china"修改為maptype="北京"。
c = (
Geo()
.add_schema(maptype="北京")
.add(
"geo",
[list(z) for z in zip(['大興區(qū)','房山區(qū)','海淀區(qū)','朝陽區(qū)','東城區(qū)'], [150,100,300,200,500])],
type_=ChartType.EFFECT_SCATTER,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(),
title_opts=opts.TitleOpts(title="Geo-HeatMap"),
)
)
c.render_notebook()

你可以修改地圖的背景色,在函數(shù)add_schema()中添加參數(shù)itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"),顏色和邊緣顏色可設(shè)任意色值。
c = (
Geo()
.add_schema(maptype="北京",
itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"))
.add(
"geo",
[list(z) for z in zip(['大興區(qū)','房山區(qū)','海淀區(qū)','朝陽區(qū)','東城區(qū)'], [1500,10,300,20,5])],
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(),
title_opts=opts.TitleOpts(title="北京市各區(qū)縣xx數(shù)據(jù)分布"),
)
)
c.render_notebook()

2、動態(tài)展示
pyecharts可以生成地理空間流動圖,用來表示航班數(shù)量、人口流動等等。
下面以全國主要城市航班流動圖為例(虛擬數(shù)據(jù)):
c = (
Geo()
.add_schema(maptype="china")
.add(
"",
[("深圳", 120), ("哈爾濱", 66), ("杭州", 77), ("重慶", 88), ("上海", 100), ("烏魯木齊", 30),("北京", 30),("武漢",70)],
type_=ChartType.EFFECT_SCATTER,
color="green",
)
.add(
"geo",
[("北京", "上海"), ("武漢", "深圳"),("重慶", "杭州"),("哈爾濱", "重慶"),("烏魯木齊", "哈爾濱"),("深圳", "烏魯木齊"),("武漢", "北京")],
type_=ChartType.LINES,
effect_opts=opts.EffectOpts(
symbol=SymbolType.ARROW, symbol_size=6, color="blue"
),
linestyle_opts=opts.LineStyleOpts(curve=0.2),
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="全國主要城市航班路線和數(shù)量"))
)
c.render_notebook()

利用Map模塊繪制地圖
Map模塊的使用方法和Geo類似,數(shù)據(jù)展現(xiàn)在地圖上,首先導(dǎo)入相關(guān)庫:
from example.commons import Faker
from pyecharts import options as opts
from pyecharts.charts import Map
中國地圖:
c = (
Map()
.add("商家A", [list(z) for z in zip(['江蘇','浙江','湖北','湖南','河南'], [22,100,27,53,42])], "china")
.set_global_opts(title_opts=opts.TitleOpts(title="Map-基本示例"),
visualmap_opts=opts.VisualMapOpts(max_=200))
)
c.render_notebook()

世界地圖:
c = (
Map()
.add("商家A", [list(z) for z in zip(['China','Canada','Brazil','United States','Russia'], [22,100,27,53,42])], "world")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-世界地圖"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
)
c.render_notebook()

上海地圖:
c = (
Map()
.add("商家A", [list(z) for z in zip(['嘉定區(qū)','松江區(qū)','寶山區(qū)','浦東新區(qū)','奉賢區(qū)'], [22,100,27,53,42])], "上海")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="Map-世界地圖"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
)
c.render_notebook()

使用BMap百度地圖
pyecharts支持開發(fā)者使用百度地圖,當(dāng)然需要申請開發(fā)者AK碼才能調(diào)用API。
AK碼申請地址:http://lbsyun.baidu.com/apiconsole/key?application=key
from pyecharts.charts import BMap
c = (
BMap()
.add_schema(
baidu_ak="BAIDU_AK",
center=[120.13066322374, 30.240018034923],
)
.add(
"bmap",
[list(z) for z in zip(Faker.provinces, Faker.values())],
label_opts=opts.LabelOpts(formatter=""),
)
.set_global_opts(title_opts=opts.TitleOpts(title="BMap-基本示例"))
)
c.render_notebook()

你可以更改地圖風(fēng)格:
c = (
BMap()
.add_schema(
baidu_ak="mcH6sBNaAfsbkSndFI5zO90j9wUpRMFy",
center=[120.13066322374, 30.240018034923],
map_style=your_owner_map_style
)
.add(
"bmap",
[list(z) for z in zip(Faker.provinces, Faker.values())],
label_opts=opts.LabelOpts(formatter=""),
)
.set_global_opts(title_opts=opts.TitleOpts(title="BMap-基本示例"))
)
c.render_notebook()

總結(jié)
本文主要講解了pyecharts的三大地理圖表模塊:Geo、Map、BMap,這三者分別繪制地理坐標(biāo)系、地圖、百度地圖。Geo舉的案例較豐富,Map和BMap的很多功能沒有細(xì)說,大家有興趣可以去pyecharts官網(wǎng)學(xué)習(xí)。
