matplotlib画双轴折线图

matplotlib画双轴折线图

绘制次坐标轴

ax1=plt.gca()
ax1.set_ylabel(u"单体电池电压(V)")
ax2=ax1.twinx()                     #次坐标轴
ax2.set_ylim(-0.5, 1.5)              #根据需要设置次坐标轴的范围
ax2.plot(df1['采集时间'],voltage_split['charge_state'],'r')  #绘制对应次坐标轴的曲线

原始数据(截取了前5条),其中单体电池电压-1中有96个电压值,最后一个值带单位“V”
matplotlib画双轴折线图_第1张图片

# -*- coding:utf-8 -*-


以下程序修改文件路径可直接在导出的RTM报文上运行,无需在excel中进行预处理
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

plt.rcdefaults()
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题


df1=pd.read_excel("D:/车辆历史状态监控数据0504至0509.xlsx",sheet_name='车况历史数据')


'''96个单体电池电压跟时间的曲线'''
voltage_split=df1['单体电池电压-1'].str.split(',',expand=True)     #将单体电池电压字段分成96列
voltage_split[95]=voltage_split[95].str.split('V',expand=True)[0]    #去掉最后一列电压的单位“V”
voltage_split=voltage_split.astype(float)
voltage_split['极大值']=voltage_split.max(axis=1)  #计算每行电压的最大值
voltage_split['charge_state']=df1['充电状态'].apply(lambda x: 0 if x=='NO_CHARGING' else 1)  #NO_CHARGING记为0,其他记为1,画出充电状态图用于理解电压变化曲线

for i in range(0,96):
    plt.plot(df1['采集时间'],voltage_split[i])    #X轴为采集时间,Y轴为电压,画96条线
plt.plot(df1['采集时间'],voltage_split['极大值'],'ro',ms=1)  #每个时间的极大值用‘bo’表示画蓝点
ax1=plt.gca()
ax1.set_ylabel(u"电压(V)")
ax2=ax1.twinx()                     #次坐标轴,用于画充电状态折线
ax2.set_ylim(-0.5, 1.5)
ax2.plot(df1['采集时间'],voltage_split['charge_state'],'y')
ax2.set_ylabel(u"充电状态(0表示不在充电,1表示充电中)")
plt.plot(df1['采集时间'],voltage_split['极大值'],'ro',ms=2)  #我也不知道为什么要画两次,但注释掉这条的话下面的图例就无法显示单体电池电压
plt.legend(['充电状态','电压'])
plt.show()

运行结果:
matplotlib画双轴折线图_第2张图片

你可能感兴趣的:(python)