本文目录导读:

我来为您分析一个展示体能消耗数据差异的Python案例,这个案例会比较不同运动方式、不同人群的体能消耗差异:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据
def create_exercise_data():
"""创建不同运动方式的体能消耗数据"""
data = {
'运动方式': ['跑步', '游泳', '骑行', '瑜伽', '力量训练', '登山', '跳绳', '散步'],
'卡路里消耗(kcal/h)': [600, 700, 500, 200, 400, 550, 800, 150],
'心率提升(bpm)': [150, 145, 130, 90, 120, 140, 160, 85],
'运动强度指数': [8.5, 9.0, 7.5, 3.5, 6.5, 8.0, 9.5, 2.5]
}
return pd.DataFrame(data)
def create_personal_data():
"""创建不同人群的体能数据"""
data = {
'人群': ['普通上班族', '业余运动员', '专业运动员', '老年人', '青少年', '健身爱好者'],
'基础代谢率(BMR)': [1500, 1800, 2200, 1200, 1600, 2000],
'最大摄氧量(VO2max)': [35, 45, 65, 28, 40, 55],
'静息心率(bpm)': [75, 60, 55, 80, 70, 62]
}
return pd.DataFrame(data)
# 1. 不同运动方式消耗对比
def plot_exercise_comparison():
"""绘制不同运动方式的消耗对比"""
df = create_exercise_data()
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 1.1 柱状图 - 卡路里消耗
ax1 = axes[0, 0]
bars = ax1.bar(df['运动方式'], df['卡路里消耗(kcal/h)'], color='skyblue', edgecolor='navy')
ax1.set_title('不同运动方式卡路里消耗对比', fontsize=14, fontweight='bold')
ax1.set_xlabel('运动方式')
ax1.set_ylabel('卡路里消耗 (kcal/h)')
ax1.tick_params(axis='x', rotation=45)
# 添加数据标签
for bar in bars:
height = bar.get_height()
ax1.text(bar.get_x() + bar.get_width()/2., height + 10,
f'{int(height)}', ha='center', va='bottom', fontweight='bold')
# 1.2 条形图 - 运动强度
ax2 = axes[0, 1]
colors = plt.cm.RdYlGn(df['运动强度指数'] / max(df['运动强度指数']))
bars2 = ax2.barh(df['运动方式'], df['运动强度指数'], color=colors)
ax2.set_title('不同运动方式强度指数', fontsize=14, fontweight='bold')
ax2.set_xlabel('强度指数')
# 在条上添加数值
for i, (v, bar) in enumerate(zip(df['运动强度指数'], bars2)):
ax2.text(v, i, f' {v:.1f}', va='center', fontweight='bold')
# 1.3 散点图 - 心率与卡路里关系
ax3 = axes[1, 0]
scatter = ax3.scatter(df['心率提升(bpm)'], df['卡路里消耗(kcal/h)'],
s=100, c=df['运动强度指数'], cmap='viridis')
ax3.set_title('心率提升与卡路里消耗关系', fontsize=14, fontweight='bold')
ax3.set_xlabel('心率提升 (bpm)')
ax3.set_ylabel('卡路里消耗 (kcal/h)')
# 标注每种运动
for i, row in df.iterrows():
ax3.annotate(row['运动方式'],
(row['心率提升(bpm)'], row['卡路里消耗(kcal/h)']),
xytext=(5, 5), textcoords='offset points', fontsize=9)
plt.colorbar(scatter, ax=ax3, label='强度指数')
# 1.4 雷达图 - 综合对比(选择主要运动)
ax4 = axes[1, 1]
main_exercises = ['跑步', '游泳', '力量训练', '登山', '跳绳']
metrics = ['卡路里消耗', '心率提升', '强度指数']
# 归一化数据
radar_data = df[df['运动方式'].isin(main_exercises)].copy()
angles = np.linspace(0, 2 * np.pi, len(metrics), endpoint=False).tolist()
angles += angles[:1]
for idx, (_, row) in enumerate(radar_data.iterrows()):
values = [
row['卡路里消耗(kcal/h)'] / 10,
row['心率提升(bpm)'] / 2,
row['运动强度指数']
]
values += values[:1]
# 归一化
values_norm = [v / max(values) * 100 if '卡路里' in metrics[i] else v / 80 * 100
for i, v in enumerate(values)]
ax4.plot(angles, values_norm, 'o-', linewidth=2, label=row['运动方式'])
ax4.fill(angles, values_norm, alpha=0.25)
ax4.set_title('主要运动综合对比', fontsize=14, fontweight='bold')
ax4.set_xticks(angles[:-1])
ax4.set_xticklabels(metrics)
ax4.set_ylim(0, 100)
ax4.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
ax4.grid(True)
plt.tight_layout()
plt.savefig('exercise_comparison.png', dpi=300, bbox_inches='tight')
plt.show()
# 2. 不同人群体能差异
def plot_personal_comparison():
"""展示不同人群的体能数据差异"""
df = create_personal_data()
fig, axes = plt.subplots(1, 3, figsize=(16, 6))
# 2.1 基础代谢率对比
ax1 = axes[0]
bars = ax1.bar(df['人群'], df['基础代谢率(BMR)'],
color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', '#DDA0DD'])
ax1.set_title('不同人群基础代谢率对比', fontsize=14, fontweight='bold')
ax1.set_ylabel('基础代谢率 (kcal/day)')
ax1.tick_params(axis='x', rotation=45)
for bar in bars:
height = bar.get_height()
ax1.text(bar.get_x() + bar.get_width()/2., height + 20,
f'{int(height)}', ha='center', va='bottom', fontweight='bold')
# 2.2 最大摄氧量对比
ax2 = axes[1]
bars2 = ax2.bar(df['人群'], df['最大摄氧量(VO2max)'],
color=['#FF8A5C', '#A8E6CF', '#FFB6C1', '#98D8C8', '#FFD93D', '#FF8C94'])
ax2.set_title('最大摄氧量对比 (VO2max)', fontsize=14, fontweight='bold')
ax2.set_ylabel('VO2max (ml/kg/min)')
ax2.tick_params(axis='x', rotation=45)
for bar in bars2:
height = bar.get_height()
ax2.text(bar.get_x() + bar.get_width()/2., height + 0.5,
f'{height:.0f}', ha='center', va='bottom', fontweight='bold')
# 2.3 心率对比表
ax3 = axes[2]
ax3.axis('off')
table_data = df[['人群', '静息心率(bpm)']].copy()
# 创建表格
table = ax3.table(cellText=table_data.values,
colLabels=['人群', '静息心率'],
cellLoc='center', loc='center')
table.auto_set_font_size(False)
table.set_fontsize(10)
table.scale(1.2, 1.5)
# 给表格添加颜色
for i in range(len(table_data)):
if table_data.iloc[i, 1] < 60:
table[(i+1, 1)].set_facecolor('#90EE90') # 绿色 - 优秀
elif table_data.iloc[i, 1] < 70:
table[(i+1, 1)].set_facecolor('#FFD700') # 黄色 - 良好
else:
table[(i+1, 1)].set_facecolor('#FF6B6B') # 红色 - 需注意
ax3.set_title('静息心率对比', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('personal_comparison.png', dpi=300, bbox_inches='tight')
plt.show()
# 3. 数据分析函数
def analyze_data():
"""进行详细的数据分析"""
df_exercise = create_exercise_data()
df_personal = create_personal_data()
print("=" * 60)
print("体能消耗数据分析报告")
print("=" * 60)
# 运动数据分析
print("\n【运动方式分析】")
max_cal = df_exercise.loc[df_exercise['卡路里消耗(kcal/h)'].idxmax()]
min_cal = df_exercise.loc[df_exercise['卡路里消耗(kcal/h)'].idxmin()]
print(f"最高卡路里消耗运动: {max_cal['运动方式']} - {max_cal['卡路里消耗(kcal/h)']} kcal/h")
print(f"最低卡路里消耗运动: {min_cal['运动方式']} - {min_cal['卡路里消耗(kcal/h)']} kcal/h")
print(f"最大消耗差距: {max_cal['卡路里消耗(kcal/h)'] - min_cal['卡路里消耗(kcal/h)']} kcal/h")
# 人群差异分析
print("\n【人群体能差异】")
max_bmr = df_personal.loc[df_personal['基础代谢率(BMR)'].idxmax()]
min_bmr = df_personal.loc[df_personal['基础代谢率(BMR)'].idxmin()]
print(f"最高基础代谢群体: {max_bmr['人群']} - {max_bmr['基础代谢率(BMR)']} kcal/day")
print(f"最低基础代谢群体: {min_bmr['人群']} - {min_bmr['基础代谢率(BMR)']} kcal/day")
print(f"代谢率差异比例: {max_bmr['基础代谢率(BMR)'] / min_bmr['基础代谢率(BMR)']:.1f}倍")
# 相关性分析
corr_cal_hr = df_exercise['卡路里消耗(kcal/h)'].corr(df_exercise['心率提升(bpm)'])
print(f"\n【相关性分析】")
print(f"卡路里消耗与心率相关性: {corr_cal_hr:.2f}")
# 计算建议
print("\n【个性化建议】")
print("1. 高强度运动(跳绳/游泳): 适合快速减脂,但注意心率控制")
print("2. 中等强度(跑步/登山): 适合健康维护,建议每周3-5次")
print("3. 低强度(散步/瑜伽): 适合恢复期和初学者")
return df_exercise, df_personal
# 主程序
if __name__ == "__main__":
# 运行数据分析
df_ex, df_per = analyze_data()
# 生成可视化图表
plot_exercise_comparison()
plot_personal_comparison()
print("\n图表已保存到当前目录")
这个案例的特点:
📊 主要功能
-
多维度数据对比
- 8种不同运动方式的卡路里消耗
- 6类不同人群的体能指标
- 心率、强度等多参数对比
-
丰富的可视化
- 柱状图:直观对比数据
- 雷达图:综合评估多维度
- 散点图:展示数据关联
- 表格:精确数值显示
-
数据分析功能
- 自动找出最大值/最小值
- 计算差异比例
- 相关性分析
- 个性化建议
🎯 展示的核心差异
- 运动方式差异:跳绳(800kcal/h) vs 散步(150kcal/h),差5.3倍
- 人群差异:专业运动员基础代谢是老年人的1.8倍
- 强度与效果关系:心率越高,通常消耗越多
这个案例能很好地展示体能消耗数据的差异,既有数据对比又有可视化呈现,方便理解和分析!