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

一、目标

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

二、结果

三、准备数据

        注:本文车速数据为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.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 生成的部分数据

2、路段间拓扑关系

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

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

 图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.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连续的车速变化;竖着看可以得到一条路径某一时刻的车速变化 。

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

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

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

        设置图例,加入如下代码

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

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

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 绘制蓝到红热力图可以使用Python的matplotlib库来实现。下面是一个简单的示例代码: ``` import numpy as np import matplotlib.pyplot as plt # 创建一个二维数组作为数据 data = np.random.rand(10, 10) # 绘制热力图 plt.imshow(data, cmap='hot', interpolation='nearest') # 添加颜色条 plt.colorbar() # 显示图像 plt.show() ``` 运行这段代码,会生成一个大小为10x10的随机数据的热力图。颜色从蓝色渐变到红色,并且附带一个颜色条,用于表示数值与颜色之间的对应关系。 `imshow`函数用于绘制热力图,参数`data`接收二维数据,`cmap`指定颜色映射,这里选择了热力图的颜色映射`hot`,`interpolation`指定像素插值方式,`nearest`表示离散像素。 `colorbar`函数用于添加颜色条。 最后使用`show`函数显示图像。 你也可以根据实际需求,修改数据、调整图像大小、添加标题等。希望以上信息对你有帮助! ### 回答2: 要用Python绘制蓝到红的热力图,我们可以使用matplotlib库和numpy库。 首先,我们需要导入所需的库: import numpy as np import matplotlib.pyplot as plt 接下来,我们创建一个数据矩阵作为输入。数据矩阵可通过numpy库的random模块生成,也可以通过其他方法创建。 data = np.random.rand(10, 10) # 生成一个10x10的随机数据矩阵 然后,我们可以使用matplotlib的imshow函数来绘制热力图,同时指定颜色映射为'hot'来得到从蓝到红的渐变。代码如下: plt.imshow(data, cmap='hot', interpolation='nearest') 接下来,我们可以通过添加一个颜色条来显示热力图的值范围。代码如下: plt.colorbar() 最后,我们使用plt.show()函数来显示图像并保存热力图。代码如下: plt.show() plt.savefig('heatmap.png') 这样,我们就可以生成一个蓝到红的热力图,并将其保存为heatmap.png文件。 ### 回答3: 要使用Python绘制蓝到红的热力图,可以使用Python中的matplotlib库和numpy库。下面是一个简单的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 创建一个二维数组作为数据 data = np.random.rand(10, 10) # 绘制热力图 heatmap = plt.imshow(data, cmap='hot', interpolation='nearest') # 添加颜色条 plt.colorbar(heatmap) # 显示图形 plt.show() ``` 首先,我们导入numpy库和matplotlib.pyplot模块。然后,我们创建一个10x10的随机二维数组作为示例数据。 接下来,我们使用`plt.imshow()`函数绘制热力图。其中,`data`是要绘制的数据,`cmap='hot'`指定了使用蓝到红的颜色映射,`interpolation='nearest'`表示使用最近邻插值方法来绘制图像。 然后,我们使用`plt.colorbar()`函数添加颜色条,以便更好地理解图像中颜色的含义。 最后,我们使用`plt.show()`函数显示图形。这将在新的图形窗口中显示出我们绘制热力图。 通过调整数据和颜色映射选项,您可以根据需要自定义热力图的样式和内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

煮雨小筑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值