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

本文介绍使用Python和Plotly库处理发动机台架测试数据,包括数据预处理、时间序列转换及多类型图表可视化,如单轴、双轴、多轴和子图,提升数据分析效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学了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,返回结果如下:
文件表头2
成功的把表头合并了。

因为现在的表格是从1开始索引,如果想在作图时把x轴设置为时间,需要重新构建表格的index。

''' 将毫秒数据转化为秒,作为raw的index'''
L=[]
for i in raw['recorder_time ms']:
    i=float(i)/1000
    L.append(i)
raw.index=L
raw.index.name='recorder_time s'
raw.drop(columns=('recorder_time ms'),inplace=True)  

这里把recoder_time的毫秒数据转化为秒,作为index。
调用raw,结果如下:
文件表头3
至此,对文件的表格处理告一段落。

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显示图像。

图例如下:

one axis
使用plotly的优点是随着鼠标光标移动可以直观的显示数值,而且坐标轴可以随意拖动。

4.2 绘制双坐标轴:

'''Secondary axis'''

fig_doubleaxis=make_subplots(specs=[[{'secondary_y':True}]])


#Add trice

fig_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',)   

图像示例如下:

double axes

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 objects

fig_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来调整轴和图的相对位置,多试几次就好了。
图像示例如下:
multiaxes
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')



图像示例如下:
subplots

大功告成,这下以后做数据比对终于可以摆脱excel了。
关于作图部分,plotly的功能非常强大,具体可参考plotly官网,上面有详细的指导说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值