干貨 | 使用pyecharts繪制交互式動態(tài)地圖


干貨 | 使用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中渲染顯示圖表
set_global_opts()配置區(qū)域

另外,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()
動態(tài)圖表
利用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()
image.png
使用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í)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容