利用python实现发动机台架数据可视化

编程入门 行业动态 更新时间:2024-10-25 11:21:15

利用python实现发动机<a href=https://www.elefans.com/category/jswz/34/1718932.html style=台架数据可视化"/>

利用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实现发动机台架数据可视化

本文发布于:2024-03-07 21:13:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718929.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:台架   发动机   数据   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!