Python 案例:显示体能消耗数据差异
下面是一个完整的 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
# ========== 1. 构造体能消耗数据(单位:千卡/小时) ==========
data = {
'运动项目': ['慢跑', '快跑', '游泳', '骑行', '跳绳', '瑜伽', '篮球'],
'男性': [600, 900, 750, 550, 880, 250, 700],
'女性': [500, 750, 650, 450, 750, 200, 580]
}
df = pd.DataFrame(data)
print("体能消耗数据:\n", df)
# ========== 2. 计算差异 ==========
df['差值(男-女)'] = df['男性'] - df['女性']
df['差异百分比(%)'] = (df['差值(男-女)'] / df['女性'] * 100).round(1)
print("\n差异分析:\n", df)
# ========== 3. 分组柱状图对比 ==========
x = np.arange(len(df['运动项目']))
width = 0.35
fig, axes = plt.subplots(1, 2, figsize=(15, 6))
# 左图:男性 vs 女性消耗对比
axes[0].bar(x - width/2, df['男性'], width, label='男性', color='#4A90E2')
axes[0].bar(x + width/2, df['女性'], width, label='女性', color='#E94B6B')
axes[0].set_xticks(x)
axes[0].set_xticklabels(df['运动项目'])
axes[0].set_ylabel('消耗 (千卡/小时)')
axes[0].set_title('男女体能消耗对比')
axes[0].legend()
axes[0].grid(axis='y', alpha=0.3)
# 右图:差异百分比
colors = ['#2ECC71' if v > 0 else '#E74C3C' for v in df['差异百分比(%)']]
axes[1].bar(df['运动项目'], df['差异百分比(%)'], color=colors)
axes[1].axhline(0, color='black', linewidth=0.8)
axes[1].set_ylabel('差异百分比 (%)')
axes[1].set_title('男性相对女性的消耗差异(%)')
axes[1].grid(axis='y', alpha=0.3)
for i, v in enumerate(df['差异百分比(%)']):
axes[1].text(i, v + 0.8, f'{v}%', ha='center', fontsize=10)
plt.tight_layout()
plt.show()
输出结果示例
体能消耗数据:
运动项目 男性 女性
0 慢跑 600 500
1 快跑 900 750
2 游泳 750 650
3 骑行 550 450
4 跳绳 880 750
5 瑜伽 250 200
6 篮球 700 580
差异分析:
运动项目 男性 女性 差值(男-女) 差异百分比(%)
0 慢跑 600 500 100 20.0
1 快跑 900 750 150 20.0
2 游泳 750 650 100 15.4
3 骑行 550 450 100 22.2
4 跳绳 880 750 130 17.3
5 瑜伽 250 200 50 25.0
6 篮球 700 580 120 20.7
案例分析要点
1️⃣ 数据差异体现方式
| 方式 | 说明 |
|---|---|
| 绝对差值 | 男性 - 女性(千卡) |
| 百分比差异 | (差值 / 女性) × 100% |
| 可视化对比 | 分组柱状图 + 差异图 |
2️⃣ 图表设计思路
- 左图:直观展示两组绝对值对比,颜色区分性别
- 右图:突出差异,用绿色表示男性更高、红色表示更低,加百分比标注
- 零线参考:
axhline(0)快速识别正负差异
3️⃣ 可扩展方向
# 加一个总体统计
print(f"\n平均差异:{df['差值(男-女)'].mean():.1f} 千卡")
print(f"差异最大项:{df.loc[df['差值(男-女)'].idxmax(), '运动项目']}")
4️⃣ 注意点
- ⚠️ 实际数据需按体重标准化(如 千卡/kg/小时),否则差异可能来自体重而非性别
- ⚠️ 建议用 Seaborn 的
boxplot展示真实大样本分布,比单均值更有说服力
如果你有具体的数据文件(CSV/Excel),我可以把案例改成直接读取真实数据的版本 👇