专栏首页生信修炼手册好看的桑基图是如何炼成的!

好看的桑基图是如何炼成的!

Sankey Diagram, 也叫做桑基图,是一种展示数据流的可视化方式,一张典型的桑基图示例如下

这张图展示的是不同国家之间的人口流动,可以看到图中包含了如下几个因素

1. node, 即节点,常用矩形方块和文字注释来表示,在上图中表示的是不同的国家

2. link, 即连线,表示不同节点之间的数据流通,这个连线是有方向的,从节点A流向节点B, 节点A称之为source, 即起始节点,节点B称之为target, 即目标节点

从组成结构可以看出,桑基图的数据其实是一个网状结构,构成了一个network。和普通的发散性的网络不同,在桑基图中,数据总是从source流动到了target,而且1个source会对应多个target, 1个target也会有多个source, 为了更加量化的展示同一个节点不同流入/流出数据的比例,采用了link的宽度这一属性,可以看到link的宽度与矩形节点的高度是呈比例的,source节点的所有流出数据的link总宽度等于节点的高度,对应target节点,则所有流入数据的link的总宽度等于节点的高度。

综上,桑基图的输入数据就是一个网络,其可视化的重点在于展示数据的线性流动,需要注意的是,桑基图中只有节点的概念,没有层级的概念,就是说我们只需要输入两两节点之间的连线关系,而桑基图可视化工具会自动计算节点的位置,一个更加扩展性的桑基图展示如下

这个特性也是桑基图与冲击图alluvial plot最大的不同,在冲击图中,不同层级的节点是我们手动指定的,一个典型的冲击图示例如下

结合前面的解释可以看到,桑基图和冲击图可视化的源数据都是相同的,区别仅在于节点位置的计算,以及可视化结果上的微小差异。

明白了桑基图展示的信息之后,我们来研究下实现桑基图的工具和方法。就美观性而言,首推d3.js, 这是一个基于javascript的可视化库,支持多种类型的可视化,桑基图也不在话下,具体的代码可以参考如下链接

https://observablehq.com/@d3/sankey

但是这个需要javascript的编程基础, 为了方便R语言的用户,有人开发了NetworkD3这个R包,可以在R中实现使用d3.js来绘图,基础用法如下

> library(networkD3)
> Energy <- jsonlite::fromJSON("energy.json")
> head(Energy$links)
  source target   value
1      0      1 124.729
2      1      2   0.597
3      1      3  26.862
4      1      4 280.322
5      1      5  81.144
6      6      2  35.000
> head(Energy$nodes)
                  name
1 Agricultural 'waste'
2       Bio-conversion
3               Liquid
4               Losses
5                Solid
6                  Gas

> sankeyNetwork(
+   Links = Energy$links,
+   Nodes = Energy$nodes,
+   Source = 'source',
+   Target = 'target',
+   Value = 'value',
+   NodeID = 'name',
+   colourScale = JS("d3.scaleOrdinal(d3.schemeCategory10);")
+ )

可视化效果如下

energy.json这个文件可以从以下链接获取

https://github.com/christophergandrud/d3Network/blob/master/JSONdata/energy.json

默认的可视化结果,不同节点用不同颜色表示,连线用灰色表示,为了控制节点和连线的颜色,我们可以使用NodeGroup和LInkGroup参数,将节点和连线进行分组,这样就可以将其映射为不同的颜色了。

·end·

文章分享自微信公众号:
生信修炼手册

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:lzyg
原始发表时间:2022-05-09
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Python 绘制惊艳的桑基图

    很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况。例如,以居民如何从一个国家迁移到另一个国家为例。这里演示了有多少居民从英格兰迁移到北爱尔兰、苏格兰...

    数据STUDIO
  • 桑基图在单细胞数据探索中的应用

    桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,比较适用于用户流...

    生信技能树jimmy
  • python可视化 | 地理桑基图的绘制方法

    我回答目前常用的库包不能直接绘制这样的桑基图,我错了,应该回答是目前常用的库包不能绘制这样漂亮些的桑基图。

    郭好奇同学
  • pyecharts实现多节点、长路径的sankey桑基图

    pyecharts︱交互式pyecharts的相关使用教程 简单的用pyecharts实现超多节点、较长路径的桑基图,一个样图:

    悟乙己
  • TidyFriday R 语言中桑基图的一些画法。。。

    首先我们需要构造一个示例数据集用于接下来的演示,这里我使用的是我的微信好友数据里面的省份、城市、性别变量。这个数据可以用下面的 Python 脚本获取:

    王诗翔呀
  • ToB规模化销售是如何炼成的?

    来源:硅谷销售研究院 |作者:Patrick ---- 规模化销售不是一天炼成的,但是有科学的方法和路径可以做到。 先说几个最近当面和微信聊天里的咨询客户...

    腾讯SaaS加速器
  • 161bytes的PE文件是如何炼成的~

    本文视你对PE文件的熟悉程度,初学者,大概会花掉你两个小时左右的时间完全理解。 最近在网上看到有大神做了个161bytes的hello world,正巧毕...

    Enjoy233
  • 一手好 SQL 是如何炼成的?

    博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。

    架构师修炼
  • “花见花开”:SaaS案例是如何炼成的?

    来源:中国软件网 ---- 作为一名企业管理者,如果问你一个问题,“2019年最后悔的事”是什么? 我们发现,不少管理者直言不讳地回答,“没有上SaaS平台!...

    腾讯SaaS加速器
  • 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密

    桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、...

    刘早起
  • 一手好 SQL 是如何炼成的?

    抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。

    lyb-geek
  • 1K star+ 的项目是如何炼成的?

    首先标题党一下,其实这篇文章主要是记录我的第二个过 1Kstar 的项目 Java-Interview,顺便分享下其中的过程及经验。

    crossoverJie
  • 成为web开发高手的学习之路是如何炼成的!

    如果你已经是一名优秀的Web开发人员,那请路过即可。如果你还是一个准备入行或刚入行的菜鸟,那本文倒值得一读。要成为一名优秀的Web开发人员,没有捷径可走,...

    用户1667431
  • 1K GitHub star+ 的项目是如何炼成的?

    首先标题党一下,其实这篇文章主要是记录我的第二个过 1K star 的项目 Java-Interview,顺便分享下其中的过程及经验。

    砸漏
  • 一个优秀的测试基础架构是如何炼成的?

      茹炳晟介绍到,eBay是一家大型电商平台,其中测试基础架构与DevOps的关系非常大,跟CI/CD(持续集成持续发布)高度集成。在CI/CD的流程中,对测试...

    小老鼠
  • 一篇互联网思维的健康日历是如何炼成的?

    日前,腾讯医典与花城出版社联合推出2020年腾讯健康日历。与普通的日历有所不同,健康日历主要以健康打卡的形式向大众传播专业科普资讯,其中更有每日健康提示、每周一...

    曾响铃
  • 万年漏洞王Struts2是如何炼成的

    17年三月份,Struts2再一次被爆出一个严重的漏洞S2-045,上传文件时可能存在RCE(Remote Code Execution)。由于涉及到的文件上传...

    topgunviper

扫码关注腾讯云开发者

领取腾讯云代金券