学了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)/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,结果如下:
至此,对文件的表格处理告一段落。
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 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',)
图像示例如下:
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来调整轴和图的相对位置,多试几次就好了。
图像示例如下:
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官网,上面有详细的指导说明。