fitparse是一个用于解析 Garmin .FIT 文件的Python库。
本文中主要用到fitparse库来解析、提取数据;maplotlib库用来进行可视化绘制。
定义get_fit_list函数,其功能为:读取fit文件中的全部数据,并返回一个list。
使用fitparse.FitFile()函数读取fit文件,返回一个FitFile对象,使用list方法将其转换成list,其中每个元素为一个DataMessage对象。
def get_fit_list(file_name):
m_fit_file = fitparse.FitFile(file_name)
return list(m_fit_file.get_messages())
获取数据list后,使用DataMessage.get_value()方法获取指定的字段。例如heartrate、 power、 cadence等。
m_fit_file = get_fit_list(file_name)
for i in m_fit_file:
m_heart_rate.append(i.get_value('heart_rate'))
m_power.append(i.get_value('power'))
matplotlib参数进行初始设置:
matplotlib.rc('figure', figsize=(40, 10)) # 图片大小,单位厘米
matplotlib.rc('font', size=20) # 字体大小
matplotlib.rc('axes', grid=False) # 是否显示网格
matplotlib.rc('axes', facecolor='white') # 背景颜色
plt.title('Entire Workout')
plt.xlabel('Time(s)') # 横坐标
划分功率区间zone1到zone7,将功率数据分类,具体分类见下表:
zone1 | 主动恢复区 | FTP的55%以下 |
zone2 | 有氧耐力区 | FTP的55%~75% |
zone3 | 节奏强度或高阶有氧区 | FTP的75%~90% |
zone4 | 乳酸强度区 | FTP的90%~105% |
zone5 | 最大摄氧量强度区 | FTP的105%~120% |
zone6 | 无氧能力强度区 | FTP的120%~150% |
zone7 | 神经肌肉能力区 | FTP的150%以上 |
data_len = len(m_power)
z1 = [0] * data_len
z2 = [0] * data_len
z3 = [0] * data_len
z4 = [0] * data_len
z5 = [0] * data_len
z6 = [0] * data_len
z7 = [0] * data_len
for i in range(len(m_power)):
df = m_power[i]
if df != None:
if df >= 0 and df <= 0.5 * ftp:
z1[i] = df
if df > 0.5 * ftp and df <= 0.75 * ftp:
z2[i] = df
if df > 0.75 * ftp and df <= 0.9 * ftp:
z3[i] = df
if df > 0.9 * ftp and df <= 1.05 * ftp:
z4[i] = df
if df > 1.05 * ftp and df <= 1.2 * ftp:
z5[i] = df
if df > 1.2 * ftp and df <= 1.5 * ftp:
z6[i] = df
if df > 1.5 * ftp:
z7[i] = df
绘制心率曲线图,并标记max heart rate:
plt.plot(m_heart_rate, label='HeartRate', linewidth=1, color='red')
max_HR = max(m_heart_rate)
max_HR_Index = m_heart_rate.index(max_HR)
max_hr = 'Max HR:' + str(max_HR)
plt.annotate(max_hr, (max_HR_Index, max_HR), color='red')
根据功率区间按照不同颜色绘图:
_x = np.arange(len(m_power))
plt.bar(_x, z1, color='grey')
plt.bar(_x, z2, color='royalblue')
plt.bar(_x, z3, color='lime')
plt.bar(_x, z4, color='orange')
plt.bar(_x, z5, color='red')
plt.bar(_x, z6, color='firebrick')
plt.bar(_x, z7, color='darkred')
plt.savefig("fit_analyze.jpg")
绘图结果: