天天看點

Python可視化展示各地交通擁堵情況

Crossin的程式設計教室 1月7日

以下文章來源于Python幹貨鋪子 ,作者不正經的kimol君

Python可視化展示各地交通擁堵情況

Python幹貨鋪子

Python學習和幹貨分享、爬蟲、機器學習、深度學習、地理資料處理與空間可視化、NCL科研繪圖、Matlab學習、ArcGIS空間可視化。隻有您想不到的,沒有本鋪子做不到的,還不關注一波嘛?

Python可視化展示各地交通擁堵情況

前言

大家好,歡迎來到Crossin的程式設計教室!

就在今天,我感受到了來自堵車的深深惡意。沒有錯!我今天被堵在路上近乎3個小時,美好的約會就這樣化為泡影了。

Python可視化展示各地交通擁堵情況
我倒還真想看看這路到底能有多堵。于是,我爬取了各城市的擁堵資料,并将它們可視化:
Python可視化展示各地交通擁堵情況

特别說明:由于資料具有實時性,畫圖時已經過了高峰期,于是圖上一片綠油油也并不奇怪。

接下來請聽我慢慢分解(ps.涉及到爬蟲、pyecharts、flask等)

一、爬取擁堵指數

某度智慧交通提供了各個城市的擁堵指數的資料,我們隻需要通過幾行代碼便可輕松抓取:

# 擷取各城市的擁堵指數
url = 'https://jiaotong.baidu.com/trafficindex/city/list' # 接口api
res = requests.get(url)
data = res.json()
           

其中,url為擷取資料的接口位址,通過簡單的抓包分析便能知道。而data為傳回後的資料,它包括很多字段,但是我們隻需要提取其中的城市名和擁堵指數即可:

# 提取資料
citys = [i['cityname'] for i in data['data']['list']] # 提取城市
indexs = [float(i['index']) for i in data['data']['list']] # 提取對應的指數
           

有了資料,接下來我們就可以将其可視化展示出來。

二、資料可視化

利用可視化神器pyecharts庫繪制地圖,并将城市以及對應的擁堵指數表示出來。其安裝如下:

pip install pyecharts
           

部分版本需要再安裝額外的地圖庫,方法如下:

pip install echarts-countries-pypkg
pip install echarts-cities-pypkg
pip install echarts-china-provinces-pypkg 
pip install echarts-china-cities-pypkg
           

首先定義地圖:

geo = Geo()
geo.add_schema(maptype = 'china') # 加入中國地圖
           

添加資料并進行相關設定:

geo.add('各城市擁堵指數', zip(citys,indexs), type_ = 'effectScatter') # 設定地圖類型及資料
geo.set_series_opts(label_opts = opts.LabelOpts(is_show = False))  #設定是否顯示标簽
           

根據擁堵指數的大小進行分類,分别為暢通、緩行、擁堵、嚴重擁堵:

geo.set_global_opts(visualmap_opts = opts.VisualMapOpts(
                    #max_ = 2.5, # 用于連續表示
                    is_piecewise = True, # 是否分段
                    pieces = [{'min':1.0,'max':1.5,'label':'暢通','color':'#16CE95'},
                              {'min':1.5,'max':1.8,'label':'緩行','color':'#F79D06'},
                              {'min':1.8,'max':2.0,'label':'擁堵','color':'#D80304'},
                              {'min':2.0,'max':2.5,'label':'嚴重擁堵','color':'#8F0921'}])) # 設定圖例顯示
           

最後将地圖儲存在本地:

geo.render(path='各城市擁堵指數.html')
           

到這裡,我們就得到了文章一開始看到的那張圖~ 然而,由于擁堵資料是實時變化的,如果我每次都要去運作一次代碼豈不是很麻煩?很顯然,機智如我是不會這麼做的,咱接着往下看。

三、搭建展示網站

為了更加友善地将各城市擁堵情況展示出來,我決定搭建一個用于展示的網站。方法可以是各式各樣的,在這裡我選擇了利用flask架構,簡單快捷~

我的完整代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Nov 15 01:34:36 2020

@author: kimol_love
"""
import requests
from pyecharts.charts import Geo
from pyecharts import options as opts
from flask import Flask, render_template

def get_data():
    '''
    擷取擁堵指數
    '''
    # 擷取各城市的擁堵指數
    url = 'https://jiaotong.baidu.com/trafficindex/city/list' # 接口api
    res = requests.get(url)
    data = res.json()
    
    # 提取資料
    citys = [i['cityname'] for i in data['data']['list']] # 提取城市
    indexs = [float(i['index']) for i in data['data']['list']] # 提取對應的指數
    
    # 傳回資料
    return zip(citys,indexs)
    
def get_geo():
    '''
    擷取地圖
    '''
    # 擷取各城市的擁堵指數
    data = get_data()
    
    # 繪制散點分布圖
    geo = Geo()
    geo.add_schema(maptype = 'china') # 加入中國地圖
    geo.add('各城市擁堵指數 by kimol', data, type_ = 'effectScatter') # 設定地圖類型及資料
    geo.set_series_opts(label_opts = opts.LabelOpts(is_show = False))  #設定是否顯示标簽
    geo.set_global_opts(visualmap_opts = opts.VisualMapOpts(
                        #max_ = 2.5, # 用于連續表示
                        is_piecewise = True, # 是否分段
                        pieces = [{'min':1.0,'max':1.5,'label':'暢通','color':'#16CE95'},
                                  {'min':1.5,'max':1.8,'label':'緩行','color':'#F79D06'},
                                  {'min':1.8,'max':2.0,'label':'擁堵','color':'#D80304'},
                                  {'min':2.0,'max':2.5,'label':'嚴重擁堵','color':'#8F0921'}])) # 設定圖例顯示
    
    # 傳回地圖
    return geo

# 定義app
app = Flask(__name__)
# 定義主界面
@app.route("/")
def hello():
    geo = get_geo()
    return render_template('geo.html',
                           mygeo=geo.render_embed())
    
if __name__ == "__main__":
    #運作項目
    app.run()
           

其中,get_geo()為擷取地圖的函數,傳回了pyecharts繪制的地圖。在目前目錄下建立templates檔案夾,并建立子產品檔案geo.html,如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>各城市交通擁堵指數</title>
</head>

<body>
  {{mygeo|safe}}
</body>

</html>
           

至此,通路網站位址即可看到繪制的擁堵情況地圖~

作者:不正經的kimol君來源:Python幹貨鋪子