python3--数据可视化-可视化展示2021年运动数据(附源码)


转眼2021年过去了,许多app都推出了年度总结,本次通过使用Python中的第三方库pyecharts,绘制日历图和折线图,可视化地展示2021年的运动数据。

一.准备工作

1.环境

除了必要的Python3.x环境还需要安装第三方库:pyecharts

pip install pyecharts

2.数据

本次使用的是真实的小米运动数据,需要手动将小米运动数据导出,我整理了一份数据导出流程以供参考。

1.进入小米运动,点击【我的】,点击【设置】
2.选择【账号与安全】
3.点击下面【注销账号】
4.选择【导出数据】,然后选确定
5.选择要导出的【数据】以及【日期】
6.输入邮箱地址以及验证码,导出成功
7.进入邮箱,点击链接
8.输入密码,下载数据
9.解压缩包,查看数据

什么?文字版你看不懂?我还准备了图片版
请添加图片描述
请添加图片描述

二.思路

整体思路

在这里插入图片描述

三.效果展示

原始数据

在这里插入图片描述
原始数据格式为csv格式,使用逗号分隔每个数据,数据分为五列,分别是日期、步数、步行距离、运动距离、卡路里消耗。

1.2021年小米运动步数统计情况-日历图

请添加图片描述
使用日历图能够直观的表示出每一天的运动情况,通过设置合适的图例,能够筛选出对应区间的数据。

2.2021年小米运动步行距离统计情况-日历图

请添加图片描述
使用视觉映射配置项可以更精确地筛选出指定区间的数据。

3.2021年小米运动卡路里消耗统计情况-日历图

请添加图片描述
这里放一张gif演示一下。

4.2021年小米运动数据统计情况-折线图

请添加图片描述
此折线图按月统计每月的步数、步行距离、卡路里消耗,可以看到三个数据是成正比的,其中九月运动量较少,十二月运动量最多。

四.源代码

runner_data_analysis.py(运动数据分析)

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}<br>{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}<br>{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}<br>{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图可以到蓝奏云下载。思路、代码方面有什么不足欢迎各位大佬指正、批评!觉得还可以的能点个赞嘛。
请添加图片描述

猜你喜欢

转载自blog.csdn.net/a1397852386/article/details/122250980