速來圍觀!看小夥是如何用python視覺化各城市擁堵情況的

qwer1030274531發表於2020-12-11

前言

就在今天,我感受到了來自 堵車的深深惡意。沒有錯!我今天被堵在路上近乎3個小時,美好的約會就這樣化為泡影了。
在這裡插入圖片描述
我倒還真想看看這路到底能有多堵。於是,我爬取了各城市的擁堵資料,並將它們視覺化:
在這裡插入圖片描述
特別說明: 由於資料具有實時性,畫圖時已經過了高峰期,於是圖上一片綠油油也並不奇怪。

有感興趣的客官,您接著往下看,待我給您慢慢分解。(ps.涉及到 爬蟲pyechartsflask等)

一、爬取擁堵指數

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

# 獲取各城市的擁堵指數url = '介面apires = requests.get(url)data = res.json()1234

其中,url為獲取資料的介面地址,透過簡單的抓包分析便能知道。 而data為返回後的資料,它包括很多欄位,但是我們只需要提取其中的 城市名擁堵指數即可:

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

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

二、資料視覺化

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

pip install pyecharts1

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

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

首先定義地圖:

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

新增資料並進行相關設定:

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

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

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'}])) # 設定圖例顯示1234567

最後將地圖儲存在本地:

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

到這裡,我們就得到了文章一開始看到的那張圖~
然而,由於擁堵資料是實時變化的,如果我每次都要去執行一次程式碼豈不是很麻煩?很顯然,機智的社會主義青年是不會這麼做的,您接著往下看。 /anhui/

三、搭建展示網站

為了更加方便地將各城市擁堵情況展示出來,我決定搭建一個用於展示的網站。方法可以是各式各樣的,在這裡我選擇了利用 flask框架,簡單快捷~
我的完整程式碼如下:

# -*- coding: utf-8 -*-"""
Created on Sun Nov 15 01:34:36 2020
@author: kimol_love
"""import requestsfrom pyecharts.charts import Geofrom pyecharts import options as optsfrom flask import Flask, render_templatedef get_data():
    '''
    獲取擁堵指數
    '''
    # 獲取各城市的擁堵指數
    url = '介面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# 定義appapp = Flask(__name__)# 定義主介面@app.route("/")def hello():
    geo = get_geo()
    return render_template('geo.html',
                           mygeo=geo.render_embed())
    if __name__ == "__main__":
    #執行專案
    app.run()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

其中,get_geo()為獲取地圖的函式,返回了pyecharts繪製的地圖。在當前目錄下建立 templates資料夾,並建立模組檔案 geo.html,如下:

<!DOCTYPE html><html><head>
    <meta charset="utf-8">
    <title>各城市交通擁堵指數</title></head><body>
  {{mygeo|safe}}</body></html>12345678910111213

寫在最後 /hebei/

讓大家瞅瞅這萬惡的晚高峰: /ningxia/ 在這裡插入圖片描述

最後,感謝各位大大的耐心閱讀,咋們下次再會~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2741476/,如需轉載,請註明出處,否則將追究法律責任。

相關文章