Python时间序列绘图异常:车辆累计距离-时间连续折线绘制问题
解决Python中车辆累计距离随时间连续折线图绘制问题
需求
绘制veh_ID=102的车辆累计距离随时间变化的连续折线图,需清晰展示:
- 各行程的起止点标记
- 行程间停车阶段的水平线段
数据示例
import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({ 'veh_ID': [102, 102], 'Trip_ID': [1, 2], 'Trip_Start': ['08:00', '11:00'], 'Trip_end': ['10:00', '11:10'], 'Travel distance': [12, 1] })
原代码问题分析
原代码无法生成连续折线的核心原因:
- 时间格式未转换:
Trip_Start和Trip_end是字符串格式,matplotlib无法正确识别时间顺序,导致x轴刻度逻辑混乱 - 列名拼写错误:原代码中使用
Trip_End(大写E),但数据里是Trip_end(小写e),导致停车阶段的线段无数据 - 点序列构建错误:未生成完整的时间-距离连续点集,导致折线断裂
修正后的完整代码
import pandas as pd import matplotlib.pyplot as plt # 1. 数据初始化与预处理 df = pd.DataFrame({ 'veh_ID': [102, 102], 'Trip_ID': [1, 2], 'Trip_Start': ['08:00', '11:00'], 'Trip_end': ['10:00', '11:10'], 'Travel distance': [12, 1] }) # 转换时间列为datetime格式,确保x轴正确排序 df['Trip_Start'] = pd.to_datetime(df['Trip_Start'], format='%H:%M') df['Trip_end'] = pd.to_datetime(df['Trip_end'], format='%H:%M') # 按行程开始时间排序,计算累计距离 df.sort_values(by='Trip_Start', inplace=True) df['Cumulative Distance'] = df['Travel distance'].cumsum() # 2. 构建连续的时间-距离点序列 time_points = [] distance_points = [] # 遍历每个行程,添加起点、终点,以及前一个行程终点到当前行程起点的停车段 for idx, row in df.iterrows(): if idx == 0: # 第一个行程的起点(初始累计距离为0) time_points.append(row['Trip_Start']) distance_points.append(0) else: # 前一个行程终点到当前行程起点的停车段(水平线段) prev_end = df.iloc[idx-1]['Trip_end'] prev_cum_dist = df.iloc[idx-1]['Cumulative Distance'] time_points.extend([prev_end, row['Trip_Start']]) distance_points.extend([prev_cum_dist, prev_cum_dist]) # 当前行程的终点 time_points.append(row['Trip_end']) distance_points.append(row['Cumulative Distance']) # 3. 绘图 plt.figure(figsize=(10, 6)) # 绘制连续折线(包含行驶段和停车段) plt.plot(time_points, distance_points, color='blue', linestyle='-', label='累计距离') # 标记各行程起点 plt.scatter(df['Trip_Start'], df['Cumulative Distance'].shift(1).fillna(0), marker='o', color='green', s=80, label='行程起点') # 标记各行程终点 plt.scatter(df['Trip_end'], df['Cumulative Distance'], marker='s', color='red', s=80, label='行程终点') # 格式化x轴时间显示,避免重叠 plt.gcf().autofmt_xdate() plt.xlabel('时间') plt.ylabel('累计距离 (km)') plt.title('车辆102的累计距离随时间变化图') plt.legend() plt.grid(True, alpha=0.3) plt.show()
代码关键说明
- 时间格式转换:用
pd.to_datetime把字符串时间转成datetime类型,确保x轴严格按时间顺序排列 - 连续点序列构建:手动生成包含行程起点、终点、停车段的完整时间-距离点集,从根源保证折线连续
- 标记区分:用不同形状和颜色的标记区分行程起点(绿色圆点)和终点(红色方块),视觉上更清晰直观
内容的提问来源于stack exchange,提问作者Marlene
相关产品推荐
相关产品推荐

