感觉100年没有上简书,近2个月忙于毕业论文以及公众号推文,没有时间更文章。终于前几天交了论文呢,可以回来更文了。没错我只是在为我的懒惰寻找接口,今天我们来讲一下桑基图(Sankey diagram)。P.S.最近觉得有必要好好认真系统地学习一下机器学习,可能之后也会整理发个简书系列,书我已经买好了就差看了。
什么是桑基图(Sankey diagram)
先来给大家展示几张桑基图的图片,帮助大家迅速对桑基图建立一个直观的概念。
在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作图
用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。
今天就分享到这里啦。
往期R数据可视化分享
R数据可视化16:哑铃图
R数据可视化15:倾斜图 Slope Graph
R数据可视化14:生存曲线图
R数据可视化13:瀑布图/突变图谱
R数据可视化12: 曼哈顿图
R数据可视化11: 相关性图
R数据可视化10: 蜜蜂图 Beeswarm
R数据可视化9: 棒棒糖图 Lollipop Chart
R数据可视化8: 金字塔图和偏差图
R数据可视化7: 气泡图 Bubble Plot
R数据可视化6: 面积图 Area Chart
R数据可视化5: 热图 Heatmap
R数据可视化4: PCA和PCoA图
R数据可视化3: 直方/条形图
R数据可视化2: 箱形图 Boxplot
R数据可视化1: 火山图