基于Pyecharts-v1x-的数据可视化

31次阅读

共计 9276 个字符,预计需要花费 24 分钟才能阅读完成。

作者 | CDA 数据分析师

1、Pyecharts 简介

Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,Pyecharts 诞生了。

Pyecharts 最早只适用于工程领域的可视化开发,但是随着其对 Jupyter notebook、Jupyter lab 等交互式开发工具的支持不断加强,现在也开始被许多数据分析师应用到数据探索中。

1.1 Pyecharts 各个版本与 Python 的对应关系

pyecharts 分为 v0.5.x 和 v1.x 两个大版本,v0.5.x 和 v1.x 间不兼容,v1.x 是一个全新的版本。

Pyecharts 各版本与 python 的对应关系见下表

注:经 Pyecharts 开发团队决定,0.5.x 版本将不再进行维护

1.2 Pyecharts v1 系列的新特性

  • 全面拥抱 Python3 和 TypeHint

pyecharts v1.0.0 停止对 Python2.7,3.4~3.5 版本的支持和维护,仅支持 Python3.6+。如果还不知道什么是 TypeHint 的同学,劝你尽早入坑,官方入坑指南 typing — Support for type hints。

在编程界,早已流传着 动态一时爽,重构火葬场 这样的真知灼见,动态语言类型检查已经成为了一种趋势,Javascript 已经有了 Typescript,Python 也在力推 TypeHint,虽然 Python 的 TypeHint 实际上对于程序的运行并没有任何影响 ……,但它配合 IDE 和 mypy,或者 pyright 这样的工具可以在开发阶段趁早发现问题。

  • 弃用插件机制

pyecharts v1.0.0 废除原有的插件机制,包括 地图包插件 主题插件,插件的本质是提供 pyecharts 运行所需要的静态资源文件(基本都是 .js 文件),所以现在开放了两种模式提供静态资源文件。

online 模式,使用 pyecharts 官方提供的 assets host,或者部署自己的 remote host。

local 模式,使用自己本地开启的文件服务提供 assets host(离线模式)。

  • 支持 JupyterLab

对 JupyterLab 的支持一直是很多开发者关心的功能,毕竟 JupyterLab 号称是下一代的 Notebook。pyecharts 1.0.0 开始支持在 JupyterLab 中渲染图表啦!

使用 JupytrLab 需添加如下代码

from pyecharts.globals import CurrentConfig,NotebookType
CurrentConfig,NOTEBOOK_TYPE=NotebookType.JUPYTER_LAB

除了以上代码,还需在渲染之前执行加载 JavaScript 脚本的代码,这里以柱状图对象 bar 为例

bar.load_javascript()

然后再渲染即可

bar.render_notebook()

  • 代码风格重构

所有配置项均 OOP,在新版本的 pyecharts 中,一切皆 Options。配置项种类更多,可操作性更强,可以画出更丰富的图表,pyecharts 官方画廊 pyecharts/pyecharts-gallery。

0.5.X 版本写法

from pyecharts import Bar

attr = [“ 衬衫 ”, “ 羊毛衫 ”, “ 雪纺衫 ”, “ 裤子 ”, “ 高跟鞋 ”, “ 袜子 ”]
v1 = [5, 20, 36, 10, 75, 90]
v2 = [10, 25, 8, 60, 20, 80]
bar = Bar(“ 柱状图数据堆叠示例 ”)
bar.add(“ 商家 A ”, attr, v1, is_stack=True)
bar.add(“ 商家 B ”, attr, v2, is_stack=True)
bar.render()

1.0.0 版本写法,支持链式调用

import pyecharts.options as opts
from pyecharts.charts import Bar

attr = [“ 衬衫 ”, “ 羊毛衫 ”, “ 雪纺衫 ”, “ 裤子 ”, “ 高跟鞋 ”, “ 袜子 ”]
v1 = [5, 20, 36, 10, 75, 90]
v2 = [10, 25, 8, 60, 20, 80]

bar = (
Bar()
.add_xaxis(attr)
.add_yaxis(“ 商家 A ”, v1, stack=”stack1″)
.add_yaxis(“ 商家 B ”, v2, stack=”stack1″)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title=” 柱状图数据堆叠示例 ”))
)

bar.render()

  • 支持 selenium/phantomjs 渲染图片

pyecharts 1.0.0 提供两种模式渲染图片,selenium 和 phantomjs,分别需要安装 snapshot-selenium 和 snapshot-phantomjs。

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot

def bar_chart() -> Bar:
c = (
Bar()
.add_xaxis([“ 衬衫 ”, “ 毛衣 ”, “ 领带 ”, “ 裤子 ”, “ 风衣 ”, “ 高跟鞋 ”, “ 袜子 ”])
.add_yaxis(“ 商家 A ”, [114, 55, 27, 101, 125, 27, 105])
.add_yaxis(“ 商家 B ”, [57, 134, 137, 129, 145, 60, 49])
.set_global_opts(title_opts=opts.TitleOpts(title=”Bar- 测试渲染图片 ”))
)
return c

def render_chart_by_selenium():
from snapshot_selenium import snapshot
make_snapshot(snapshot, bar_chart().render(), “bar0.png”)

def render_chart_by_phantomjs():
from snapshot_phantomjs import snapshot
make_snapshot(snapshot, bar_chart().render(), “bar1.png”)

看到新版的种种优势,小伙伴们是不是跃跃欲试了?接下来我们安装并通过一系列代码体验 Pyecharts。

1.3 安装 Pyecharts

v1 系列版本的 Pyecharts 仅支持 python3.6+,即如果你的 python 是 3.6+,则默认会下载最新版的 pyecharts。

pip install -i https://pypi.douban.com/simple pyecharts -U #使用国内软件源下载速度会快很多

安装 pyecharts v0.5 系列版本:

pip install -i https://pypi.douban.com/simple pyecharts==0.5.11

2、Pyecharts 绘图

绘图前需要导入相关模块,根据绘制的图形不同,导入的模块会有些许差异

from pyecharts import options as opts #引入配置项入口
from pyecharts.charts import Bar,Line #导入相关图形的构造方法

2.1 pyecharts 绘图步骤

pyecharts 绘图大致是按以下五个步骤来的

这里以绘制柱形图为例

1、构造柱形图对象

bar = Bar()

2、添加 x 轴数据

bar.add_xaxis(xaxis_data=x_data)

添加 y 轴数据

bar.add_yaxis(“ 系列名称 ”, #设置系列名称
yaxis_data=y_data, #设置 y 轴系列数据
…… #更多参数可以查看官网
)

3、对系列进行配置

bar.set_series_opts(#主要是对图元、文字、
…… #标签、线型、标记点、标记线 等内容进行配置 
)

4、对全局进行配置

bar.set_global_opts(#可配置内容包括:x、y 坐标轴;初始化配置;
…… #工具箱配置;标题;区域缩放;图例;

提示框等参数配置

5、渲染图片

bar.render(path) #将图片渲染为 html 文件
bar.render_notebook() #直接在 jupytr notebook 中渲染

基于分类 / 时间的数据对比,通常需用到比较型图表。用户通过图表轻松识别最大 / 最小值,查看当前和过去的数据变动情况。

常见场景:哪个地区的收件量最多?今年的收入和去年相比如何?商品的销量在不同地区、时间维度上的差异……

2.2 柱状图的绘制

当数据量少的时候我们使用柱状图就可以了。pyecharts 绘制柱状图表灰常简单咯,啥也不说了,上代码。

from example.commons import Faker #调用官方提供的测试数据
from pyecharts import options as opts #配置入口模块
from pyecharts.charts import Bar #柱状图构造方法

bar = Bar()# 构造 bar 对象
bar.add_xaxis(Faker.choose()) #添加 x 轴数据 
bar.add_yaxis(“ 商家 A ”, Faker.values()) #添加一个系列数据,这里是 A 商家的数据
bar.add_yaxis(“ 商家 B ”, Faker.values()) #添加另一个系列数据
bar.set_global_opts(title_opts=opts.TitleOpts(
title=”Bar- 基本示例 ”, #设置主标题
subtitle=” 我是副标题 ” #设置副标题
))
bar.render_notebook() #在 jupyter notebook 中渲染

效果图如下:

2.3 条形图

当条目较多,如大于 12 条,移动端上的柱状图会显得拥挤不堪,更适合用条形图。一般数据条目不超过 30 条,否则易带来视觉和记忆负担。

bar = Bar().add_xaxis(Faker.choose()+Faker.choose()+Faker.choose()) #将数据生成三份 
bar.add_yaxis(“”, Faker.values()+Faker.values()+Faker.values()) #数据生成三份
bar.set_global_opts(title_opts=opts.TitleOpts(title=” 条形图 ”))
bar.reversal_axis() #翻转 XY 轴,将柱状图转换为条形图
bar.render_notebook()

2.4 折线图

当数据 X 轴为连续数值(如时间)且我们比较注重观察数据变化趋势时,折线图是非常好的选择。

import pyecharts.options as opts
from pyecharts.charts import Line

line=Line()
line.add_xaxis([“201{}年 /{}季度 ”.format(y,z) 
for y in range(4) 
for z in range(1,5)]) #设置 x 轴数据
line.add_yaxis(
“ 电视机销量 ”, 
[4.80,4.10,6.00,6.50,5.80,5.20,6.80,7.40,
6.00,5.60,7.50,7.80,6.30,5.90,8.00,8.40]
)# 设置 y 轴数据
line.set_global_opts(
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=-40),
),# 设置 x 轴标签旋转角度
yaxis_opts=opts.AxisOpts(name=” 销量(单位 / 千台)”),# 设置 y 轴名称
title_opts=opts.TitleOpts(title=” 折线图 ”)) #设置图表标题

line.render_notebook() #渲染图表

2.5 南丁格尔 - 玫瑰图

当对比差异不是很明显的数据时,可以使用南丁格尔玫瑰图,其原理为:扇形的半径和面积是平方的关系,南丁格尔玫瑰图会将数值之间的差异放大,适合对比大小相近的数值。它不适合对比差异较大的数值。

此外,因为圆有周期性,玫瑰图也适于表示周期 / 时间概念,比如星期、月份。依然建议数据量不超过 30 条,超出可考虑条形图。

def pie_rosetype():
from pyecharts.charts import Pie
c = (
Pie()
.add(
“”,
[list(z) for z in zip([“201{}年 /{}季度 ”.format(y,z)
for y in range(2) 
for z in range(1,3)], [4.80,4.10,5.80,5.20])],
radius=[“0%”, “75%”], #设置内径外径
rosetype=”radius”, #玫瑰图有两种类型
label_opts=opts.LabelOpts(is_show=True),
)
.set_global_opts(title_opts=opts.TitleOpts(title=”Pie- 玫瑰图示例 ”))
)
return c
pie_rosetype().render_notebook()

2.6 雷达图

对于一些多维的性能数据,如王者荣耀等游戏中的玩家战力信息,常用雷达图表示。指标得分接近圆心,说明处于较差状态,应分析改进;指标得分接近外边线,说明处于理想状态。

from pyecharts import options as opts
from pyecharts.charts import Page, Radar

v1 = [[4300, 10000, 28000, 35000, 50000, 19000]]
v2 = [[5000, 14000, 28000, 31000, 42000, 21000]]

def radar_base() -> Radar:
c = (
Radar()
.add_schema(
schema=[
opts.RadarIndicatorItem(name=”KDA”, max_=6500),
opts.RadarIndicatorItem(name=” 输出 ”, max_=16000),
opts.RadarIndicatorItem(name=” 经济 ”, max_=30000),
opts.RadarIndicatorItem(name=” 生存 ”, max_=38000),
opts.RadarIndicatorItem(name=” 推进 ”, max_=52000),
opts.RadarIndicatorItem(name=” 打野 ”, max_=25000),
]
)
.add(“ 鲁班 ”, v1, #添加系列名称及数据
color=”red”, #设置边框线的颜色
areastyle_opts = opts.AreaStyleOpts(# 设置填充的属性
opacity = 0.5, #透明度
color=”red” #填充颜色
),)
.add(“ 后裔 ”, v2,color=”blue”,
areastyle_opts = opts.AreaStyleOpts(
opacity = 0.5,# 透明度
color=”blue”
),)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title=” 英雄成长对比 ”))
)
return c
radar_base().render_notebook()

2.7 饼图

部分相较于整体,一个整体被分成几个部分。这类情况会用到构成型图表,如五大产品的收件量占比、公司利润的来源构成等。

对于参与构成研究的数据不超过 9 个时,可以使用饼图来绘制,如果超过了建议使用条形图来展示。

def pie_base():
from pyecharts import options as opts
from pyecharts.charts import Page, Pie
v1=[“ 啤酒 ”,” 可乐 ”,” 雪碧 ”,” 咖啡 ”,” 奶茶 ”]
v2=[30,19,21,12,18]

c = (
Pie()
.add(“”, [list(z) for z in zip(v1,v2)])
.set_global_opts(title_opts=opts.TitleOpts(title=” 销售收入占比 ”))
.set_series_opts(label_opts=opts.LabelOpts(formatter=”{b}: {c}%”))# 格式化标签输出内容
)
return c
pie_base().render_notebook()

2.8 pyecharts 绘制散点图

通过分布 & 联系型图表能看到数据的分布情况,进而找到某些联系,如相关性、异常值和数据集群。

常见使用场景:客户的分布与哪些因素相关、身高与体重的相关性分析等

查看两个变量的关系使用散点图,以贷款业务为例,查看年龄与信用的关系

代码:

def scatter_render():
from pyecharts.charts import Scatter
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import pandas as pd
df = pd.DataFrame({“ 年龄 ”:[32,28,23,24,21],
“ 信用分 ”:[771,751,738,726,725],
“ 姓名 ”:[‘ 小明 ’,’ 小花 ’,’ 小丽 ’,’ 小刚 ’,’ 小红 ’]})
df.sort_values(“ 年龄 ”,inplace=True,ascending=True)# 按年龄对数据做升序排序
c = (
Scatter()
.add_xaxis(df. 年龄.values.tolist())
.add_yaxis(
“ 信用分 ”,
df[[“ 信用分 ”,” 姓名 ”]].values.tolist(),# 传入信用分与姓名组合,方便 js 回调函数显示标签
label_opts=opts.LabelOpts(
formatter=JsCode(
“function(params){return params.value[2];}” #通过定义 JavaScript 回调函数自定义标签
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title=”Scatter- 多维度数据 ”),
xaxis_opts = opts.AxisOpts(
type_=”value”,#x 轴数据类型是连续型的
min_=20 #x 轴范围最小为 20
),
yaxis_opts = opts.AxisOpts(
min_=700 #y 轴范围最小为 700
)
)
)

return c

scatter_render().render_notebook()

我们可以看出,信用分与年龄在图形所显示范围内大致是成正比的。

2.9 绘制组合图

组合图就是将两种不同的图形绘制到同一图表中,我们以数据分析中常常用到的帕累托图为例,展示 pyecharts 如何绘制组合图。

帕累托法则又称为二八法则,即百分之八十的问题是百分之二十的原因造成的。

帕累托图(Pareto chart)又叫排列图、主次图,是按照发生频率大小顺序绘制的直方图,表示有多少结果是由已确认类型或范畴的原因所造成。

帕累托图在项目管理中主要用来找出产生大多数问题的关键原因来解决大多数问题,是将出现的质量问题按照重要程度依次排列的一种图表,从而可以直观地得出影响质量问题的主要因素。

主要特点:

1、柱形图的数据按数值的降序排列,折线图上的数据有累积百分比数据,并在次坐标轴显示;

2、折线图的起点数值为 0%,并且位于柱形图第一个柱子的最左下角;

3、折线图的第二个点位于柱形图第一个柱子的最右上角;

4、折线图最后一个点数值为 100%,位于整张图形的最右上角

数据:

代码:

def bar_overlap_line():
from pyecharts import options as opts #引入配置项
from pyecharts.charts import Bar,Line

x_data1 = [“ 产品价格优势不突出 ”,” 渠道经理服务不到位 ”,
“ 营销活动频次不够 ”,” 区域消费市场不景气 ”,” 其他 ”]
x_data2 = [*range(6)]
y_data1 = [115,99,59,33,23]
y_data2 = [0,35,65,83,93,100] 

bar = Bar()

添加 x 轴数据

bar.add_xaxis(xaxis_data=x_data1)
bar.set_global_opts(xaxis_opts=opts.AxisOpts(type_=”category”)) #设置 x 轴系列 
bar.add_yaxis(“ 问题数量(频数)”, #设置 y 轴系列名称
yaxis_data=y_data1, #设置 y 轴系列数据
category_gap=0, #设置柱的间距
color=”blue”, #设置柱形的填充颜色
)

bar.extend_axis(
xaxis=opts.AxisOpts(#设置 x 轴的参数
is_show=False,
position=”top”,

bar.extend_axis(
yaxis=opts.AxisOpts(

axistick_opts=opts.AxisTickOpts(#刻度
is_inside=True,
),
axislabel_opts=opts.LabelOpts(formatter=”{value}%”, #格式化刻度输出
position=”right”)
)

bar.set_global_opts(
xaxis_opts=opts.AxisOpts(#设置 x 轴的参数
is_show=True, #是否显示坐标轴
),
yaxis_opts=opts.AxisOpts(#设置 y 轴最大取值范围
max_=320,
),
title_opts=opts.TitleOpts(title=” 帕累托图 ”)

 

line =Line()

添加 x 轴数据

line.add_xaxis(x_data2)

添加 y 轴数据 

line.add_yaxis(“ 累计百分比 ”,
y_data2,
xaxis_index=1, #使用次 x 坐标轴
yaxis_index=1, #使用次 y 坐标轴
label_opts=opts.LabelOpts(is_show=False),
is_smooth=True,

bar.overlap(line) #组合柱状图与折线图
return bar
bar_overlap_line().render_notebook()

最终效果图如下所示:

以上就是数据分析常用可视化图表的 pyecharts 实现方法。

正文完
 0