基于VISSIM仿真CSV数据绘制时空图(TSD)的技术求助
VISSIM CSV数据生成时空图(TSD)问题修正
问题描述
我是编程新手,需要从VISSIM仿真导出的CSV文件生成时空图(TSD)。计划把CSV中的VEHICLE:SIMSEC作为TSD的X轴(仿真时间),NO(共185辆车辆)对应每条折线代表的车辆,COORDFRONTX与COORDFRONTY作为Y轴位置。试了下面的Python代码,但生成的散点图完全没法解读,附上代码和CSV前20行数据,求指导修正得到正确的TSD。
原尝试代码
import pandas as pd import matplotlib.pyplot as mp # take data data = pd.read_csv(r"C:\Users\hk385\Desktop\VISSIM_DATA_CSV.csv") df = pd.DataFrame(data, columns=["VEHICLE:SIMSEC", "NO", "DISTTRAVTOT"]) # plot the dataframe df.plot(x="NO", y=["DISTTRAVTOT"], kind="scatter") # print bar graph mp.show()
CSV前20行数据
VEHICLE:SIMSEC,NO,LANE\LINK\NO,LANE\INDEX,POS,POSLAT,COORDFRONTX,COORDFRONTY,COORDREARX,COORDREARY,DISTTRAVTOT 5.9,1,1,1,2.51,0.5,-1.259,-3.518,-4.85,-1.319,8.42 6.0,1,1,1,10.94,0.5,0.932,-4.86,-2.659,-2.661,16.86 6.1,1,1,1,19.37,0.5,3.125,-6.203,-0.466,-4.004,25.29 6.2,1,1,1,27.82,0.5,5.319,-7.547,1.728,-5.348,33.73 6.3,1,1,1,36.26,0.5,7.515,-8.892,3.924,-6.693,42.18 6.4,1,1,1,44.72,0.5,9.713,-10.238,6.122,-8.039,50.64 6.5,1,1,1,53.18,0.5,11.912,-11.585,8.321,-9.386,59.1 6.6,1,1,1,61.65,0.5,14.112,-12.933,10.521,-10.734,67.56 6.7,1,1,1,70.12,0.5,16.314,-14.282,12.724,-12.082,76.04 6.8,1,1,1,78.6,0.5,18.518,-15.632,14.927,-13.432,84.51 6.9,1,1,1,87.08,0.5,20.723,-16.982,17.132,-14.783,93.0 7.0,1,1,1,95.57,0.5,22.93,-18.334,19.339,-16.135,101.49 7.1,1,1,1,104.07,0.5,25.138,-19.687,21.547,-17.487,109.99 7.2,1,1,1,112.57,0.5,27.348,-21.04,23.757,-18.841,118.49 7.3,1,1,1,121.08,0.5,29.56,-22.395,25.969,-20.195,127.0 7.4,1,1,1,129.59,0.5,31.773,-23.75,28.182,-21.551,135.51 7.5,1,1,1,138.11,0.5,33.987,-25.107,30.396,-22.907,144.03 7.6,1,1,1,146.64,0.5,36.203,-26.464,32.612,-24.264,152.56 7.7,1,1,1,155.17,0.5,38.421,-27.822,34.83,-25.623,161.09
修正方案
原代码的核心问题:
- 选错了Y轴数据:用了
DISTTRAVTOT而非你需要的COORDFRONTX/COORDFRONTY - 坐标轴逻辑错误:把车辆编号
NO设为X轴,和你要的「X轴是仿真时间、单辆车对应一条折线」完全相反 - 图表类型错误:散点图不适合展示单辆车随时间的连续位置变化,应该用折线图
修正后的代码
import pandas as pd import matplotlib.pyplot as plt # 读取CSV,只保留需要的列,减少内存占用 data = pd.read_csv(r"C:\Users\hk385\Desktop\VISSIM_DATA_CSV.csv", usecols=["VEHICLE:SIMSEC", "NO", "COORDFRONTX", "COORDFRONTY"]) # 创建画布,设置合适大小 plt.figure(figsize=(12, 8)) # 按车辆编号分组,为每辆车绘制时间-位置折线 for vehicle_id, group in data.groupby("NO"): # 先按仿真时间排序,确保折线顺序正确 sorted_group = group.sort_values("VEHICLE:SIMSEC") # 绘制仿真时间 vs 车辆前部X坐标的折线,需要Y坐标就换成COORDFRONTY plt.plot(sorted_group["VEHICLE:SIMSEC"], sorted_group["COORDFRONTX"], label=f"车辆{vehicle_id}", linewidth=0.8) # 设置图表基础属性 plt.xlabel("仿真时间 (秒)") plt.ylabel("车辆前部X坐标") plt.title("车辆时空图(仿真时间 vs X坐标)") # 185辆车的图例会非常挤,不需要的话可以注释掉下面一行 # plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.grid(True, alpha=0.3) # 调整布局,防止坐标轴标签被截断 plt.tight_layout() plt.show()
额外说明
- 如果需要展示车辆的Y坐标,只需把代码中的
COORDFRONTX替换为COORDFRONTY即可 - 185辆车全部绘制会比较密集,可以调小
linewidth(比如设为0.5),或者先选部分车辆测试(比如data[data["NO"] <= 10].groupby("NO")) - 如果还是想用行驶总距离
DISTTRAVTOT作为Y轴,逻辑完全一致,只需把COORDFRONTX换成DISTTRAVTOT即可
内容的提问来源于stack exchange,提问作者Hyun Kim
相关产品推荐
相关产品推荐

