开发者

python如何绘制路段时变车速热力图

目录
  • 一、目标
  • 二、结果
  • 三、准备数据
    • 1、各路段时序车速
    • 2、路段间拓扑关系
  • 四、各路段时变车速热力图
    • 1、pd.pivot_t编程客栈able()
    • 2、sns.heatmap()
    • 3、绘图代码
  • 总结

    一、目标

    本文旨在通过热力图的形式,表示某个路段24h的时序车速变化以及某一时刻某条路径的车速变化

    二、结果

    python如何绘制路段时变车速热力图

    三、准备数据

    注:本文车速数据为Numpy随机生成

    1、各路段时序车速

    (因为车速是随机生成,所以会有相邻时间速度连续性不高及午夜速度很慢、中午速度很快等错误,读者可通过其他渠道获取更加准确的数据)

    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.writeheajsder()
            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 生成各路段时变车速

    python如何绘制路段时变车速热力图

    图3-2 生成的部分数据

    2、路段间拓扑关系

    拓扑关系指满足拓扑几何学原理的各空间数据间的相互关系。即用结点、弧段和多边形所表示的实体之间的邻接、关联、包含和连通关系。

    本文中指路段之间的连接顺序。(路段顺序相连构成一条路径)

    python如何绘制路段时变车速热力图

    图3-3 路段拓扑关系(通过networkx绘制)

    四、各路段时变车速热力图

    主要使用pivot_table()和heatmap()两个函数。可通过以下命令查看具体用法。

    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)

    通过该函数将DataFrame转为矩阵形式,作为参数传入heatmap()函数

    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.rcPar编程ams['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轴la编程客栈bel的文本和字体大小
    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("各路段时php变车速" ,fontsize=50) #图片标题文本和字体大小
    cax = plt.gcf().axes[-1] 
    cax.tick_params(labelsize=60)
    plt.savefig('各路段时变车速.png')

    python如何绘制路段时变车速热力图

    运行代码,得到上图,横着看可以得到各路段24h连续的车速变化;竖着看可以得到一条路径某一时刻的车速变化 。

    但图例显示的值是速度,某些情况下,我们只想知道各路段的车况是畅通,轻度拥堵, 中度拥堵还是重度拥堵,这时要对图例进行修改。

    首先根据“《道路交通拥堵度评价方法》(GAT 115-2020)”中关于拥堵等级的定义,如下:

    python如何绘制路段时变车速热力图

    python如何绘制路段时变车速热力图

    通过编写程序得出各路段各时刻拥堵等级

    设置图例,加入如下代码

    '''
        设置图例只显示1,2,3,4四个数字
        并用畅通、轻度拥挤、中度拥挤、重度拥挤来代替
    '''  
    c_bar = ax.collections[0].colorbar
    c_bar.set_ticks([4,3,2,1])
    c_bar.set_ticklabels(['畅通', '轻度拥堵', '中度拥堵','重度拥堵'])

    python如何绘制路段时变车速热力图

    除此之外,读者也可尝试通过geopandas绘制道路拥堵等级图。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜