循序渐进,学会用pyecharts绘制瀑布图

瀑布图简介

瀑布图(Waterfall Plot)是由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水而称之为瀑布图。

瀑布图采用绝对值与相对值结合的方式,适用于表达多个特定数值之间的数量变化关系。当用户想表达两个数据之间数量的演变过程时,可以使用瀑布图。当用户想表达一连续的数值加减关系时,也可以使用瀑布图。

这种效果的图形能够在反映数据多少的同时,更直观地反映出数据的增减变化过程。

瀑布图经常用于财务分析,以了解多种因素对特定对象的正面和负面影响。可以显示基于时间或基于类别的效果,基于类别的图表表示费用或销售额的收益或损失,基于时间的图表表示一段时间内的收益或损失。

在Python中,可以使用pyecharts库中绘制柱状图的组件 Bar 实现瀑布图,本文就循序渐进地介绍一步步将柱状图演变成瀑布图。

绘制柱状图

绘图前需要先安装pyecharts库,如果你还没有安装,请先用 pip install pyecharts 安装。
本文绘图使用虚拟数据,假设你是一个老板,本文的数据表示2023年你公司的总人数、招聘人数和离职人数。你要求在展示每个月总人数的同时,还可以清晰地看出人数变化。

数据如下:

month = [f'2023-0{i}' for i in range(1, 10)] + [f'2023-{i}' for i in range(10, 13)]
# 每月总人数
total = [50, 48, 42, 48, 58, 63, 61, 65, 58, 63, 69, 67]
# 每月入职人数
entry = [0, 2, 12, 10, 5, 0, 4, 0, 10, 8, 3, 0]
# 每月离职人数
resign = [2, 8, 6, 0, 0, 2, 0, 7, 5, 2, 5, 1]

绘制柱状图使用pyecharts中的 Bar 组件,先初始化一个 Bar 对象,调用 add_xaxis()方法添加横轴数据,链式调用add_yaxis()方法添加纵轴数据。再链式调用set_global_opts()设置坐标轴格式、字体等,最后链式调用render()方法将图形渲染到HTML文件中,可以用浏览器打开绘图结果。

from pyecharts.charts import Bar
from pyecharts import options as opts# 柱状图
bar = Bar(init_opts=opts.InitOpts(width='800px', height='500px'))
bar.add_xaxis(month).add_yaxis('各月总人数', y_axis=total, category_gap=2
).set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=8, color='green', font_weight='bolder')), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10, color='blue', font_weight='bolder'))
).render('people_total.html')

此时绘制了一个普通的柱状图,展示了每个月的员工总人数。但是每个月的入职人数和离职人数没有展示在图形中。

绘制并列柱状图

要将多组数据的柱状图并列展示,可以多次链式调用add_yaxis()方法添加多组数据。

# 并列柱状图
bar = Bar(init_opts=opts.InitOpts(width='800px', height='500px'))
bar.add_xaxis(month).add_yaxis('各月总人数', y_axis=total, gap=0, category_gap=0,
).add_yaxis('各月入职人数', y_axis=entry, gap=0, category_gap=0
).add_yaxis('各月离职人数', y_axis=resign, gap=0, category_gap=0
).set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=8, color='green', font_weight='bolder')), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10, color='blue', font_weight='bolder'))
).render('people_total_and_other.html')

将总人数、入职人数、离职人数全部添加到柱状图中,三组数据都展示了。

不过,这三组数据的大小变化是有关系的,会相互影响,并列的柱状图看不出来彼此之间的关系。

绘制堆叠柱状图

并列展示的柱状图不符合要求,所以尝试将柱状图堆叠起来展示。堆叠柱状图的实现方法是在每个add_yaxis()方法中设置 stack 参数,要将哪几组柱状图堆叠在一起,就给它们的 stack 参数设置一样的值(这个值可以自定义)。

# 堆叠柱状图
bar = Bar(init_opts=opts.InitOpts(width='800px', height='500px'))
bar.add_xaxis(month).add_yaxis('各月总人数', y_axis=total, stack='人数', category_gap=2,
).add_yaxis('各月入职人数', y_axis=entry, stack='人数', category_gap=2
).add_yaxis('各月离职人数', y_axis=resign, stack='人数', category_gap=2
).set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=8, color='green', font_weight='bolder')), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10, color='blue', font_weight='bolder'))
).render('people_total_stack.html')

不难发现,将柱状图堆叠在一起可以展示“叠加”的效果。不过,本文中的数据不完全适合叠加展示,入职人数是在总人数的基础上相加,离职人数则要在总人数的基础上相减。堆叠图只能展示不断叠加,还要在此基础上把减少的效果也展示出来,所以需要做进一步的改造。

根据前面对瀑布图的介绍,当用户想表达一连续的数值加减关系时,可以使用瀑布图。下面就来看如何实现。

绘制瀑布图

根据瀑布图的特征,它采用绝对值与相对值结合的方式,适用于表达数个特定数值之间的数量变化关系。所以在绘制瀑布图前,要先对数据做一定的改造,能体现绝对值和相对值的关系。

每个月的入职人数和离职人数计算的绝对值就是每个月的增加人数或减少人数。如果入职人数大于离职人数,则这个月增加人数为正数、无减少人数(用’-‘表示,方便绘图),反之,如果入职人数小于离职人数,则增加人数为’-‘,减少人数为正数,入职人数和离职人数相等则增加人数、减少人数都为’-'。

每个月的入职人数和总人数,离职人数和总人数计算的相对值是每个月稳定的人数。如果某个月人数增加,则这个月的稳定人数就是月初的总人数,如果某个月人数减少,则这个月的稳定人数就是月初的总人数减掉减少的人数。

举例:2023年1月,总人数50,入职0,离职2,则这个月减少2人,稳定人数为50-2=48人。2023年3月,总人数42,入职12,离职6,则这个月增加6人,稳定人数为42人。同理可以推出其他所有月的数据。

改造好数据后,开始绘制瀑布图,瀑布图的代码与堆叠图大部分一样。瀑布图主要是体现数据变化的部分,所以一般都将“数据稳定”的部分隐藏(rgba颜色值中将a通道设置为0),本文用rgb颜色值把“稳定数据”设置成灰色。

# 瀑布图
# 稳定人数
fixed = [48, 42, 42, 48, 58, 61, 61, 58, 58, 63, 67, 66]
# 增加人数
add = ['-', '-', 6, 10, 5, '-', 4, '-', 5, 6, '-', '-']
# 减少人数
reduce = [2, 6, '-', '-', '-', 2, '-', 7, '-', '-', 2, 1]
bar = Bar(init_opts=opts.InitOpts(width='800px', height='500px'))
bar.add_xaxis(month).add_yaxis('各月稳定人数', y_axis=fixed, category_gap=2,stack="人数", itemstyle_opts=opts.ItemStyleOpts(color="rgb(240,240,240)")
).add_yaxis('各月增加人数', y_axis=add, stack='人数', category_gap=2
).add_yaxis('各月减少人数', y_axis=reduce, stack='人数', category_gap=2
).set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=8, color='green', font_weight='bolder')), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10, color='blue', font_weight='bolder'))
).render('people_total_waterfall.html')

经过以上几个步骤的演进,完成了瀑布图的绘制,可以很清晰地看到每个月人数的增加和减少,完美展示了数据变化的过程。这样一步一步地调整和演进,相信看完后你已经知道如何绘制瀑布图了,欢迎一键三连。

参考文档:
[1] pyecharts官方文档:https://gallery.pyecharts.org/#/Bar/README


相关阅读:

循序渐进,学会用pyecharts绘制玫瑰图

循序渐进,学会用pyecharts绘制瀑布图相关推荐

  1. 循序渐进,学会用pyecharts绘制玫瑰图

    循序渐进,学会用pyecharts绘制玫瑰图 玫瑰图简介 玫瑰图全称南丁格尔玫瑰图,是英国护士和统计学家弗罗伦斯·南丁格尔发明的,又名为极区图. 南丁格尔自己常昵称这类图为鸡冠花图(coxcomb), ...

  2. Pyecharts绘制阶梯图

    Pyecharts绘制阶梯图 Pyecharts绘制阶梯图 Pyecharts绘制阶梯图 这里使用的pyecharts版本是0.5的,毕竟1.x以后的版本大改了,很多都不一样 from pyechar ...

  3. 使用ICGC数据库进行肿瘤组织突变分析,绘制瀑布图等

    癌症组织突变分析 文章目录 癌症组织突变分析 ICGC 数据库 下载数据 ICGC下载突变数据 genecode网站下载基因注释文件 数据预处理 读入突变数据 对data文件进行基因注释 瀑布图 R包 ...

  4. R语言EXCEL绘制瀑布图

    瀑布图是反映在诸多原因和因素下,使得一个状态演变成另一个状态的过程图表,这个过程中我们可以了解哪些是导致该变化结果的主要因素,以及产生影响的强弱,R语言中一共有三个包可以做,它们分别是waterfal ...

  5. pyecharts绘制折线图

    要使用Python中的pyecharts绘制折线图,首先需要安装pyecharts库(可以使用pip install pyecharts命令进行安装).然后可以按照以下步骤进行绘图: 导入pyecha ...

  6. GenVisR绘制瀑布图/突变图谱

    一 R包的下载 下载地址:http://bioconductor.org/packages/release/bioc/html/GenVisR.html 学习过程中参考的两篇文章(感谢): https ...

  7. 学会用pyecharts画玫瑰图

    文章目录 文章目录 前言 相关文档文档和社区 1.中文官方文档 2.官方github 3.社区 一.什么是玫瑰图? 二.玫瑰图的特点 1.适合对比分析,没有占比意义 2.数据差异不宜过大 3.可以反映 ...

  8. tableau高级绘图(五)-tableau绘制瀑布图

    瀑布图是数据可视化分析中的常用图表类型之一,可以形象地表示出一系列具有累计性质的数值之间的增减变化情况. 这里使用 Tableau 自带的超市示例,创建瀑布图分析子类别产品的利润构成情况.本节记录内容 ...

  9. 利用Pyecharts绘制仪表盘图的案例【含参数解释】

    目录 一.概念解释 二.数据导入 三.单指针仪表盘 四.参数解释 五.多指针仪表盘 一.概念解释         仪表盘图(Gauge),这里指的并不是人力常用的多图表在同页面聚合排布的绘图方法. 仪 ...

最新文章

  1. 图像分类:来自13个Kaggle项目的经验总结
  2. python --那些你应该知道的知识点
  3. 详解Linux运维工程师打怪升级篇
  4. 成功解决TypeError: 'float' object cannot be interpreted as an integer
  5. com.alibaba.druid.sql.parser.ParserException: ERRO
  6. 02.CSS基础笔记及导入
  7. Socket套接字 =======================
  8. 一些值得注意的算法题——动态规划
  9. Oracle教程之管理UNDO(九)--如何解决Oracle ORA-01555错误
  10. 最全解析如何正确学习JavaScript指南,必看!
  11. JSON.stringify 语法讲解
  12. 计算机绘图cad期末考试试题,工程制图考试
  13. 弹性地基梁板的计算理论_弹性地基梁的计算方法是什么?
  14. 黑科技智能家电新生儿“智能冰箱”
  15. trun off PInvokeStackImbalance
  16. 树莓派小车————远程控制
  17. Win10 锁屏之后无法唤起 出现假死解决办法
  18. C#(十三)之字符串string
  19. JavaScript学习(五)
  20. php开发微信手册,PHP技术开发微信公众平台

热门文章

  1. html插入曲线图,PPT如何插入曲线图?
  2. 加拿大计算机转学案例,在加拿大转学步骤详解
  3. 前端js实现路由切换页面 pushState replaceState
  4. 考研,考证必备软件!
  5. 2015年上海计算机一级考试答案,2015 上海计算机一级F套
  6. Java实现 蓝桥杯VIP 算法训练 星际交流
  7. 瑞禧|富勒烯C60|Fullerene-C60|CAS:99685-96-8
  8. 小目标检测相关技巧总结
  9. 2021年电工(初级)答案解析及电工(初级)作业考试题库
  10. 深度学习论文导航 | 06 SSP-Net:深度卷积网络中的空间金字塔池用于视觉识别