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

news2024/12/23 8:21:24

循序渐进,学会用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绘制玫瑰图

📢欢迎 点赞👍 收藏⭐ 评论📝 关注 如有错误敬请指正!

☟ 学Python,点击下方名片关注我。☟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/446983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地Nacos设置脚本命令启动

一、起因: 每次启动都要找到位置写一遍命令费劲。 1、可设置开机启动 2、可设置脚本自动 二、配置脚本: 1、这是我nacos的位置 用bat命令启动一个cmd命令行,然后在里面执行两天命令。 ①命令一:打开指定路径 ②命令二&#xf…

Java图书借阅管理系统详细设计和实现

基于JavaSpringHtml的图书借阅管理系统详细设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

cmd连接本地mysql数据库和远程服务器mysql数据库

1.在cmd窗口里连接本地的mysql数据库 打开运行窗口,输入cmd,确定 windowsr 或在左下角windows图标处鼠标右键,点击运行按钮打开运行窗口 格式: mysql -u用户名 -p密码 mysql -uroot -p123456 成功进入mysql 2. 在cmd窗口里连接远…

尚硅谷_宋红康_第17章_反射机制

第17章_反射机制 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中,所有的对象都有两种类型:编译时类型和运行时类型,而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.ge…

Django使用Celery异步发送邮件

Django使用Celery异步发送邮件 前言邮箱配置Django项目发送邮件配置邮件服务器Django发送邮件模块 Celery概述工作模式安装Celery Celery的基本使用创建config.py配置文件创建Celery实例并加载配置定义任务启动Celery服务提交任务异常 Celery发送邮件创建config.py配置文件创建…

机器学习 day05(多元线性回归,向量化,及向量化高效的原理)

1. 单个特征(变量)的线性回归模型 房子的价格仅由房子的大小决定,如图: 2. 多个特征(变量)的线性回归模型 房子的价格由房子的大小,房子有多少个卧室,房子有几层,房子…

2023年,逆势拿到大厂Offer,我怎么做?|原创

关于面试,做一些经验分享。 过年时候默默给自己定下了3个目标。第一个就是2023要换一份喜欢的工作。没想到在4月就提前实现了这个目标。 是一个我很看好的大厂,期待的岗位、看好的方向,薪资涨幅也比较给力。最近这段时间没空发文章&#xff0…

MySql中,join 语句怎么优化?

既然每次从驱动表取数据比较耗时,那我们每次从驱动表取一批数据放到内存中,然后对这一批数据进行匹配操作。这批数据匹配完毕,再从驱动表中取一批数据放到内存中,直到驱动表的数据全都匹配完毕 批量取数据能减少很多IO操作&#…

二十三、高级网络技术及应用——BFD解析

文章目录 前言一、BFD 简介1、概述:2、作用: 二、静态路由调用 BFD1、配置静态 BFD2、配置动态 BFD 三、OSPF联动BFD四、BFD 单臂回声(one arm echo) 前言 BFD:Bidirectional Forwarding Detection,双向转…

奇舞周刊第490期:WebAssembly 多语言/宿主环境中的使用

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ WebAssembly 多语言/宿主环境中的使用 WebAssembly (WASM) 的一个优势就是能够支持将不同语言编译成 WASM 代码,然后在不同的宿主环境中运行。这样就可以在不同的宿主环…

【WSN定位】基于多通信半径和跳距加权优化的Dvhop定位算法【Matlab代码#15】

文章目录 1. 原始Dvhop定位算法2. 多通信半径3. 加权跳距4. 部分代码展示5. 仿真结果展示6. 资源获取 1. 原始Dvhop定位算法 可参考Dvhop定位算法 2. 多通信半径 设网络通信半径为 R R R,将锚节点与邻居节点间分为 m m m级,网络中各信标节点与其邻居节…

Nuxt3用nginx部署到二级目录

有的时候我们需要把我们写的Nuxt3项目部署到域名的二级目录,例如:https://abc.xx.com/abc/目录下。主要就是用nginx进行配置代理转发来实现的,这样可以实现我们同一个域名下可以部署多个Nuxt3独立的项目,只不过端口不同。使用ngin…

Node【Global全局对象】之【Buffer】

文章目录 🌟前言🌟Buffer🌟Buffer介绍🌟Buffer对象:类似于数组,其元素是16进制的两位数。🌟什么时候用Buffer🌟Buffer的转换🌟Buffer使用🌟创建Buffer&#x…

uniapp 来电显示悬浮窗插件(支持锁屏来电) Ba-CallerID

简介(下载地址) Ba-CallerID 是一款来电显示悬浮窗插件插件。 支持显示、隐藏支持锁屏来电显示支持自定义位置显示(上、中、下)支持拖动(这版不支持,需要的话可以加)支持申请、判断悬浮窗权限…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在,我们生活节奏加快,信息量也越来越大,有时候想了解新闻却又不想眼睛再去盯着手机屏幕了,这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音,别担心,今天我将向大…

JavaSE注解和反射

注解分类和说明点 注解:可对程序做解释可被其他程序读取 元注解:Target:表明注解的使用范围,Retention:表示要在什么级别保存注解信息,Document,Inherited 自定义注解:interface …

P1027 [NOIP2001 提高组] Car 的旅行路线

题目描述 又到暑假了,住在城市 A 的 Car 想和朋友一起去城市旅游。 她知道每个城市都有 44 个飞机场,分别位于一个矩形的 44 个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第 �i 个城市中高速铁路了的单位…

【let变量声明以及声明特性】

let变量声明以及声明特性 1 let变量声明2 let声明特性3 let经典案例实践 1 let变量声明 <script>// 声明变量let a;let b,c,d;let e 100;let f 521, g iloveyou, h [];</script>2 let声明特性 1> 变量不能重复声明2> 块级作用域、全局作用域、函数作用域…

4.5 函数最佳逼近

学习目标&#xff1a; 要学习函数最佳逼近&#xff0c;我可能会采取以下几个步骤&#xff1a; 学习基本的数学知识和工具&#xff1a;函数最佳逼近涉及到线性代数、实变函数、泛函分析等多个领域的知识&#xff0c;因此我需要先学习这些基础知识和工具&#xff0c;例如矩阵和向…

论文各子结构的实现

本文将简明介绍人工智能论文各子结构的实现方法&#xff0c;重点指出了各部分实现时的要点&#xff0c;帮助读者高效地完成论文的写作。 1. 标题 论文标题的确定必须遵循明确而有吸引力的原则。论文的题目需要准确反映自己论文的研究内容和创新点&#xff0c;同时还必须具有吸…