R 中使用 networkd3 的离散状态序列的桑基图
Sankey diagram for Discrete State Sequences in R using networkd3
我正在尝试使用 networkD3
包在 R 中创建交互式 Sankey 图,如 http://christophergandrud.github.io/networkD3/#sankey 中所述。我的数据采用离散状态序列 (DSS) 的格式。 1 行代表 1 个事件序列。 NA 表示序列已经结束。在 R 中重新创建数据样本:
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 形式的数据,如下所示:
URL <- paste0("https://cdn.rawgit.com/christophergandrud/networkD3/","master/JSONdata/energy.json")
以所需格式转换上面的示例数据会得到 (test.json
):
{"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}
]}
一旦数据采用上述格式,我就可以使用以下代码绘制桑基网络。
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)
我想将我拥有的 DSS 数据转换为 networkD3 所需的格式。有直接的方法吗?
networkD3 示例页面提到我可以使用 igraph
包来创建可以用 networkD3 绘制的网络图数据。不幸的是,我找不到很好的例子。
sankeyNetwork()
最终想要的是一个Links
和一个Nodes
数据框。假设在您的 DSS 数据中,每个并排的节点对从左到右定义一个 link,那么您的数据框的每对连续列看起来就像 Links
数据框的一部分,带有 source
和 target
列。
首先,我修正了你的代码,使它成为真正的 NA
s 而不是 "NA"...
的字符串
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 的行...
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
数据框数据框,然后绘制它...
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")
我正在尝试使用 networkD3
包在 R 中创建交互式 Sankey 图,如 http://christophergandrud.github.io/networkD3/#sankey 中所述。我的数据采用离散状态序列 (DSS) 的格式。 1 行代表 1 个事件序列。 NA 表示序列已经结束。在 R 中重新创建数据样本:
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 形式的数据,如下所示:
URL <- paste0("https://cdn.rawgit.com/christophergandrud/networkD3/","master/JSONdata/energy.json")
以所需格式转换上面的示例数据会得到 (test.json
):
{"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}
]}
一旦数据采用上述格式,我就可以使用以下代码绘制桑基网络。
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)
我想将我拥有的 DSS 数据转换为 networkD3 所需的格式。有直接的方法吗?
networkD3 示例页面提到我可以使用 igraph
包来创建可以用 networkD3 绘制的网络图数据。不幸的是,我找不到很好的例子。
sankeyNetwork()
最终想要的是一个Links
和一个Nodes
数据框。假设在您的 DSS 数据中,每个并排的节点对从左到右定义一个 link,那么您的数据框的每对连续列看起来就像 Links
数据框的一部分,带有 source
和 target
列。
首先,我修正了你的代码,使它成为真正的 NA
s 而不是 "NA"...
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 的行...
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
数据框数据框,然后绘制它...
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")