python如何繪制路段時變車速熱力圖
一、目標
本文旨在通過熱力圖的形式,表示某個路段24h的時序車速變化以及某一時刻某條路徑的車速變化。
二、結果

三、準備數(shù)據(jù)
注:本文車速數(shù)據(jù)為Numpy隨機生成
1、各路段時序車速
(因為車速是隨機生成,所以會有相鄰時間速度連續(xù)性不高及午夜速度很慢、中午速度很快等錯誤,讀者可通過其他渠道獲取更加準確的數(shù)據(jù))
import numpy as np
import os
import csv
RoadName = ['A','B','C','D','E','F','G']
if not os.path.isfile(r'RoadSpeed.csv'):
with open('RoadSpeed.csv','a',newline='',encoding='utf-8') as csvfile:
fieldnames = ['RoadName','Time','Speed']
writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
writer.writeheader()
for road in RoadName:
for h in range(24):
for m in range(60):
data = {}
data['RoadName'] = road
data['Time'] = '20210924{:0>2}{:0>2}'.format(h,m)
data['Speed'] = str(np.random.uniform(40,120,1)).strip('[]')
writer.writerow(data)圖3-1 生成各路段時變車速

圖3-2 生成的部分數(shù)據(jù)
2、路段間拓撲關系
拓撲關系指滿足拓撲幾何學原理的各空間數(shù)據(jù)間的相互關系。即用結點、弧段和多邊形所表示的實體之間的鄰接、關聯(lián)、包含和連通關系。
本文中指路段之間的連接順序。(路段順序相連構成一條路徑)

圖3-3 路段拓撲關系(通過networkx繪制)
四、各路段時變車速熱力圖
主要使用pivot_table()和heatmap()兩個函數(shù)??赏ㄟ^以下命令查看具體用法。
import pandas as pd import seaborn as sns help(pd.pivot_table) help(sns.heatmap)
1、pd.pivot_table()
data = pd.pivot_table(df,index = ['RoadName'],columns = ['Time'],values = ['Speed']).reset_index(drop=False)
通過該函數(shù)將DataFrame轉為矩陣形式,作為參數(shù)傳入heatmap()函數(shù)
2、sns.heatmap()
ax = sns.heatmap(data, cmap=plt.cm.RdYlGn,xticklabels=1, yticklabels=1)
3、繪圖代碼
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv(r'RoadSpeed.csv',encoding='utf-8')
#設置中文和負號正常顯示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
#提高圖像清晰度
plt.rcParams['savefig.dpi'] = 400
plt.rcParams['figure.dpi'] = 400
#pivot_table
data = pd.pivot_table(df,index = ['RoadName'],columns = ['Time'],values = ['Speed'])
data.columns = data.columns.get_level_values(1).values
data.sort_index(ascending = True)
#heatmap
plt.figure(figsize=(36, 24))
ax = sns.heatmap(data, cmap=plt.cm.RdYlGn,xticklabels=1, yticklabels=1)
#減少坐標軸密度
times = list(data.columns)
ticks = list(range(0,len(times),15)) # 每隔15min顯示一次
if ticks[-1] != len(times)-1:
ticks.append(len(times)-1)
labels=[times[i] for i in ticks]
#設置刻度、標簽等
ax.set(xlim=[0,len(times)-1])
ax.set_xticks(ticks)
ax.set_xticklabels(labels,rotation=90,horizontalalignment = 'right',weight = 'bold')
ax.set_xlabel("時間", fontsize=30, color="k") #x軸label的文本和字體大小
ax.set_ylabel("路段", fontsize=30, color="k") #y軸label的文本和字體大小
plt.xticks(fontsize=20,weight = 'bold') # x軸刻度的字體大小
plt.yticks(fontsize=20,weight = 'bold',rotation = 30) # y軸刻度的字體大小
ax.set_title("各路段時變車速" ,fontsize=50) #圖片標題文本和字體大小
cax = plt.gcf().axes[-1]
cax.tick_params(labelsize=60)
plt.savefig('各路段時變車速.png')
運行代碼,得到上圖,橫著看可以得到各路段24h連續(xù)的車速變化;豎著看可以得到一條路徑某一時刻的車速變化 。
但圖例顯示的值是速度,某些情況下,我們只想知道各路段的車況是暢通,輕度擁堵, 中度擁堵還是重度擁堵,這時要對圖例進行修改。
首先根據(jù)“《道路交通擁堵度評價方法》(GAT 115-2020)”中關于擁堵等級的定義,如下:


通過編寫程序得出各路段各時刻擁堵等級
設置圖例,加入如下代碼
'''
設置圖例只顯示1,2,3,4四個數(shù)字
并用暢通、輕度擁擠、中度擁擠、重度擁擠來代替
'''
c_bar = ax.collections[0].colorbar
c_bar.set_ticks([4,3,2,1])
c_bar.set_ticklabels(['暢通', '輕度擁堵', '中度擁堵','重度擁堵'])
除此之外,讀者也可嘗試通過geopandas繪制道路擁堵等級圖。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解python函數(shù)的閉包問題(內部函數(shù)與外部函數(shù)詳述)
這篇文章主要介紹了python函數(shù)的閉包問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05
python 通過 socket 發(fā)送文件的實例代碼
這篇文章主要介紹了python 通過 socket 發(fā)送文件的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
python神經網絡MobileNetV2模型的復現(xiàn)詳解
這篇文章主要為大家介紹了python神經網絡MobileNetV2模型的復現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

