桑基图,绘制人口流动、网络等表征信息流动关系或者对应关系的图表。
使用bipartite包自带的二分网络数据进行绘制。
library(igraph)
library(networkD3)
library(bipartite)
library(tidyr)
data(Safariland)
nodes = data.frame(ID = unique(c(rownames(Safariland),colnames(Safariland))), stringsAsFactors = FALSE)
edges <- Safariland %>% as.data.frame() %>% tibble::rownames_to_column(.,var = "plants") %>%
pivot_longer(cols = !plants ,names_to = "animals") %>%
mutate(value = if_else(value>0,1,0))%>%
filter(value!=0) %>% as.data.frame()
edges$plants <- match(edges$plants, nodes$ID) - 1
edges$animals <- match(edges$animals, nodes$ID) - 1
networkD3::sankeyNetwork(Links = edges ,
Nodes = nodes,
Source = "plants",
Target = "animals",
Value = "value",
NodeID = "ID")
需要注意的地方在于 match 定义顺序后需要再减一
edges$plants <- match(edges$plants, nodes$ID) - 1
edges$animals <- match(edges$animals, nodes$ID) - 1

image.png