使用R画桑基图(流程图)

桑基图可以用来表示各个节点之间转换

在R中可以直接定义点点之间的关系后使用相应的package画桑基图:


方法一:

riverplot

[plain]  view plain  copy
  1. library(riverplot)  
  2.   
  3. # 构造连接节点的数据框  
  4. edges = data.frame(N1 = paste0(rep(LETTERS[1:4], each = 4), rep(1:5, each = 16)),  
  5.                    N2 = paste0(rep(LETTERS[1:4], 4), rep(2:6, each = 16)),  
  6.                    Value = runif(80, min = 2, max = 5) * rep(c(1, 0.8, 0.6, 0.4, 0.3), each = 16),  
  7.                    stringsAsFactors = F)  
  8. # 筛选80%的记录,以免每个点都对应到4个点  
  9. edges = edges[sample(c(TRUE, FALSE), nrow(edges), replace = TRUE, prob = c(0.8, 0.2)),]  
  10. head(edges)  
  11.   
  12.   
  13. nodes = data.frame(ID = unique(c(edges$N1, edges$N2)), stringsAsFactors = FALSE)  
  14. #  
  15. nodes$x = as.integer(substr(nodes$ID, 2, 2))  
  16. nodes$y = as.integer(sapply(substr(nodes$ID, 1, 1), charToRaw)) - 65  
  17. #  
  18. rownames(nodes) = nodes$ID  
  19. head(nodes)  
  20.   
  21.   
  22. # 添加颜色  
  23. library(RColorBrewer)  
  24. # 后面加调淡颜色  
  25. palette = paste0(brewer.pal(4, "Set1"), "60")  
  26.   
  27. # 对每个节点生成相应的格式  
  28. styles = lapply(nodes$y, function(n) {  
  29.   list(col = palette[n+1], lty = 0, textcol = "black")  
  30. })  
  31. names(styles) = nodes$ID  
  32.   
  33.   
  34. # 以list的结构保存一遍调用  
  35. rp <- list(nodes = nodes, edges = edges, styles = styles)  
  36. class(rp) <- c(class(rp), "riverplot")  
  37. plot(rp, plot_area = 0.95, yscale=0.06)  

效果图见:



方法二:

使用包d3Network或者circlize,d3Network是调用D3的画图功能来实现,使用一下代码实现:

[plain]  view plain  copy
  1. library(d3Network)  
  2. d3links <- edges  
  3. d3nodes <- data.frame(name = unique(c(edges$N1, edges$N2)), stringsAsFactors = FALSE)  
  4. d3nodes$seq <- 0:(nrow(d3nodes) - 1)  
  5.   
  6. d3links <- merge(d3links, d3nodes, by.x="N1", by.y="name")  
  7. names(d3links)[4] <- "source"  
  8.   
  9. d3links <- merge(d3links, d3nodes, by.x="N2", by.y="name")  
  10. names(d3links)[5] <- "target"  
  11. names(d3links)[3] <- "value"  
  12.   
  13. d3links <- subset(d3links, select=c("source", "target", "value"))  
  14. d3nodes <- subset(d3nodes, select=c("name"))  
  15.   
  16. # 画图并保存为html文件  
  17. d3Sankey(Links = d3links, Nodes = d3nodes, Source = "source",  
  18.          Target = "target", Value = "value", NodeID = "name",  
  19.          fontsize = 12, nodeWidth = 30, file = "TestSankey.html")  

效果图:



备注:

(1)d3Network保存为HTML文件,有交互式效果;riverplot可选择保存为不同的图片类型

(2)操作中感觉使用riverplot更易调整


猜你喜欢

转载自blog.csdn.net/wenyusuran/article/details/80674753