本篇文章小编给大家分享一下Python绘制交通流折线图代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
一、数据集下载
加州高速公路PEMS数据集
这里绘制PEMS04中的交通流量数据。该数据集中包含旧金山2018年1月1日至2月28日的29条道路上307个探测器每五分钟收集的数据。
二、折线图绘制
1、解压npz文件
npz是一种numpy文件存储的压缩格式,可使用numpy进行读取。
allow_pickle=True用于防止numpy版本过高带来的错误。
data.files查看压缩文件下的所有文件。
import numpy as np data = np.load(数据集存放地址, allow_pickle=True) print(data.files)
可以看到压缩文件下只有data一个文件:
通过 data['data'] 即可对该数据集进行读取。我们也可以查看一下该数据的维度。
print(data['data'].shape)
其维度如下:
16992 = 59天×24小时×12(每五分钟统计一次流量数据),307为探测器数量,3为特征数。
2、折线图绘制
数据中包含的三个特征为(交通流量,平均速度,平均占用率),取出绘图需要的第一个特征(这里只绘制其中一个探测器的)。
flow = data['data'][:, 0, 0]
导入matplotlib包,通过pyplot来绘制最简单的折线图。
import matplotlib.pyplot as plt
由于希望观测到工作日的流量变化,我们将横坐标替换为周一至周日。旧金山2018年1月1日为周一。
绘制的全部代码如下:
import numpy as np import matplotlib.pyplot as plt data = np.load(文件路径, allow_pickle=True) flow = data['data'][:, 0, 0] print(len(flow)) week = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] x = [] for i in range(59): x.append(week[(i + 1) % 7]) y = [] sum = 0 for i in range(len(flow)): if i == 0 or (i + 1) % 288 != 0: sum += flow[i] else: y.append(sum) sum = 0 fig = plt.figure(figsize=(15, 5)) # 图片宽度设置的大一些 plt.title('traffic flow in San Francisco') plt.xlabel('day') plt.ylabel('flow') plt.xticks(np.arange(59), x) plt.plot(np.arange(59), y, linestyle='-') fig.autofmt_xdate(rotation=45) # x轴的刻度标签逆时针旋转45度 plt.show()
绘制结果如下:
文章所以大部分的KPI都会遵循“Mary's Peak”模式,比如说使用公共交通工具出行的情况、外卖点餐情况。从上图可以看出,这里的交通流量是遵循这一模式的。