先来给大家展示几张桑基图的图片,帮助大家迅速对桑基图建立一个直观的概念。
浮夸的桑基图:水利循环系统
文献里的桑基图:展示了克罗恩病患者的菌群变化 图片来源: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)需要什么格式的数据做桑基图所需要的数据有点麻烦,主要需要两类数据,一个是包括节点和数值在内的表,另一个是纯粹的节点的表。
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)如何作图
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/