前言
之前尝试过多种数据可视化的方式,包括Tableau 、Superset 、matplotlib 等,在之前的博客中都有所介绍,今天主要介绍如何利用Pyecharts来搭建数据看板~
温馨提示
如果在使用过程中遇到无法渲染(即输出均为空白)的情况,可以考虑使用环境是否受网络限制无法读取JS文件,这个时候可以按以下步骤进行处理:
1、前往https://github.com/pyecharts/pyecharts-assets下载assets文件
2、存放在当地目录或者配置在服务器
wget https://github.com/pyecharts/pyecharts-assets/archive/master.zip
cd pyecharts-assets
python -m http.server
3、修改代码
from pyecharts.globals import CurrentConfig, OnlineHostType
# 存放目录
CurrentConfig.ONLINE_HOST="D:\\public\\pyecharts-assets-master\\assets\\"
# 配置服务器
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"
安装
pip install pyecharts
使用
具体图例可参考官方文档:https://pyecharts.org/#/zh-cn/intro
import json
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Sankey, Page, Pie, Scatter, Funnel, Line
from pyecharts.components import Table
from pyecharts.commons.utils import JsCode
1、看板标题
def plot_dashboard_title():
pic = Pie(init_opts=opts.InitOpts(chart_id=1)).set_global_opts(title_opts=opts.TitleOpts(title="数据可视化看板",
title_textstyle_opts=opts.TextStyleOpts(font_size=28), pos_left="center", pos_top="middle"))
pic.render("./dashboard_output/dashboard_title.html")
return pic
2、桑基图
def plot_sankey():
with open('./dashboard_data/node.json', 'r', encoding='utf-8') as f:
node = json.load(f)
with open('./dashboard_data/link.json', 'r', encoding='utf-8') as f:
link = json.load(f)
pic = (Sankey(init_opts=opts.InitOpts(width='1300px', height='800px'))
.add('', node, link, node_width=30, node_gap=10, node_align='left',
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color='source'),
label_opts=opts.LabelOpts(position='left'), )
.set_global_opts(title_opts=opts.TitleOpts(title="场景归因入口UV流向分布"))
)
pic.render("./dashboard_output/sankey_image.html")
return pic
3、数据表
def plot_table():
df = pd.read_csv('./dashboard_data/dz_gy_data.csv')
df['rate'] = df.apply(lambda x: round(x['result_user']/x['apply_user'],3), axis=1)
df['page'] = df.apply(lambda x: x['new_source_event'].split('-')[0], axis=1)
df['source'] = df.apply(lambda x: x['new_source_event'].split('-')[1], axis=1)
df = df.sort_values(by=['apply_cnt'], ascending=False)
headers = ['一级页面', '归因入口', '页面浏览PV', '页面浏览UV', '提交率(提交UV/页面浏览UV)']
rows = df[['page', 'source', 'apply_cnt', 'apply_user', 'rate']].values.tolist()
pic = Table().add(headers, rows).set_global_opts(title_opts=opts.ComponentTitleOpts(title=""))
pic.render("./dashboard_output/table_image.html")
return pic
4、散点图
def plot_scatter():
df = pd.read_csv('./dashboard_data/dz_gy_data.csv')
data = df[['new_source_event', 'pv', 'uv']].sort_values(by=['pv'], ascending=False).head(5)
pic = (Scatter(init_opts=opts.InitOpts(width='610px',height='400px')).add_xaxis(
data['pv'].astype(int)).add_yaxis("",[list(z) for z in zip(data['uv'], data.new_source_event)],
label_opts=opts.LabelOpts(formatter=JsCode("function(params){return params.value[2]}")),).set_global_opts(
title_opts=opts.TitleOpts(title=name+"TOP5归因入口页面浏览PV与UV分布"),yaxis_opts=opts.AxisOpts(name="UV"),
xaxis_opts=opts.AxisOpts(name="PV"),))
pic.render("./dashboard_output/bubble_image.html")
return pic
5、漏斗图
def plot_funnel():
df = pd.read_csv('./dashboard_data/dz_funnel_data.csv')
data = df.values.tolist()[0]
header = ["阶段一", "阶段二", "阶段三", "阶段四","阶段五", "阶段六"]
pic = (Funnel(init_opts=opts.InitOpts(width='615px', height='400px')).add("漏斗",
[list(z) for z in zip(header, data)], label_opts=opts.LabelOpts(position='left')).set_global_opts(
title_opts=opts.TitleOpts(title=name+"漏斗转化"), legend_opts=opts.LegendOpts(is_show=False)))
pic.render("./dashboard_output/funnel_image.html")
return pic
5、折线图
def plot_trend_line():
df = pd.read_csv('./dashboard_data/dz_trend_uv.csv')
pic = Line().add_xaxis(xaxis_data=[str(i) for i in df.s_date.tolist()])\
.add_yaxis(series_name='页面1', y_axis=df['uv1'].tolist(),label_opts=opts.LabelOpts(is_show=False))\
.add_yaxis(series_name='页面2', y_axis=df['uv2'].tolist(), label_opts=opts.LabelOpts(is_show=False))\
.add_yaxis(series_name='页面3', y_axis=df['uv3'].tolist(), label_opts=opts.LabelOpts(is_show=False))\
.set_global_opts(title_opts=opts.TitleOpts(title="各页面日浏览"+name),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
yaxis_opts=opts.AxisOpts(type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),),)\
.set_series_opts(markarea_opts=opts.MarkAreaOpts(data=[opts.MarkAreaItem(name="特殊日", x=('4','6')),
opts.MarkAreaItem(name="特殊日", x=('14','16')),
opts.MarkAreaItem(name="特殊日", x=('24','26'))]))
pic.render("./dashboard_output/line_image.html")
return pic
6、看板搭建
def dashboard_output():
page = Page(layout=Page.DraggablePageLayout).add(
plot_dashboard_title(),
plot_gy_sankey(),
plot_gy_table(),
plot_scatter(),
plot_funnel(),
plot_trend_line()
)
page.render("./dashboard_output/page_draggable.html")
7、调整布局保存chart_config.json
8、根据布局重新输出
Page.save_resize_html("./dashboard_output/page_draggable.html", cfg_file="./dashboard_output/chart_config.json",
dest="./dashboard_output/new_page_draggable.html")