亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python如何繪制路段時(shí)變車速熱力圖

 更新時(shí)間:2024年09月10日 09:08:19   作者:煮雨小筑  
本文通過熱力圖形式展示了24小時(shí)內(nèi)某個(gè)路段的車速變化和特定時(shí)刻某條路徑的車速情況,數(shù)據(jù)是通過Numpy隨機(jī)生成的,用以模擬真實(shí)的車速情況,文章還展示了如何利用pandas和seaborn庫(kù)中的pivot_table()和heatmap()函數(shù)生成熱力圖

一、目標(biāo)

本文旨在通過熱力圖的形式,表示某個(gè)路段24h的時(shí)序車速變化以及某一時(shí)刻某條路徑的車速變化。

二、結(jié)果

三、準(zhǔn)備數(shù)據(jù)

注:本文車速數(shù)據(jù)為Numpy隨機(jī)生成

1、各路段時(shí)序車速

(因?yàn)檐囁偈请S機(jī)生成,所以會(huì)有相鄰時(shí)間速度連續(xù)性不高及午夜速度很慢、中午速度很快等錯(cuò)誤,讀者可通過其他渠道獲取更加準(zhǔn)確的數(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 生成各路段時(shí)變車速

圖3-2 生成的部分?jǐn)?shù)據(jù)

2、路段間拓?fù)潢P(guān)系

拓?fù)潢P(guān)系指滿足拓?fù)鋷缀螌W(xué)原理的各空間數(shù)據(jù)間的相互關(guān)系。即用結(jié)點(diǎn)、弧段和多邊形所表示的實(shí)體之間的鄰接、關(guān)聯(lián)、包含和連通關(guān)系。

本文中指路段之間的連接順序。(路段順序相連構(gòu)成一條路徑)

圖3-3 路段拓?fù)潢P(guān)系(通過networkx繪制)

四、各路段時(shí)變車速熱力圖

主要使用pivot_table()和heatmap()兩個(gè)函數(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轉(zhuǎn)為矩陣形式,作為參數(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')

#設(shè)置中文和負(fù)號(hào)正常顯示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標(biāo)簽
#提高圖像清晰度
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)

#減少坐標(biāo)軸密度
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]

#設(shè)置刻度、標(biāo)簽等
ax.set(xlim=[0,len(times)-1])
ax.set_xticks(ticks)
ax.set_xticklabels(labels,rotation=90,horizontalalignment = 'right',weight = 'bold')
ax.set_xlabel("時(shí)間", 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("各路段時(shí)變車速" ,fontsize=50) #圖片標(biāo)題文本和字體大小
cax = plt.gcf().axes[-1] 
cax.tick_params(labelsize=60)
plt.savefig('各路段時(shí)變車速.png')

運(yùn)行代碼,得到上圖,橫著看可以得到各路段24h連續(xù)的車速變化;豎著看可以得到一條路徑某一時(shí)刻的車速變化 。

但圖例顯示的值是速度,某些情況下,我們只想知道各路段的車況是暢通,輕度擁堵, 中度擁堵還是重度擁堵,這時(shí)要對(duì)圖例進(jìn)行修改。

首先根據(jù)“《道路交通擁堵度評(píng)價(jià)方法》(GAT 115-2020)”中關(guān)于擁堵等級(jí)的定義,如下:

通過編寫程序得出各路段各時(shí)刻擁堵等級(jí)

設(shè)置圖例,加入如下代碼

'''
    設(shè)置圖例只顯示1,2,3,4四個(gè)數(shù)字
    并用暢通、輕度擁擠、中度擁擠、重度擁擠來代替
'''  
c_bar = ax.collections[0].colorbar
c_bar.set_ticks([4,3,2,1])
c_bar.set_ticklabels(['暢通', '輕度擁堵', '中度擁堵','重度擁堵'])

除此之外,讀者也可嘗試通過geopandas繪制道路擁堵等級(jí)圖。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論