速來圍觀!看小伙是如何用python可視化各城市擁堵情況的
- 前言
- 一、爬取擁堵指數
- 二、資料可視化
- 三、搭建展示網站
- 寫在最后
前言
就在今天,我感受到了來自堵車的深深惡意,沒有錯!我今天被堵在路上近乎3個小時,美好的約會就這樣化為泡影了,

我倒還真想看看這路到底能有多堵,于是,我爬取了各城市的擁堵資料,并將它們可視化:

特別說明:由于資料具有實時性,畫圖時已經過了高峰期,于是圖上一片綠油油也并不奇怪,
有感興趣的客官,您接著往下看,待我給您慢慢分解,(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>
至此,訪問網站地址即可看到繪制的擁堵情況地圖~
寫在最后
讓大家瞅瞅這萬惡的晚高峰:

最后,感謝各位大大的耐心閱讀,咋們下次再會~
創作不易,大俠請留步… 動起可愛的雙手,來個贊再走唄 (???←?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224277.html
標籤:python
