话不多说,上代码
📣 概况
Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
✨ 特性
- 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
- 囊括了 30+ 种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至 Flask,Django 等主流 Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者更快的上手项目
- 多达 400+ 地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
如何安装
pip 安装
$ pip(3) install pyecharts
源码安装
$ git clone https://github.com/pyecharts/pyecharts.git
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install
# 或者执行 python install.py
#调用相关模块
from pyecharts import options as opts
from pyecharts.charts import Bar, Page, Pie,Line
from pyecharts.components import Table
from pyecharts.globals import ThemeType
import pandas as pd
#封装一个sort_order来提取需要的数据
class sort_order():colors = ["#5793f3", "#d14a61", "#675bba","pink"] Time = [] per_sum = [] #每天五大类时长 嵌套列表 sum_list = [] #过渡列表 part_sums = [] #每天各项活动时长求和 嵌套列表 sum_activity = None #各项操作总时长def __init__(self):'''重写初始化方法,封装成员方法'''self.data = pd.read_excel(r"D:\myLife\myLife(2).xlsx",sheet_name=1)self.values = self.data.groupby("日期")self.df0 = self.values.groups.keys()self.operation = self.data["操作"].unique()value = self.data.groupby("操作")self.operation_name = list(value.groups.keys())self.every_time()self.every_sum()self.per_sort_sum(self.data)self.get_group_values()self.sum_all()def every_sum(self):'''获取每天五大类时长'''for j in self.df0:i = self.values.get_group(j)val = self.per_sort_sum(i)self.per_sum.append(val)def every_time(self):'''获取时间戳'''for i in list(self.df0):self.Time.append(i.strftime("%Y年-%m月-%d日"))def sort_sum(self,i):'''对传入的i进行求和,并转成列表'''dts = i["时长"].sum()return dts.tolist()def per_sort_sum(self,i):'''根据相关操作名称进行分组,并求和'''if len(i) > 100:i = self.dataa = i.query("操作=='阅读'|操作=='上课'|操作=='写作'|操作=='备课'|操作=='实验'|操作=='思考'|操作=='编程'|操作=='记录'")b = i.query("操作=='拍摄'|操作=='玩手机'|操作=='欣赏'|操作=='购物'")A = i.query("操作=='睡眠'|操作=='午睡'|操作=='休养'|操作=='吃早餐'|操作=='吃午餐'|操作=='吃晚餐'|操作=='喝水'")B = i.query("操作=='打球'|操作=='步行'")C = i.query("操作=='讨论'|操作=='开会'|操作=='网聊'")list1 = [a,b,A,B,C]self.list2 = []for i in list1:self.list2.append(self.sort_sum(i))return self.list2def get_group_values(self):'''获取每天各项活动时长'''self.part_sums = []for j in list(self.df0):dt = self.values.get_group(j)dts = dt.groupby('操作').sum()self.part_sums.append(list(dts['时长'])) def sum_all(self):'''统计所有操作的总时长'''val = self.data.groupby('操作').sum()self.sum_activity = list(val["时长"])
dt = sort_order()
attr = ["学习", "娱乐", "休息", "运动", "交流"]
# 将每个图 封装到 函数
# 1.柱形图
def bar_datazoom_slider() -> Bar:c = (Bar().add_xaxis(dt.operation_name) #x轴的值.add_yaxis(series_name="时长总和(min)",y_axis=dt.sum_activity,color=dt.colors[1]) #柱形1的标签,y轴的值,颜色.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True, #工具箱配置项pos_top="top", pos_left="right", #设置工具箱配置项的位置feature={"saveAsImage": {} , #保存图片工具"magicType":{"show": True, "type":["line","bar"]}, #转换成折线图和柱形图工具"dataView": {} }), #数据视图工具 xaxis_opts=opts.AxisOpts(name="活动", #x轴的标签设置axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=dt.colors[1]))), #坐标轴刻度线配置项yaxis_opts=opts.AxisOpts(name="小时", #y轴的标签设置axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=dt.colors[2])),#坐标轴刻度线配置项axislabel_opts=opts.LabelOpts(formatter="{value}")), #当前列的数据进行格式化操作 value:表示当前单元格中的值 tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),#轴触发触碰到图形显示全部数据 类型为十字准星title_opts=opts.TitleOpts(title="学生各项活动时长分析"), #设置标题datazoom_opts=[opts.DataZoomOpts()] #设置滑动轴))return c
# # 2.带标记点的折线图
def line_markpoint() -> Line:c = (Line().add_xaxis(attr).add_yaxis("总时长(min)",dt.list2,color=dt.colors[2]) .set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True, #工具箱配置项pos_top="top", pos_left="right", #设置工具箱配置项的位置feature={"saveAsImage": {} , #保存图片工具"magicType":{"show": True, "type":["line","bar"]},#转换成折线图和柱形图工具"dataView": {} }), #数据视图工具 xaxis_opts=opts.AxisOpts(name="活动", #x轴的标签设置axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=dt.colors[0]))), #坐标轴刻度线配置项yaxis_opts=opts.AxisOpts(name="小时", #y轴的标签设置axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=dt.colors[3])), #坐标轴刻度线配置项axislabel_opts=opts.LabelOpts(formatter="{value}")), #当前列的数据进行格式化操作 value:表示当前单元格中的值tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),title_opts=opts.TitleOpts(title="学生活动时长分析"),datazoom_opts=[opts.DataZoomOpts()]))return c
# 3.饼图
def pie1_rosetype() -> Pie:c = (Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT,width='1000px',height='600px')) #主题风格.add("", [list(z) for z in zip(attr,dt.sum_activity)] ).set_global_opts(title_opts=opts.TitleOpts(title="学生活动时长占比",pos_top="top",pos_left="left"),legend_opts=opts.LegendOpts(pos_left="right", orient="vertical")) # 设置标题 .set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{d}%'))) # 显示百分比return c
# #zip函数同时获取两组值,并按照对应的位置组合形成元组,存放到列表里
# #zip 每个元素是 x/df1 两个列表中同位置元素的 tuple,比如('上课',上课对应的时长)
# # list(z) 本质是 list(('上课', 上课对应的时长)),结果是[('上课',上课对应的时长)]
# 4.嵌套饼图
inner_data_pair = [z for z in zip(attr,dt.list2 )]
outer_data_pair = [z for z in zip(attr, dt.sum_activity)]
def pie2_rosetype() -> Pie:c =(Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT,width='1400px',height='800px')).add(series_name="总时长(min)",data_pair=inner_data_pair,radius=[0, "30%"],label_opts=opts.LabelOpts(position="inner"),).add(series_name="总时长(min)",radius=["40%", "55%"],data_pair=outer_data_pair,label_opts=opts.LabelOpts(position="outside",formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",background_color="#eee",border_color="#aaa",border_width=1,border_radius=4,rich={"a": {"color": "#999", "lineHeight": 22, "align": "center"},"abg": {"backgroundColor": "#e3e3e3","width": "100%","align": "right","height": 22,"borderRadius": [4, 4, 0, 0],},"hr": {"borderColor": "#aaa","width": "100%","borderWidth": 0.5,"height": 0,},"b": {"fontSize": 16, "lineHeight": 33},"per": {"color": "#eee","backgroundColor": "#334455","padding": [2, 4],"borderRadius": 2,},},),).set_global_opts(legend_opts=opts.LegendOpts(pos_left="right", orient="vertical")).set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)")))return c
# #6.表格
def table_base() -> Table:table = Table()headers =["Activity summary"]rows = [["The sum of the dates"],[len(dt.df0)],["Analysis 学习 娱乐 休息 运动 交流 Total duration (小时)"],[dt.list2],["上课 步行 吃晚餐 吃午餐 吃早餐 喝水 记录 排泄 睡眠 思考 洗漱 写作 网聊 拍摄 玩手机 阅读 午睡 沏茶做饭 编程 分发 讨论 备课 欣赏 开会 休养 驾车 购物 实验 打球 充值 (小时)"],[dt.sum_activity]]table.add(headers,rows).set_global_opts(title_opts=opts.ComponentTitleOpts(title="学生活动时长数据视图"))return table
# #7.page()运行多图
def page_simple_layout():page = Page(layout=Page.SimplePageLayout)page.add( bar_datazoom_slider(),pie1_rosetype(),line_markpoint(),pie2_rosetype(),table_base())page.render("人生导航数据分析.html")
#放到主函数执行
#作用:当模块被直接运行时,以下代码块将被运行.当模块是被导入时(从另一个py文件调用模块时),以下代码块不被运行。
if __name__ == "__main__":page_simple_layout()print('完成')
这个是文件链接【金山文档】 myLife(2)1,需要的小伙伴可打开下载
想要了解更详细的操作或者是想要绘制其他的图表,请点击下方链接
pyechast的GitHub官方文档
本文链接:https://my.lmcjl.com/post/10902.html
展开阅读全文
4 评论