You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]
})

原代码问题分析

原代码无法生成连续折线的核心原因:

  1. 时间格式未转换:Trip_Start和Trip_end是字符串格式,matplotlib无法正确识别时间顺序,导致x轴刻度逻辑混乱
  2. 列名拼写错误:原代码中使用Trip_End(大写E),但数据里是Trip_end(小写e),导致停车阶段的线段无数据
  3. 点序列构建错误:未生成完整的时间-距离连续点集,导致折线断裂

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:25:13