@agpwhy
2021-09-26T08:17:03.000000Z
字数 1695
阅读 321
执医考完了。具体就不谈了,也算准备过了,希望一次通过吧。这次讲一个最近完成的需求,桑基图。
https://www.r-graph-gallery.com/321-introduction-to-interactive-sankey-diagram-2.html
Sankey diagrams are a type of flow diagram in which the width of the arrows is proportional to the flow rate.
我简单重组一下语言就是通过箭头的粗细来表达数据流动的情况。
画桑基图数据最重要的就是要明确层级。
比如说我画一个三段的桑基图,比如说我手头有一千个客户,其中三百个是山东人,四百个是上海人,还有各个省市的,那就把户籍作为第一段;第二段是看客户的公司,比如三百个是小老马的,四百是大老黄的,还有其他三百个是刘兄弟的,那就把客户公司作为第二段;最后一段是看客户规模,其中十个大客户,九十个是普通客户,剩下九百个是小客户,那这样把客户规模放在第三段。这样画出来的图就是看户籍比例和客户公司的对应情况,再看客户公司和客户规模的对应情况,但是看不了户籍比例和客户规模的对应情况。
需要明确自己想展示什么,是展示桑基图的第一要务。设计行于操作之前。
library(networkD3)
library(dplyr)
然后把三个层级的数据设置一下
links <- data.frame(
source = c(
"Shandong",
"Shandong",
"Shandong",
"Shanghai",
"Shanghai",
"Shanghai",
"Guangxi",
"Guangxi",
"Guangxi",
"Xiao Lao Ma",
"Xiao Lao Ma",
"Xiao Lao Ma",
"PDD",
"PDD",
"PDD",
"Xiongdi",
"Xiongdi",
"Xiongdi"
),
target = c(
"Xiao Lao Ma",
"PDD",
"Xiongdi",
"Xiao Lao Ma",
"PDD",
"Xiongdi",
"Xiao Lao Ma",
"PDD",
"Xiongdi",
"Huuuge",
"Big",
"Normal",
"Huuuge",
"Big",
"Normal",
"Huuuge",
"Big",
"Normal"
),
value = c(100,50,150,40,60,300,100,80,120,10,130,100,10,80,100,120,100,350)
)
设置下nodes(节点)
nodes <- data.frame(name =c(as.character(links$source),as.character(links$target)) %>% unique())
再设置下source和target(就是流入,流出)
links$IDsource <- match(links$source, nodes$name) - 1
links$IDtarget <- match(links$target, nodes$name) - 1
最后画图
p <- sankeyNetwork(
Links = links,
Nodes = nodes,
Source = "IDsource",
Target = "IDtarget",
Value = "value",
NodeID = "name",
sinksRight=F
)
储存这个结果会有点小奇怪,是从html中截图。
事实上这个html可以交互。自己可以试试看哈。
library(htmlwidgets)
saveWidget(p, file=paste0(getwd(), "/sankeyBasic.html"))
library(streamgraph)
library(webshot)
webshot("sankeyBasic.html" , "output.png", delay = 0.2)
其他一些高级的调整,可以看这个
https://www.r-graph-gallery.com/322-custom-colours-in-sankey-diagram.html