转眼2021年过去了,许多app都推出了年度总结,本次通过使用Python中的第三方库pyecharts,绘制日历图和折线图,可视化地展示2021年的运动数据。
除了必要的Python3.x环境还需要安装第三方库:pyecharts
pip install pyecharts
本次使用的是真实的小米运动数据,需要手动将小米运动数据导出,我整理了一份数据导出流程以供参考。
1.进入小米运动,点击【我的】,点击【设置】
2.选择【账号与安全】
3.点击下面【注销账号】
4.选择【导出数据】,然后选确定
5.选择要导出的【数据】以及【日期】
6.输入邮箱地址以及验证码,导出成功
7.进入邮箱,点击链接
8.输入密码,下载数据
9.解压缩包,查看数据
原始数据格式为csv格式,使用逗号分隔每个数据,数据分为五列,分别是日期、步数、步行距离、运动距离、卡路里消耗。
使用日历图能够直观的表示出每一天的运动情况,通过设置合适的图例,能够筛选出对应区间的数据。
这里放一张gif演示一下。
此折线图按月统计每月的步数、步行距离、卡路里消耗,可以看到三个数据是成正比的,其中九月运动量较少,十二月运动量最多。
from pyecharts import options as opts
from pyecharts.charts import Calendar,Line
from pyecharts.globals import ThemeType
"""
将我的运动数据从csv读入,使用日历图展示每天步数,使用折线图展示多个数据
"""
class Sport_Data_Analysis:
def __init__(self):
self.csv_file="./my_data.csv"
def read_csv(self):
with open(self.csv_file,'r',encoding="utf-8-sig") as f:
data=f.readlines()
return data
def data_format(self,src_data):
"""
对读入的csv数据进行整理,
:param src_data:
:return:
"""
data_list=[]
for line in src_data:
item={}
item['date']=line.split(",")[0]
item['steps']=line.split(",")[1]
item['distance']=line.split(",")[2]
item['calories']=line.split(",")[-1].rstrip()
data_list.append(item)
return data_list
def draw_steps_calendar(self,data):
"""
绘制日历图
# 标签内容格式器,支持字符串模板和回调函数两种形式,字符串模板与回调函数返回的字符串均支持用 \n 换行。
# 字符串模板 模板变量有:
# {a}:系列名。
# {b}:数据名。
# {c}:数据值。
:param data:
:param type_:
:return:
"""
c = (
Calendar(opts.InitOpts(
page_title=f"2021年小米运动步数统计情况-日历图", # 网页标题
theme=ThemeType.MACARONS, # 使用自带主题
))
.add("", data, calendar_opts=opts.CalendarOpts(range_="2021") # 选择日历图展示的年份为2021
)
.set_global_opts(
title_opts=opts.TitleOpts(title=f"2021年小米运动步数统计情况-日历图",pos_left='center'), # 图表标题
tooltip_opts=opts.TooltipOpts(is_show=True, axis_pointer_type="cross", trigger="item",
formatter="{c}步"),
visualmap_opts=opts.VisualMapOpts(
max_=30000,
min_=100,
orient="horizontal",
is_piecewise=True,
pos_top="230px",
pos_left="100px",
),
).render(f"2021年小米运动步数统计情况-日历图.html")
)
def draw_calories_calendar(self,data,type_,max_,unit):
c = (
Calendar(opts.InitOpts(
page_title=f"2021年小米运动{type_}统计情况-日历图", # 网页标题
theme=ThemeType.WALDEN, # 使用自带主题
))
.add("", data, calendar_opts=opts.CalendarOpts(range_="2021") # 选择日历图展示的年份为2021
)
.set_global_opts(
title_opts=opts.TitleOpts(title=f"2021年小米运动{type_}统计情况-日历图",pos_left='center'), # 图表标题
tooltip_opts=opts.TooltipOpts(is_show=True, axis_pointer_type="cross", trigger="item",
formatter="{c}"+unit),
visualmap_opts=opts.VisualMapOpts(
max_=max_,
min_=0,
orient="vertical",
is_piecewise=False,
pos_top="230px",
pos_left="80px",
),
).render(f"2021年小米运动{type_}统计情况-日历图.html")
)
def get_fmt_data(self,data):
"""
按月统计步数、步行距离、消耗卡路里数
:param data:
:return:
"""
data_item={}
steps_item = {}
calories_item = {}
miles_item = {}
for d in data:
date=d["date"]
steps=d['steps']
distance=d['distance']
calories=d['calories']
month=date.split('-')[1]
if "2021年" + month +"月" in steps_item.keys():
steps_item["2021年" + month +"月"]+=int(steps)
else:
steps_item["2021年" + month +"月"]=0
if "2021年" + month +"月"in miles_item.keys():
miles_item["2021年" + month +"月"] += int(distance)
else:
miles_item["2021年" + month +"月"] = 0
if "2021年" + month +"月" in calories_item.keys():
calories_item["2021年" + month +"月"] += int(calories)
else:
calories_item["2021年" + month +"月"] = 0
data_item['steps_item']=steps_item
data_item['miles_item']=miles_item
data_item['calories_item']=calories_item
return data_item
def draw_line(self,data):
step_x_data=list(data['steps_item'].keys())
step_y_data=list(data['steps_item'].values())
mile_y_data=list(data['miles_item'].values())
calorie_y_data=list(data['calories_item'].values())
l = (
Line(opts.InitOpts(
page_title=f"2021年小米运动数据统计情况-折线图.html",theme=ThemeType.MACARONS,))
.add_xaxis(xaxis_data=step_x_data)
.add_yaxis(
"步数",
y_axis=step_y_data,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max",symbol_size =[80,40]),opts.MarkPointItem(type_="min",symbol_size =[80,40])]),
tooltip_opts=opts.TooltipOpts(is_show=True, axis_pointer_type="cross", trigger="item",
formatter="{a}
{c}步" ),
)
.add_yaxis(
f"步行距离",
y_axis=mile_y_data,
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(type_="max",symbol_size =[80,40]), opts.MarkPointItem(type_="min",symbol_size =[80,40])]),
tooltip_opts=opts.TooltipOpts(is_show=True, axis_pointer_type="cross", trigger="item",
formatter="{a}
{c}米" ),
).add_yaxis(
f"消耗卡路里",
y_axis=calorie_y_data,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max",symbol_size =[80,40]),opts.MarkPointItem(type_="min",symbol_size =[80,40])]),
tooltip_opts=opts.TooltipOpts(is_show=True, axis_pointer_type="cross", trigger="item",
formatter="{a}
{c}千卡"),
)
.set_global_opts(title_opts=opts.TitleOpts(title=f"2021年小米运动数据统计情况-折线图"))
.render(f"2021年小米运动数据统计情况-折线图.html")
)
if __name__ == '__main__':
sport=Sport_Data_Analysis()
data=sport.read_csv()
data_list=sport.data_format(data[1:])#去除字段名
steps_data=[[s["date"],s["steps"]] for s in data_list]
sport.draw_steps_calendar(steps_data)
calories_data=[[s["date"],s["calories"]] for s in data_list]
sport.draw_calories_calendar(calories_data,"卡路里消耗",800,'千卡')
miles_data=[[s["date"],s["distance"]] for s in data_list]
sport.draw_calories_calendar(miles_data,"步行距离",20000,'米')
line_data_item=sport.get_fmt_data(data_list)
sport.draw_line(line_data_item)
本次使用pyecharts绘制了几张echarts图,可视化地展示了我的2021年步数、运动距离、能量消耗等数据,展示结果符合预期,符合平时的运动习惯,代码量也不大。如果喜欢这些Echarts图可以到蓝奏云下载。思路、代码方面有什么不足欢迎各位大佬指正、批评!觉得还可以的能点个赞嘛。