首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于networkd3的R中离散状态序列的Sankey图

基于networkd3的R中离散状态序列的Sankey图
EN

Stack Overflow用户
提问于 2017-07-24 22:19:46
回答 1查看 491关注 0票数 1

我正在尝试使用http://christophergandrud.github.io/networkD3/#sankey中描述的networkD3包在R中创建一个交互式的Sankey图。我的数据是离散状态序列(DSS)格式。1行代表1个事件序列。NAs表示序列已结束。在R中重新创建数据样本:

代码语言:javascript
复制
x1 <- c('06002100', '06002001', '06001304', '06002100')
x2 <- c('06002100', '06002001', 'NA', 'NA')
x3 <- c('06001304', '06002100', '06002001', 'NA')
test <- as.data.frame(rbind(x1,x2,x3))

networkd3包需要json格式的数据,如下所示:

代码语言:javascript
复制
URL <- paste0("https://cdn.rawgit.com/christophergandrud/networkD3/","master/JSONdata/energy.json")

将上面的样本数据转换为所需的格式将得到(test.json):

代码语言:javascript
复制
{"nodes":[
{"name":"06002100"},
{"name":"06002001"},
{"name":"06001304"}
],
"links":[
{"source":0,"target":1,"value":3},
{"source":1,"target":2,"value":1},
{"source":2,"target":0,"value":2}
]}

一旦数据采用上述格式,我就可以使用以下代码来绘制sankey网络。

代码语言:javascript
复制
library(networkD3) 
library(jsonlite) 
Energy <- fromJSON(txt = 'test.json') # Load the data 
result <- as.data.frame(Energy) 
sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source", Target = "target", Value = "value", NodeID = "name", fontSize = 12, nodeWidth = 30)

我想将我拥有的决策支持系统数据转换为networkD3所需的格式。有什么直接的方法可以做到这一点吗?

networkD3 examples页面提到,我可以使用igraph包创建可以用networkD3绘制的网络图数据。不幸的是,我找不到好的例子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-25 15:22:24

sankeyNetwork()最终想要的是LinksNodes数据帧。假设在DSS数据中,每对并排的节点定义了从左到右的链接,那么数据帧的每一对连续列看起来就像是具有sourcetarget列的Links数据帧的一部分。

首先,我修复了您的代码,使其成为真正的NAs,而不是“NA”字符串……

代码语言:javascript
复制
x1 <- c('06002100', '06002001', '06002425', '06009347', '06010001', '06010383', '06009348')
x2 <- c('06002100', '06040401', '06009347', '06039301', NA, NA, NA)
x3 <- c('06001304', '06002001', '06009346', '06002425', '06003303', NA, NA)
x4 <- c('06002100', '06040401', '06009347', '06039301', '06039302', '06032301', '06032301')
test <- as.data.frame(rbind(x1,x2,x3,x4))

为数据框中的每组连续列提取一个数据框,将它们绑定到一个长Links数据框中,并省略具有NA的行...

代码语言:javascript
复制
linklist <- lapply(1:(ncol(test) - 1), function(x) data.frame(source = test[[x]], target = test[[x+1]], stringsAsFactors = F))
links <- na.omit(do.call(rbind, linklist))

将所有唯一的节点名称创建一个矢量并从中生成一个Nodes数据框,基于Nodes数据框中的零索引名称构建一个Links数据框,然后绘制它...

代码语言:javascript
复制
node_names <- factor(sort(unique(c(as.character(links$source), 
                                   as.character(links$target)))))
nodes <- data.frame(name = node_names)
links <- data.frame(source = match(links$source, node_names) - 1, 
                    target = match(links$target, node_names) - 1,
                    value = 1)

library(networkD3)
sankeyNetwork(links, nodes, "source", "target", "value", "name")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45282987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档