VISSIM二次开发(Python)&大作业总结2
写在前面
前一小节已经概括了基本所有这次使用的二次开发的知识,在这一小节,我们主要介绍本文对.att文件的读取和绘图以及分析的工作。
在这一部分我们将展开对这一部分的介绍,由于这部分的内容专门性比较强,所以就与前面的二次开发部分分开撰写,供有需要的同学们参考。
.att文件示例

其中表头会介绍数据字节含义,这里需要点出第一列就是仿真运行次数。
需求1:依据仿真结果绘制contour图
#开发环境
matplotlib 3.3.4
numpy 1.19.5
pandas 1.2.4
coutour图是指等高线图,直接上代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
S=8 #设置需要读取的仿真次数
df1=pd.read_csv('file.att',sep=';',skiprows=21)#att中数据分隔符是“;”,然后需要跳过前面不需要转换成df的部分。
#读取数据需要跳过前面的不需要的行
#%%
# df2=df1.sort_values(by=['DATACOLLECTIONMEASUREMENT', 'TIMEINT'])
dfn1=df1[df1['$DATACOLLECTIONMEASUREMENTEVALUATION:SIMRUN'].isin([S])]#这里其实在前面更改clomun后会更加方便。选择仅仅包含这第八次运行的结果
T=int(672*5/8)#这是其中非匝道段的线圈有效数据的行数,因为后面会有很多不需要的统计值,可能需要自己更改
#%%
dfn=dfn1[dfn1['DATACOLLECTIONMEASUREMENT'].isin([1,2,4,7,9])]#这里选取了其中需要分析的截面
pre_df=dfn[['TIMEINT','DATACOLLECTIONMEASUREMENT','SPEED(ALL)']].iloc[:T,:]#这里主要是选择需要分析的几列
pre_df1=pre_df[['SPEED(ALL)']]#最后发现还是只需要一列
pre_df1.index = range(T)#为方便,对index重新编号
#下面就是把上面的一列数据转换
for i in range(84):
if i ==0:
A= pre_df1.iloc[0:5,0]
C=pd.DataFrame(A)
C.index = range(len(C))
else:
B=pd.DataFrame(pre_df1.iloc[i*5:i*5+5,0])
B.index = range(len(B))
C=pd.concat([C,B],axis=1,join='inner')#建立一个9*64的df作为等高线绘图的输入
t=C.shape[1]#下面就是等高线图的绘制
C=C.iloc[::-1,:]
x=np.linspace(0,t-1,t)
y=np.linspace(37,41,5)
X,Y=np.meshgrid(x,y) #上面三句话就是建立等高线图的网格
plt.figure()
plt.contourf(X,Y,np.array(C),7,cmap=plt.cm.RdYlGn,levels=np.linspace(0,90,50)) #绘制等高线图,中间需要以矩阵的形式,并且满足x列,y行
plt.colorbar()#显示色条
plt.xticks(range(0,84,12),['6:00','7:00','8:00','9:00','10:00','11:00','12:00'])#更改横纵坐标
plt.yticks([37,38,39,40,41],['NHNX41','NHNX40','NHNX39','NHNX38','NHNX37'])
# plt.savefig('C:\\Users\\13968\\Desktop\\0819-'+str(S)+'.jpg', dpi=1000)
plt.show()
其中控制绘图效果的主要就是levels=np.linspace(0,90,50)这个代码其中0,90是控制显示的纵坐标色彩范围(对应颜色),50是表述色彩过渡的趋势,可以参考下面链接中的方法进行选用。以及色板的使用都可以参考,当然官方文档写的也很清楚~

本文详细介绍了VISSIM模拟结果的Python二次开发,涉及.att文件读取、contour图的绘制,以及依据仿真数据进行的瓶颈分析。通过实例展示了如何使用matplotlib、numpy和pandas处理数据并创建等高线图,同时提供了关键指标的计算方法和应用案例。
最低0.47元/天 解锁文章
5076

被折叠的 条评论
为什么被折叠?



