基于pyecharts V1.x的数据可视化

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的对应关系见下表

版本 V0.5.x V1.x.x
python 版本选择 Python2.7,3.4+ Python3.6+

注 :经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.x.x 废除原有的插件机制,包括地图包插件主题插件,插件的本质是提供 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.x.x 版本写法,支持链式调用

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.x.x 提供两种模式渲染图片,selenium 和 phantomjs,分别需要安装 snapshot-seleniumsnapshot-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.2、安装 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绘制散点图

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

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

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

用户 年龄 身份特质 行为偏好 履约能力 人脉关系 信用历史 信用分
小明 32 89 90 88 92 95 771
小花 28 92 80 92 94 87 751
小丽 23 86 78 94 78 86 738
小刚 24 83 81 83 78 94 726
小红 21 85 87 80 81 85 725

代码:

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%,位于整张图形的最右上角

数据:

问题数量(频数) 累计销量 累计百分比
0%
产品价格优势不突出 115 115 35%
渠道经理服务不到位 99 214 65%
营销活动频次不够 59 273 83%
区域消费市场不景气 33 306 93%
其他 23 329 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实现方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容