用Python追踪我的减肥历程:Pandas + Matplotlib数据可视化实战(简单版)
前言
2026年4月18日,我开始了自己的健康管理计划。作为一个数据爱好者,我决定不仅仅记录体重变化,更要用代码来分析和可视化这段旅程。本文将分享如何使用 Pandas 和 Matplotlib 构建一个个人体重追踪系统,从数据清洗到可视化呈现的完整流程。
一、项目背景与目标
为什么做这个分析?
量化进步:数字比感觉更真实
发现规律:通过数据找到影响体重的关键因素
保持动力:可视化成果是最好的激励
技术实践:将学到的数据分析技能应用到真实场景
技术栈选择
Pandas:数据处理与分析
Matplotlib:数据可视化
Jupyter Notebook:交互式开发环境
NumPy:数值计算支持
二、数据结构设计
首先,我需要设计一个简洁但信息丰富的数据格式。最终确定的CSV结构如下:
-------------------------------------------------------------------------------------------------------
Csv
日期,体重斤,备注
2026-04-18,162.0,起始日 开始控制饮食
2026-04-19,159.0,饮食维持 无运动
2026-04-20,158.8,首次快走50分钟7000步 接下来每天都快走
...
--------------------------------------------------------------------------------------------------------
设计思路:
-日期:时间维度,用于趋势分析
-体重斤:核心指标(使用"斤"而非"公斤",更符合日常习惯)
-备注:记录当天的特殊情况(饮食、运动、情绪等),为后续分析提供上下文
三、核心代码实现
3.1 环境配置与数据读取
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示和负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据并转换日期格式
df = pd.read_csv('weight_data.csv')
df['日期'] = pd.to_datetime(df['日期'])
关键点说明:
---plt.rcParams 配置解决了Matplotlib中文乱码问题
---pd.to_datetime() 将字符串日期转换为datetime对象,便于时间序列操作
3.2 基础统计分析
# 提取关键指标
start_weight = df.iloc[0]['体重斤']
end_weight = df.iloc[-1]['体重斤']
total_loss = start_weight - end_weight
days = (df.iloc[-1]['日期'] - df.iloc[0]['日期']).days
print("=== 减肥历程数据分析 ===")
print(f"起始体重: {start_weight} 斤")
print(f"当前体重: {end_weight} 斤")
print(f"累计减重: {total_loss:.1f} 斤")
print(f"坚持天数: {days} 天")
print(f"平均速度: {total_loss/days:.2f} 斤/天")
输出结果:

分析洞察:
--29天减重13.8斤,平均每天0.48斤,这是一个健康的减重速度
--世界卫生组织建议的安全减重速度是每周0.5-1公斤(约1-2斤/周),我的节奏略快但仍在合理范围内
3.3 计算每日变化量
# 使用diff()方法计算相邻两天的体重差值
df['每日变化'] = df['体重斤'].diff()
diff()是 pandas 的强大功能,自动计算当前行与上一行的差值,所以可以直接得出每日变化
第一天没有前一天的数据,所以值为NaN
3.4 双图层可视化设计
这是整个项目的核心亮点——上下联动的双图表布局:
# 创建2行1列的子图,高度比例为5:2
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10),
gridspec_kw={'height_ratios': [5, 2]})
分割出俩个图表; 称上图和下图
上图:体重趋势折线图
#上图
# 绘制体重曲线
ax1.plot(df['日期'], df['体重斤'], marker='o', linestyle='-',
color='#1f77b4', label='体重记录', markersize=5)
# 添加目标参考线
ax1.axhline(y=150, color='r', linestyle='--', alpha=0.6, label='150斤目标线')
# 自动标注关键事件
key_events = df[df['备注'].str.contains('跌破|新低|起始', na=False)]
for _, row in key_events.iterrows():
ax1.annotate(f"{row['体重斤']}斤",
xy=(row['日期'], row['体重斤']),
xytext=(0, 10), textcoords='offset points',
ha='center', fontsize=9, color='darkred')
ax1.set_title('2026年个人体重变化追踪', fontsize=16)
ax1.set_ylabel('体重 (斤)')
ax1.legend(loc='upper right')
ax1.grid(True, linestyle='--', alpha=0.3)
设计亮点:
1.目标线可视化:红色虚线标记150斤目标,直观看到何时达成
2.智能标注:通过关键词匹配("跌破"、"新低"、"起始")自动标注里程碑事件
3.色彩心理学:蓝色主色调传递冷静、专业的感觉
下图:每日增减柱状图
# 下图
# 绿色代表减重,红色代表增重
colors = ['#2ca02c' if x < 0 else '#d62728' for x in df['每日变化']]
ax2.bar(df['日期'], df['每日变化'].fillna(0), color=colors, width=0.8)
ax2.axhline(y=0, color='black', linewidth=0.8)
ax2.set_title('每日体重波动分析', fontsize=14)
ax2.set_ylabel('变化量 (斤)')
ax2.grid(axis='y', linestyle='--', alpha=0.3)
设计亮点:
1.条件着色:减重用绿色(积极),增重用红色(警示),符合直觉
2.零基准线:黑色横线清晰区分正负变化
3.波动可视化:柱状图比折线图更能体现每日的"跳跃感"
3.5 保存与展示
plt.tight_layout() # 自动调整子图间距
plt.savefig('weight_analysis.png', dpi=150, bbox_inches='tight')
plt.show()
注意事项:
tight_layout() 避免标签重叠
bbox_inches='tight' 确保保存图片时不裁剪边缘
dpi=150 平衡清晰度和文件大小
四、数据洞察与发现
通过分析这29天的数据,我发现了几个有趣的现象:
4.1 阶段性突破
第1周(4.18-4.25):快速下降期,从162斤降至154斤
主要驱动力:饮食控制 + 开始运动
关键事件:4.22首次有效服药(药物为奥利斯他,只能起到纯辅助作用,几乎没有副作用),4.25跌破155斤
第2-3周(4.26-5.08):平台突破期,从153.8斤降至149.8斤
挑战:聚会、情绪波动、身体不适
突破:5.08跌破150斤大关
第4周(5.09-5.17):稳定巩固期,维持在148-150斤区间
策略调整:纯饮食控制,暂停运动
新低:5.16达到148.4斤
4.2意外发现
"钠锁水"效应:5.2摄入高钠食物后,5.3体重回升0.6斤,但5.4钠消退后又下降
糖醇陷阱:无糖薄荷糖虽然0热量,但糖醇导致腹泻和锁水,反而影响体重
排便影响:5.13未排便导致体重虚高0.3斤,5.14排便后立即创新低
五,展示效果
代码运行效果为
=== 减肥历程数据分析 ===
起始体重: 162.0 斤
当前体重: 148.2 斤
累计减重: 13.8 斤
坚持天数: 29 天
平均速度: 0.48 斤/天

#并附带详细在cvg中的记录和事件,可一图观看
#代码结束
---------------------------------------------------------------------------------------------------------------------------------
六、改进方向与未来计划
短期优化
1.增加更多指标:
2.添加BMI计算
3.记录每日步数、运动时长
4.记录卡路里摄入
增强可视化:
1.添加7日移动平均线,平滑波动
2.使用热力图展示每周规律
3.添加预测趋势线
自动化报告:
1.每周自动生成总结邮件
2.异常波动提醒(如单日增重超过2斤)
6.2 长期规划
1,机器学习预测:
# 未来可以尝试
from sklearn.linear_model import LinearRegression
# 基于历史数据预测未来体重趋势
2.Web应用化:
--使用Streamlit构建交互式Dashboard
--手机端随时查看和记录
3.多维度关联分析
--睡眠质量 vs 体重变化
--压力水平 vs 饮食失控
--月经周期 vs 体重波动(若为女性)
七、简单完整代码汇总
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('weight_data.csv')
df['日期'] = pd.to_datetime(df['日期'])
# 基础统计
start_weight = df.iloc[0]['体重斤']
end_weight = df.iloc[-1]['体重斤']
total_loss = start_weight - end_weight
days = (df.iloc[-1]['日期'] - df.iloc[0]['日期']).days
print("=== 减肥历程数据分析 ===")
print(f"起始体重: {start_weight} 斤")
print(f"当前体重: {end_weight} 斤")
print(f"累计减重: {total_loss:.1f} 斤")
print(f"坚持天数: {days} 天")
print(f"平均速度: {total_loss/days:.2f} 斤/天")
# 计算每日变化
df['每日变化'] = df['体重斤'].diff()
# 创建双图层
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10),
gridspec_kw={'height_ratios': [5, 2]})
# 上图:体重趋势
ax1.plot(df['日期'], df['体重斤'], marker='o', linestyle='-',
color='#1f77b4', label='体重记录', markersize=5)
ax1.axhline(y=150, color='r', linestyle='--', alpha=0.6, label='150斤目标线')
key_events = df[df['备注'].str.contains('跌破|新低|起始', na=False)]
for _, row in key_events.iterrows():
ax1.annotate(f"{row['体重斤']}斤",
xy=(row['日期'], row['体重斤']),
xytext=(0, 10), textcoords='offset points',
ha='center', fontsize=9, color='darkred')
ax1.set_title('2026年个人体重变化追踪', fontsize=16)
ax1.set_ylabel('体重 (斤)')
ax1.legend(loc='upper right')
ax1.grid(True, linestyle='--', alpha=0.3)
# 下图:每日波动
colors = ['#2ca02c' if x < 0 else '#d62728' for x in df['每日变化']]
ax2.bar(df['日期'], df['每日变化'].fillna(0), color=colors, width=0.8)
ax2.axhline(y=0, color='black', linewidth=0.8)
ax2.set_title('每日体重波动分析', fontsize=14)
ax2.set_ylabel('变化量 (斤)')
ax2.grid(axis='y', linestyle='--', alpha=0.3)
plt.tight_layout()
plt.savefig('weight_analysis.png', dpi=150, bbox_inches='tight')
plt.show()
八、结语
这个项目让我深刻体会到数据驱动决策的力量。通过简单的Python代码,我不仅记录了体重变化,更发现了隐藏在数据背后的规律:
&量化让进步可见:13.8斤的数字比"瘦了一圈"更有说服力
& 波动是正常的:不要因为某天的体重上升而焦虑,看长期趋势
& 细节决定成败:钠摄入、睡眠质量、情绪状态都会影响结果
& 技术赋能生活:用编程技能解决实际问题,成就感满满
如果你也在进行健康管理,不妨试试用代码来追踪和分析。这不仅是一个技术练习,更是一次自我认知的旅程。
最后送给大家一句话:
"你无法管理你无法衡量的东西。" —— 彼得·德鲁克
---------------------------------------------------------------------------------------------------------------------------------
Pandas官方文档:https://pandas.pydata.org/docs/
Matplotlib用户指南:https://matplotlib.org/stable/users/index.html
《利用Python进行数据分析》- Wes McKinney
更多推荐



所有评论(0)