台架数据可视化"/>
利用python实现发动机台架数据可视化
学了python数据分析一段时间了,看了很多书,发现书中的例子都是用随机数生成的,如果要用来处理实际应用问题,还是要费一阵子功夫的。
正好工作上有时需要处理一些发动机台架数据,便萌生了使用python处理数据的想法。这篇文章主要探讨如何用python实现测试数据的可视化。
首先,数据选用的是从发动机台架测试导出的一些信号,生成csv文件以便python分析使用。
python方面,作图模块选用的是plotly,因为它的图表交互式效果非常棒,非常适合用于直观的查看,分析。开发环境本来是用的jupyter,但是发现断网后图表就无法正确显示了,不知道是什么原理。于是转到了spyder,发现不管是联网还是断网,图表都能够正确的显示,效果还不错。
话不多说,让我们进入正题。
1. 首先是模块导入:
import pandas as pd
import plotly.graph_objs as go
from plotly.subplots import make_subplots
from plotly.offline import plot
因为正常工作中可能会遇到断网处理数据的情况,这里用的是plotly的离线处理模块。go用来添加图表上的一些标注,make_subplots用来处理多图表。pandas用来处理导入的数据。
2. 导入文件:
raw=pd.read_csv('./engine_data.csv')
raw.head()
文件的表头信息如下:
通过查看表头信息我们发现,index的第0行是单位数据,这里需要处理一下把它变到header上去。
3. 表格处理
'''合并前两行作为header'''
raw.columns=raw.columns+' '+raw.iloc[0,:]
raw.drop(index=[0],axis=1,inplace=True)
这里我用的是先让表头和第0行进行叠加,然后删除第0行的方法。
调用raw,返回结果如下:
成功的把表头合并了。
因为现在的表格是从1开始索引,如果想在作图时把x轴设置为时间,需要重新构建表格的index。
''' 将毫秒数据转化为秒,作为raw的index'''
L=[]
for i in raw['recorder_time ms']:i=float(i)/1000L.append(i)
raw.index=L
raw.index.name='recorder_time s'
raw.drop(columns=('recorder_time ms'),inplace=True)
这里把recoder_time的毫秒数据转化为秒,作为index。
调用raw,结果如下:
至此,对文件的表格处理告一段落。
4.绘制图表
4.1 绘制单一图表:
'''Single Plot'''fig=go.Figure()
fig.add_trace(go.Scatter(x=raw.index,y=raw['ALPHA %'],name='Alpha [%]'))fig.update_layout(title_text='ONE AXIS')
fig.update_layout(showlegend=True) plot(fig,filename='one axis.html')
这里首先调用go模块创建figure对象。然后对fig添加trace,内容是x轴定义,y轴定义,图例定义。
最后是添加title和生成html显示图像。
图例如下:
使用plotly的优点是随着鼠标光标移动可以直观的显示数值,而且坐标轴可以随意拖动。
4.2 绘制双坐标轴:
'''Secondary axis'''fig_doubleaxis=make_subplots(specs=[[{'secondary_y':True}]])#Add tricefig_doubleaxis.add_trace(go.Scatter(x=raw.index,y=raw['SPEED rpm'],name='Engine Speed [RPM]'),secondary_y=False,)fig_doubleaxis.add_trace(go.Scatter(x=raw.index,y=raw['TORQUE Nm'],name='Engine TORQUE [Nm]'),secondary_y=True,)# Add title
fig_doubleaxis.update_layout(title_text='<b>Double Y Axis Example<b>')
#Set x-axis title
fig_doubleaxis.update_xaxes(title_text='<b>Time Step [ms] <b>')
#Set y-axes titles
fig_doubleaxis.update_yaxes(title_text='<b>Engine Torque [Nm] </b>',secondary_y=True)
fig_doubleaxis.update_yaxes(title_text='<b>Engine Speed [rpm] </b>',secondary_y=False)
# Set Figure Size
fig_doubleaxis.update_layout(autosize=False, width=1500,height=800)plot(fig_doubleaxis,filename='doubleaxis.html',)
图像示例如下:
4.3 绘制多坐标轴:
'''Multi Axes'''fig_multi=go.Figure()fig_multi.add_trace(go.Scatter(x=raw.index,y=raw['SPEED rpm'],name='Engine Speed Rpm',yaxis='y1'
))fig_multi.add_trace(go.Scatter(x=raw.index,y=raw['TORQUE Nm'],name='TORQUE Nm',yaxis='y2'
))fig_multi.add_trace(go.Scatter(x=raw.index,y=raw['ALPHA %'],name='ALPHA %',yaxis='y3'
))fig_multi.add_trace(go.Scatter(x=raw.index,y=raw['P kW'],name='P kW',yaxis='y4'
))# Create axis objectsfig_multi.update_layout(xaxis=dict(domain=[0.2,0.8], title='Time Step [ms]'),yaxis=dict(title='Engine Speed Rpm',titlefont=dict(color='#1f77b4'),tickfont=dict(color='#1f77b4')),yaxis2=dict(title="TORQUE Nm",titlefont=dict(color="#ff7f0e"),tickfont=dict(color="#ff7f0e"),anchor="free",overlaying="y",side="left",position=0.1),yaxis3=dict(title="ALPHA %",titlefont=dict(color="#d62728"),tickfont=dict(color="#d62728"),anchor="x",overlaying="y",side="right"),yaxis4=dict(title="P kW",titlefont=dict(color="#9467bd"),tickfont=dict(color="#9467bd"),anchor="free",overlaying="y",side="right",position=0.9)
)# Update layout properties
fig_multi.update_layout(title_text='<b>Engine data Overview<b>',width=1600,height=800)plot(fig_multi,filename='multi axis.html')
可通过调整xaxis的domain和yaxis的position来调整轴和图的相对位置,多试几次就好了。
图像示例如下:
4.4 绘制subplots:
'''Subplots'''# subplot layout 2*2
fig_sub=make_subplots(rows=2,cols=2,specs=[[{'secondary_y':True},{'secondary_y':True}],[{'secondary_y':False},{'secondary_y':False}]])# Top left
fig_sub.add_trace(go.Scatter(x=raw.index,y=raw['SPEED rpm'],name='Engine Speed Rpm'),row=1,col=1,secondary_y=False)
fig_sub.add_trace(go.Scatter(x=raw.index,y=raw['TORQUE Nm'],name='Engine Torque Nm'),row=1,col=1,secondary_y=True)# Top right
fig_sub.add_trace(go.Scatter(x=raw.index,y=raw['T_EXH ?C'],name='T3 °C'),row=1,col=2,secondary_y=False)
fig_sub.add_trace(go.Scatter(x=raw.index,y=raw['ALPHA %'],name='ALPHA %'),row=1,col=2,secondary_y=True)# Bottom left
fig_sub.add_trace(go.Scatter(x=raw.index,y=raw['P_EFF_ME kPa'],name='P_EFF_ME kPa'),row=2,col=1,secondary_y=False)# Bottom right
fig_sub.add_trace(go.Scatter(x=raw.index, y=raw['T_OIL ?C'], name="T_OIL °C"),row=2, col=2, secondary_y=False)fig_sub.update_layout(title_text='Multiple Y subplots')
plot(fig_sub,filename='multi subplots.html')
图像示例如下:
大功告成,这下以后做数据比对终于可以摆脱excel了。
关于作图部分,plotly的功能非常强大,具体可参考plotly官网,上面有详细的指导说明。
更多推荐
利用python实现发动机台架数据可视化
发布评论