用python画皇冠_手把手教你用 Python 绘制酷炫的桑基图!

原标题:手把手教你用 Python 绘制酷炫的桑基图!

35bb6aeb912c451f8a9c89993027c4b9.jpeg

作者 | 周志鹏

责编 | 郭 芮

最近,不止一次收到小伙伴的截图追问:

7386804c705642d0bfac22e8c3fb67e5.jpeg

“这个图叫什么???”

“这个图真好看!!!怎么画啊?”

......

笔者本没有干货,问的人多了,也便有了干货。

此图姓桑名基,平素不喜露面。奈何天生丽质,偶有露面,必引众人围观。

时人有云:“桑基桑基,高贵美丽!”

桑基是何许图也?

据笔者不严谨的抽样提问统计,90%想学习桑基图的旁友,都是被她妖艳炫酷的外表所吸引。

而桑基图真正代表了什么?和类似图表相比的独特性是什么?却几乎无人问津。

害!人真的是视觉动物!

言归正传,我们来看看百科的官方解释:

桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的"蒸汽机的能源效率图"而闻名,此后便以其名字命名为"桑基图"。

Emmm,有点内个意思了,结合其他资料,做进一步的汇总提炼:

桑基两个字取自“发明”者的名字

属于流程图的一种,核心在于展示数据的流转

主要由节点、边和流量三要素构成,边越宽代表流量越大

遵循守恒定律,无论怎么流动,开端和末端数据总是一致的

文字太苍白,下面我们用Python来绘制一个具体的实例。

Python手把手绘制桑基图

动手之前,我们再次敲黑板,回顾桑基图组成要素的重点——节点、边和流量。

任何桑基图,无论展现形式如何夸张,色彩如何艳丽,动效如何炫酷,本质都逃不出上述3点。

只要我们定义好上述3个要素,Python的pyecharts库能够轻松实现桑基图的绘制。

这里我们用“当代青年熬夜原因分析”数据为例:

(数据来源:这个数据是笔者近两周卖炒粉时口头做的调研)

d077174f516f45949bd0a86ec5bea4de.png

很规整的性别、熬夜原因、人数三列数据。

不过,要用pyecharts来画图,得入乡随俗,按照它定的规则来规整数据源。

首先是节点,这一步需要把所有涉及到的节点去重规整在一起。也就是要把性别一列的“男”、“女”和熬夜原因一列的“打游戏”、“加班”、“看剧”以列表内嵌套字典的形式去重汇总:

8f8fb4b99a64422f9d8cefac5973a0f2.png

接着,定义边和流量,数据从哪里流向哪里,流量(值)是多少,循环+字典依然可以轻松搞定:

c55420c3f1434ffca37b66a6d660af01.png

source-target-value的字典格式,很清晰的描述了数据的流转情况。

这两块数据准备完毕,桑基图已经完成了80%,剩下的20%,只是固定格式的绘图代码:

frompyecharts.charts importSankey

frompyecharts importoptions asopts

pic = (Sankey.add( '', #图例名称nodes, #传入节点数据linkes, #传入边和流量数据#设置透明度、弯曲度、颜色linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = "source"),#标签显示位置label_opts=opts.LabelOpts(position= "right"),#节点之前的距离node_gap = 30,).set_global_opts(title_opts=opts.TitleOpts(title = '熬夜原因桑基图')))

pic.render( 'test.html')

一个回车下去,看看成果:

7dca6afe05444ccc80440b5ed4a06862.jpeg

果然,男打游戏女看剧,加班熬夜是儿戏。

如果想要垂直显示,只需要在add函数里面加一个orient="vertical"就好:

pic = (Sankey. add( '',nodes,linkes,linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = "source"),label_opts=opts.LabelOpts(position= "top"),node_gap = 30,orient= "vertical", #更改的是这里).set_global_opts(title_opts=opts.TitleOpts(title = '熬夜原因细分桑基图')))pic.render( 'test2.html')

a188a0c6233346ebbbbf4ec32f4e485c.jpeg

OK!不过,还有同学意犹未尽,这个是涉及到两层的流转,那如果三层,需要怎么画呢?

不慌,先导入(狗粮)数据:

efadeb5dedf14f08a7cadf29df2b02b2.png

这是某宠物品牌,3月份主要产品购买路径(第一次和第二次)的数据,先是品类,其次是第一次购买的产品类型,接着是第二次购买的产品类型,最后一列对应人数。

(注:这里第一次购买的产品前面加了“1-”,第二次购买加了“2-”的区分标识。)

画图必备的nodes节点实现很简单,所有节点(品类、第一次购买、第二次购买)做去重汇总,对上面生成nodes代码稍作调整就可以:

3f05667df7cb49c3bceb51ac657b7ff8.png

而linkes只接受source-traget-value的格式,得先对源数据进行格式调整,分别形成“品类-第一次购买-人数”,“第一次购买-第二次购买-人数”的样式,再统一汇总:

0a1b5535899e4c8f9b3a4f4fd9322afe.png

规整汇总好之后,只需要复用上面的linkes代码:

bf19ad07aa084db7a5a9eec9f80c83b6.png

画图代码几乎没变,只是改了个标题:

pic = (Sankey. add( '',nodes,linkes,linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = 'source'),label_opts=opts.LabelOpts(position = 'top'),node_gap = 30,).set_global_opts(title_opts=opts.TitleOpts(title = '客户购买路径流转图')))pic.render( 'test3.html')

大功告成,So easy!无论是多少层数据的流转,只要定义好nodes和linkes,就能以不变应万变。

2e456648adfe4a41be3e5a54b67b1111.jpeg

最后,通过上面的桑基图,我们能够非常直观的洞察到客户购买流转规律:

出于试错成本的考量,大部分客户第一次购买的是小规格狗粮。

第一次购买小规格狗粮的客户,流失(第二次未购买)情况严重,且再次购买客户,更倾向于继续选择小规格狗粮尝试,而不是信任性的购买大规格狗粮。

第一次购买大规格狗粮的客户,留存下来的客户已经建立起对品牌的信任感,再次购买大部分选择了大规格狗粮。

购买狗粮的客户第二次复购鲜有尝试玩具的,而第一次购买玩具的客户,也并未建立起对品牌狗粮的兴趣。

原本死板的数据,在桑基的装扮之下,变得楚楚动人。

作者:周志鹏,3年数据分析,深切感受到数据分析的有趣和学习过程中缺少案例的无奈,遂新开公众号「数据不吹牛」,定期更新数据分析相关技巧和有趣案例(含实战数据集),欢迎大家关注交流。

声明:本文为作者投稿,版权归其所有。

☞业内最大的“空气币”——以太坊???返回搜狐,查看更多

责任编辑:

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

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

相关文章

ejb能调用另一个ejb吗_异步EJB只是一个Gi头吗?

ejb能调用另一个ejb吗在之前的文章( 此处和此处 )中,我展示了当服务器负载沉重时,创建非阻塞异步应用程序可以提高性能。 EJB 3.1引入了Asynchronous批注,用于指定方法将在将来的某个时间返回其结果。 Javadocs声明必须…

为啥电脑从C盘开始?A、B盘去哪了?

点击蓝字关注我们前些天硬盘坏了,幸好不是系统盘,不然那些软件安装配置会把我折腾坏,或许这也是在暗示我该换电脑了。重要的数据部分没有遭到损坏,数据是无价的,还是要勤备份。于是换上了一张新的硬盘,当时…

Python3求最后一个单词长度

Python3求最后一个单词长度原题:https://leetcode-cn.com/problems/length-of-last-word/ 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 …

java 锁_Java之线程并发的各种锁、锁、锁

因为两周没更新了...也不是懒,这两周确实有些忙,赶项目进度赶的不亦乐乎...终于赶在工期前,可以进入内测了,我也有了些时间,可以更新啦...线程并发锁是很常见的问题,而且在Java中锁的类型、概念、使用场景等…

threadsafe_Agrona的Threadsafe堆缓冲区

threadsafe这篇博客文章通过说明我们如何轻松访问线程内存来进行线程安全操作,继续了我在Agrona库上进行的系列文章 。 在继续讨论这是一个相当高级的主题之前,我可能应该警告一下,并且我不尝试解释诸如内存屏障之类的概念,仅概述…

C语言编程中错误异常该如何统一处理?1.8万字总结

点击蓝字关注我们本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。一、错误概念1.1 错误分类从严重性而言,程序错误可分为致命性和非致命性两类。对于致命性错误,无法执行恢复动作,最多只能在用户屏幕上打印出错消息或将其…

Python3实现最小栈

Python3实现最小栈原题 https://leetcode-cn.com/problems/min-stack/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin…

pycharm remote 远程项目 同步 本地_利器:PyCharm本地连接服务器搭建深度学习实验环境的三重境界...

作为实验室社畜,常需要在本地使用Pycharm写代码,然后将代码同步到服务器上,使用远程登录服务器并运行代码做实验。这其中有很多事情如果没有好的工具,做起来会非常麻烦。比如如何快速同步本地与服务器的代码?如何优雅地…

防御性编程技巧

点击蓝字关注我们在防御性编程的大框架之下,有许多常识性的规则。人们在想到防御性编程的时候,通常都会想到“断言”,这没有错。我们将在后面对此进行讨论。但是,还是有一些简单的编程习惯可以极大地提高代码的安全性。尽管看上去…

unity创建和销毁对象_如何创建和销毁对象

unity创建和销毁对象本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的旅程! 在这里查看 &…

Python3实现打家劫舍问题

Python3实现打家劫舍问题原题 https://leetcode-cn.com/problems/house-robber/ 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同…

cookie无法读取bdstoken_第二章(第12节):cookie操作

有时候我们需要验证浏览器中 cookie 是否正确,因为基于真实 cookie 的测试是无法通过白盒和集成测试进行的。WebDriver 提供了操作 cookie 的相关方法,可以读取、添加和删除 cookie信息。WebDriver 操作 cookie 的方法:get_cookies()&#xf…

js 序列化内置对象_内置序列化技术

js 序列化内置对象本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的旅程! 在这里查看 &#x…

C++ 基本的输入输出

点击蓝字关注我们C 标准库虽然提供了一组丰富的输入/输出功能,但是本章只讨论 C 编程中最基本和最常见的 I/O 操作。C 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,…

Python3有效括号问题

Python3有效括号问题原题 https://leetcode-cn.com/problems/valid-parentheses/ 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 左…

http 和 https_HTTPS与HTTP区别

HTTPS与HTTP的认识:HTTP 加密 认证 完整性保护 HTTPSHTTP的全称是 Hypertext Transfer Protocol Vertion (超文本传输协议)HTTPS: HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议。HTTPS和HTTP的区别:HTTPS协议需要到ca申…

C语言指针的自我介绍(你了解我吗?了解多少?)

点击蓝字关注我们hey! Ladies and Gentlemen.😁欢迎大家来看望我,对,我就是指针(pointer),被很多人吐槽😔,也被人说好。我希望大家了解过我以后,能够爱上我😘。大家在了解我之前 &am…

Python3最长连续递增序列问题

Python3最长连续递增序列问题原题 https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/ 题目: 给定一个未经排序的整数数组,找到最长且连续的的递增序列。 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1…

访问nfs_通过NFS访问编年引擎

访问nfs总览 编年史引擎是数据虚拟化层。 它抽象化了访问,操作和订阅各种数据源的复杂性,因此该数据的用户无需知道实际存储数据的方式或位置。 这意味着该数据可以在系统之间迁移或以更有效的方式存储,但对于开发人员来说使用起来很复杂。 …

flex 解析json文件_使用 Python 处理 JSON 格式的数据 | Linux 中国

如果你不希望从头开始创造一种数据格式来存放数据,JSON 是一个很好的选择。如果你对 Python 有所了解,就更加事半功倍了。下面就来介绍一下如何使用 Python 处理 JSON 数据。-- Seth KenlonJSON 的全称是 JavaScript 对象表示法JavaScript Object Notati…