手把手教你用 pyecharts 制作数据可视化大屏之超市数据管理驾驶舱

林骥
林骥
林骥
44
文章
0
评论
2021-08-0914:22:55 评论 33 6895字
摘要

你好,我是林骥。今天手把手教你制作一个简单的数据可视化大屏。

首先,新建一个文本文件,命名为 chart_config.json,文件中的内容如下:

  •  
  •  
  •  
  •  
  •  
  •  
[{"cid":"1","width":"1860px","height":"80px","top":"0px","left":"0px"}, {"cid":"2","width":"500px","height":"410px","top":"80px","left":"0px"}, {"cid":"3","width":"860px","height":"820px","top":"80px","left":"500px"}, {"cid":"4","width":"500px","height":"410px","top":"80px","left":"1360px"}, {"cid":"5","width":"500px","height":"410px","top":"490px","left":"0px"}, {"cid":"6","width":"500px","height":"410px","top":"490px","left":"1360px"}]

其中每个图表有 5 个参数:

cid 是图表编号,对应后面作图将用到的 chart_id;

width 是图表的宽度;

height 是图表的高度;

top 是图表距离顶部的位置;

left 是图表距离左边的位置。

这些参数决定了每个图表在大屏中的大小和位置。

然后,在 Jupyter Lab 中新建一个 Notebook,运行以下代码:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 导入相关库from pyecharts import options as optsfrom pyecharts.charts import Map, Bar, Grid, Line, Page, Pie, Polarfrom pyecharts.commons.utils import JsCodefrom pyecharts.globals import ThemeType import pandas as pd# 从 data 文件夹读取 Excel 中的数据df = pd.read_excel("./data/超市数据.xlsx")# 用数据透视表的方法汇总各省销售额province_sale = df.pivot_table(values="销售额", index="省/自治区", aggfunc=sum)# 各地区销售额district_sale = df.pivot_table(values="销售额", index="地区", aggfunc=sum)# 每天各类产品销售额daily_sale = df.fillna(0).pivot_table(values="销售额", index="订单日期", columns="类别", aggfunc=sum).fillna(0)# 细分类别销售额parts_sale = df.fillna(0).pivot_table(values="销售额", index="子类别", aggfunc=sum).fillna(0)# 邮寄方式销售额mail_sale = df.fillna(0).pivot_table(values="销售额", index="邮寄方式", aggfunc=sum).fillna(0)# 把数据整理成绘图所需的列表格式,规范名称,销售额换算成万元,保留一位小数list_province_sale = [list(z) for z in zip(province_sale.index.str.replace("自治区", ""), round(province_sale.销售额/10000, 1))]# 求各省销售额的最大值max_sale = round(province_sale.销售额.max()/10000,0)# 数据可视化大屏的标题def main_title():    c = (        Pie(init_opts=opts.InitOpts(chart_id=1, bg_color="#00589F"))        .set_global_opts(            title_opts=opts.TitleOpts(title="超市数据管理驾驶舱",                                      title_textstyle_opts=opts.TextStyleOpts(font_size=36, color="#FFFFFF"),                                      pos_left="center",                                      pos_top="middle"))    )    return c# 柱形图def bar_sale() -> Bar:    c = (        Bar(init_opts=opts.InitOpts(chart_id=2, bg_color="#00589F"))        .add_xaxis(list(district_sale.index))        .add_yaxis("", list(round(district_sale.销售额/10000,1)), color="#5D9BCF", label_opts=opts.LabelOpts(color="#FFFFFF"))        .set_global_opts(            title_opts=opts.TitleOpts(title="各地区销售额汇总",                                       pos_left="center", pos_top="10",                                      title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF", font_size=16)),            xaxis_opts=opts.AxisOpts(                axislabel_opts=opts.LabelOpts(color="#999999"),                axistick_opts=opts.AxisTickOpts(is_align_with_label=True),                axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#999999")),            ),            yaxis_opts=opts.AxisOpts(                axislabel_opts=opts.LabelOpts(color="#999999"),                axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#999999")),            ),        )    )    return c# 数据地图def map_china() -> Map:    # 绘制地图    c = (        # 主题样式和背景颜色        Map(init_opts=opts.InitOpts(chart_id=3, bg_color="#00589F"))        # 添加地图数据        .add(series_name="省份", data_pair=list_province_sale, maptype="china", is_map_symbol_show=False)         # 全局配置        .set_global_opts(            # 标题文字            title_opts=opts.TitleOpts(title="{:,}".format(int(province_sale.销售额.sum())),                                       # 副标题                                      subtitle="		2016年到2019年总销售额",                                       # 标题位置                                      pos_left="center", pos_top=20,                                       # 标题颜色和大小                                      title_textstyle_opts=opts.TextStyleOpts(color="#FBC171", font_size=36),                                       # 副标题颜色和大小                                      subtitle_textstyle_opts=opts.TextStyleOpts(color="#CCCCCC", font_size=15)),            legend_opts=opts.LegendOpts(is_show=False),            # 可视化组件参数            visualmap_opts=opts.VisualMapOpts(                # 最大值                max_=max_sale,                 # 显示精确的分段值                is_piecewise=True,                # 图例位置                pos_left="36%", pos_bottom=50,                 # 图例字体颜色                textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),        )         # 隐藏文字标签        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))    )    return c# 折线图def line_daily() -> Line:    c = (        Line(init_opts=opts.InitOpts(chart_id=4, bg_color="#00589F"))        .add_xaxis(list(daily_sale.iloc[-30:,:].index.strftime("%Y-%m-%d")))        .add_yaxis("办公用品", list(round(daily_sale.iloc[-30:,:].办公用品,1)), is_smooth=True, color="#5D9BCF")        .add_yaxis("家具", list(round(daily_sale.iloc[-30:,:].家具,1)), is_smooth=True, color="#FBC171")        .set_series_opts(            areastyle_opts=opts.AreaStyleOpts(opacity=0.2),            label_opts=opts.LabelOpts(is_show=False),        )        .set_global_opts(            title_opts=opts.TitleOpts(title="分类产品每天销售额变化趋势",                                      pos_left="center", pos_top="10",                                      title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF", font_size=16)),            xaxis_opts=opts.AxisOpts(                axislabel_opts=opts.LabelOpts(color="#999999"),                axistick_opts=opts.AxisTickOpts(is_align_with_label=True),                axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#999999")),                is_scale=False,                boundary_gap=False),            yaxis_opts=opts.AxisOpts(                axislabel_opts=opts.LabelOpts(color="#999999"),                axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#999999")),            ),            legend_opts=opts.LegendOpts(pos_top="36", textstyle_opts=opts.TextStyleOpts(color="#FFFFFF", font_size=12)),        )    )    return c# 饼图def pie_parts() -> Pie:    x_data = list(parts_sale.index)    y_data = list(round(parts_sale.销售额/10000,1))    data_pair = [list(z) for z in zip(x_data, y_data)]    data_pair.sort(key=lambda x: x[1])    c = (        Pie(init_opts=opts.InitOpts(chart_id=5, bg_color="#00589F", theme=ThemeType.MACARONS))        .add(            series_name="细分产品类别",            data_pair=data_pair,            rosetype="radius",            radius="75%",            center=["50%", "50%"],            label_opts=opts.LabelOpts(is_show=False, position="center"),        )        .set_global_opts(            title_opts=opts.TitleOpts(                title="细分产品类别分布",                pos_left="center",                pos_top="0",                title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF"),            ),            legend_opts=opts.LegendOpts(is_show=False),        )    )    return c# 极坐标图def polar_parts() -> Polar:    c = (        Polar(init_opts=opts.InitOpts(chart_id=6, bg_color="#00589F"))        .add_schema(            radiusaxis_opts=opts.RadiusAxisOpts(data=list(mail_sale.index),                                                 type_="category",                                                axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#999999")),                                                axislabel_opts=opts.LabelOpts(color="#999999")                                               ),            angleaxis_opts=opts.AngleAxisOpts(is_clockwise=True,                                               split_number=9,                                              axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="#999999")),                                              splitline_opts=opts.SplitLineOpts(linestyle_opts=opts.LineStyleOpts(color="#00589F")),                                              axislabel_opts=opts.LabelOpts(color="#999999")),        )        .add(            "",             list(round(mail_sale.销售额/10000,1)),             type_="bar",        )        .set_global_opts(            title_opts=opts.TitleOpts(title="不同邮寄方式的销售额",                                      pos_left="center", pos_top="0",                                      title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF", font_size=16)                                     )        )        .set_series_opts(            label_opts=opts.LabelOpts(color="#999999"),        )        .set_colors(["#FBC171"])    )    return c# 可拖动的页面page = Page(layout=Page.DraggablePageLayout, page_title="超市数据管理驾驶舱")# 在页面中添加图表page.add(    main_title(),    bar_sale(),    map_china(),    line_daily(),    pie_parts(),    polar_parts(),)# 调用绘制函数后生成一个 temp.html 文件_ = page.render("temp.html")# 新建 chart_config.json 文件,定义图表位置# 生成数据可视化大屏的文件_ = page.save_resize_html("temp.html", cfg_file="chart_config.json", dest="超市数据管理驾驶舱.html")

运行结束之后,系统会自动生成一个文件:超市数据管理驾驶舱.html,用浏览器打开它,就能看到一个数据可视化大屏:超市数据管理驾驶舱。

这是一个简化版的数据可视化大屏,你可以根据自己的业务情况,替换成自己的真实数据,修改为自己想要的图表和颜色样式等。

 

 

End.

爱数据网专栏作者:林骥

作者介绍:数据赋能者,专注数据分析 10 多年。

个人公众号:林骥(linjiwx)

本文为挖数网专栏作者原创文章,未经允许禁止转载,需要转载请微信联系授权(微信号:lovedata0520)

更多文章前往爱数据社区网站首页浏览http://www.itongji.cn/

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: