前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」数据可视化17:桑基图

「R」数据可视化17:桑基图

作者头像
王诗翔呀
发布2020-07-03 12:08:29
2.3K0
发布2020-07-03 12:08:29
举报
文章被收录于专栏:优雅R优雅R
什么是桑基图(Sankey diagram)

先来给大家展示几张桑基图的图片,帮助大家迅速对桑基图建立一个直观的概念。

浮夸的桑基图:水利循环系统

文献里的桑基图:展示了克罗恩病患者的菌群变化 图片来源:https://www.biorxiv.org/content/10.1101/772483v1.full

在Wiki的介绍中,讲桑基图描述为“是一种流程图,其中箭头的宽度与流速成正比”。不过实际上桑基图可以展示很多方面的内容,包括一些动态的变化比如移民情况,还可以展示数据的具体来源等等。虽然此类图在文章中出现的频率不高,但是有时候,尤其是在做纯生信或者生信内容占比较大的文章时,我们需要使用多样的可视化方式,不能总是使用箱型图、柱状图等,此时,不妨考虑一下桑基图。

这里举个具体的例子,下面这张桑基图展示了移民情况,显示了从一个国家(左)移居到另一个国家(右)的情况。

移民情况

从上图中,我们可以看到Europe、North America和West Asia是接受最多移民的地区。而South Asia、Latin America、Africa、East Asia是移民去其他国家最多的国家。进一步,我们还可以了解到Europe的移民主要来自Afica、Europe、Latin America,而North America则主要来自Latin America,West Asia主要来自South Asia。虽然我们可以用多个柱状图展示上述信息,但是可能就会十分复杂,也不好比较,而桑基图可以同时展示多个组的变化信息,毕竟支持进行不同组之间的比较。

怎么做桑基图

偷个懒,我们这次就完全基于下述链接的代码来作图:Sankey作图[1]用networkD3包中的sankeyNetwork功能进行绘图。

1)需要什么格式的数据做桑基图所需要的数据有点麻烦,主要需要两类数据,一个是包括节点和数值在内的表,另一个是纯粹的节点的表。

代码语言:javascript
复制
head(data_long)
           source     target    value IDsource IDtarget
1          Africa    Africa  3.142471        0       10
2       East Asia East.Asia  1.630997        1       11
3      South Asia East.Asia  0.525881        2       11
4 South East Asia East.Asia  0.145264        3       11
5          Africa    Europe  2.107883        0       12
6       East Asia    Europe  0.601265        1       12
head(nodes)
             name
1          Africa
2       East Asia
3      South Asia
4 South East Asia
5          Europe
6   Latin America

2)如何作图

代码语言:javascript
复制
library(tidyverse)
library(viridis)
library(patchwork)
library(networkD3)


data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/13_AdjacencyDirectedWeighted.csv", header=TRUE)
data_long <- data %>%
  rownames_to_column %>% #将行名变为普通的列
  gather(key = 'key', value = 'value', -rowname) %>% #矩阵转化为作图需要的格式
  filter(value > 0) #筛选value即移民数大于0的
colnames(data_long) <- c("source", "target", "value")#改变列名
data_long$target <- paste(data_long$target, " ", sep="")#加上空格以便于区分target和source
nodes <- data.frame(name=c(as.character(data_long$source), as.character(data_long$target)) %>% unique())#制作nodes
data_long$IDsource=match(data_long$source, nodes$name)-1
data_long$IDtarget=match(data_long$target, nodes$name)-1
ColourScal='d3.scaleOrdinal() .range(["#F7FBFF", "#DEEBF7", "#C6DBEF", "#9ECAE1" ,"#6BAED6", "#4292C6" ,"#2171B5" ,"#084594"])'

sankeyNetwork(Links = data_long, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name",
              sinksRight=FALSE, colourScale=ColourScal, nodeWidth=40, fontSize=13, nodePadding=20)

如果不导出pdf的话,可以看到实际上是一个有互动的图。比如,将鼠标放在某一条link上,这条link就会变成深灰色,所以十分适合用于在网页上展示。其实从函数介绍中也可以看出来,"Create a D3 JavaScript Sankey diagram"

其中的几个参数意义如下:sinksRight:调整图片的位置,如果修改为T,图片会不留边,从右侧边界开始制图 nodeWidth:此图蓝色的方框的宽度 nodePadding:调整不同方框间的高度和宽度

当然,我们还可以考虑使用在线网站制图sankeymatic[2]

今天就分享到这里啦。

参考资料

[1]Sankey作图: https://www.data-to-viz.com/graph/sankey.html

[2]sankeymatic: http://sankeymatic.com/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是桑基图(Sankey diagram)
  • 怎么做桑基图
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档