使用 networkD3 和数据框的有向图
Directed Graph using networkD3 and a data frame
我已经包含了一个数据框,它描述了我正在使用的数据的一个非常小的子集。由于数据中的节点数量众多,我的目标是构建一个交互式网络。
library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx", "zXZK7fkzrpPpJdb",
"ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:",
"visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)
data <- data.frame(screenName,mention,n)
simpleNetwork(data)
以上代码允许构建交互式无向网络图。我在 networkD3
R 库下遇到了 forceNetwork()
函数,这可能对这里有帮助。但我真的不知道如何将 data.frame 转换为它在此函数中的用法。提前谢谢您!
让我用文档中的例子来解释一下。
您需要两个数据框 - links
和 nodes
。
data(MisLinks)
glimpse(MisLinks)
#Observations: 254
#Variables: 3
#$ source <int> 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 11, 11, 11, 11, 12, 13, 14, 15, 17, 18, 18, 19, 19, 1...
#$ target <int> 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 10, 3, 2, 0, 11, 11, 11, 11, 16, 16, 17, 16, 17, 18, ...
#$ value <int> 1, 8, 10, 6, 1, 1, 1, 1, 2, 1, 1, 3, 3, 5, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4...
length(unique(c(MisLinks$source,MisLinks$target)))
#[1] 77
data(MisNodes)
glimpse(MisNodes)
#Observations: 77
#Variables: 3
#$ name <fctr> Myriel, Napoleon, Mlle.Baptistine, Mme.Magloire, CountessdeLo, Geborand, Champterci...
#$ group <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 4, ...
#$ size <int> 15, 20, 23, 30, 11, 9, 11, 30, 8, 29, 29, 9, 18, 12, 16, 22, 21, 11, 19, 10, 8, 13, ...
links
数据帧的 source
和 target
中的每个条目都是一个节点(整数 0,1,...,n)。在这种情况下,有 77 个唯一节点。因此,您需要一个 nodes
数据框,其中包含 77 个描述节点属性的节点。 nodes
数据帧中的第一个条目是节点 0
,下一个条目是节点 1
,依此类推。 nodes
数据框必须按照这个顺序排序。这是将 nodes
数据帧绑定到 links
数据帧的唯一方法。
# Create graph
forceNetwork(Links = MisLinks, Target = "target", Value = "value",
Nodes = MisNodes, Source = "source", NodeID = "name", Group = "group",
opacity = 0.4, zoom = TRUE)
函数 simpleNetwork()
和 forceNetwork()
的设计工作方式不同。
simpleNetwork()
将一个数据框作为其主要输入,默认情况下假定第一列是每个 link 的 'source',第二列是 'target' 每个 link。它不需要描述节点的数据框,因为它假定唯一的节点是 linked 到 link 数据框中的某些节点,并通过确定 link 中的唯一值在内部创建节点列表 links数据框。
forceNetwork()
更强大和灵活,但它需要你传递两个数据帧,一个用于links,一个用于节点。您将包含唯一节点列表的数据框传递给参数 Nodes
。参数 NodeID
和 Group
是字符值,用于定义节点数据框中包含该信息的列的名称,例如NodeID = 'name'
和 Group = 'type'
。节点数据框中的 Group
列用于定义节点的颜色,并不是必需的,但 forceNetwork()
需要它,因此您可以在节点数据框中创建一个列每行具有相同的值,例如1
.
您可以采用上面的代码,并构建必要的数据框以使用 forceNetwork()
像这样(例如)...
library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx",
"zXZK7fkzrpPpJdb", "ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:",
"visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)
nodeFactors <- factor(sort(unique(c(screenName, mention))))
nodes <- data.frame(name = nodeFactors, group = 1)
screenName <- match(screenName, levels(nodeFactors)) - 1
mention <- match(mention, levels(nodeFactors)) - 1
links <- data.frame(screenName, mention, n)
forceNetwork(Links = links, Nodes = nodes, Source = 'screenName',
Target = 'mention', Value = 'n', NodeID = 'name', Group = 'group')
我已经包含了一个数据框,它描述了我正在使用的数据的一个非常小的子集。由于数据中的节点数量众多,我的目标是构建一个交互式网络。
library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx", "zXZK7fkzrpPpJdb",
"ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:",
"visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)
data <- data.frame(screenName,mention,n)
simpleNetwork(data)
以上代码允许构建交互式无向网络图。我在 networkD3
R 库下遇到了 forceNetwork()
函数,这可能对这里有帮助。但我真的不知道如何将 data.frame 转换为它在此函数中的用法。提前谢谢您!
让我用文档中的例子来解释一下。
您需要两个数据框 - links
和 nodes
。
data(MisLinks)
glimpse(MisLinks)
#Observations: 254
#Variables: 3
#$ source <int> 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 11, 11, 11, 11, 12, 13, 14, 15, 17, 18, 18, 19, 19, 1...
#$ target <int> 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 10, 3, 2, 0, 11, 11, 11, 11, 16, 16, 17, 16, 17, 18, ...
#$ value <int> 1, 8, 10, 6, 1, 1, 1, 1, 2, 1, 1, 3, 3, 5, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4...
length(unique(c(MisLinks$source,MisLinks$target)))
#[1] 77
data(MisNodes)
glimpse(MisNodes)
#Observations: 77
#Variables: 3
#$ name <fctr> Myriel, Napoleon, Mlle.Baptistine, Mme.Magloire, CountessdeLo, Geborand, Champterci...
#$ group <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 4, ...
#$ size <int> 15, 20, 23, 30, 11, 9, 11, 30, 8, 29, 29, 9, 18, 12, 16, 22, 21, 11, 19, 10, 8, 13, ...
links
数据帧的 source
和 target
中的每个条目都是一个节点(整数 0,1,...,n)。在这种情况下,有 77 个唯一节点。因此,您需要一个 nodes
数据框,其中包含 77 个描述节点属性的节点。 nodes
数据帧中的第一个条目是节点 0
,下一个条目是节点 1
,依此类推。 nodes
数据框必须按照这个顺序排序。这是将 nodes
数据帧绑定到 links
数据帧的唯一方法。
# Create graph
forceNetwork(Links = MisLinks, Target = "target", Value = "value",
Nodes = MisNodes, Source = "source", NodeID = "name", Group = "group",
opacity = 0.4, zoom = TRUE)
函数 simpleNetwork()
和 forceNetwork()
的设计工作方式不同。
simpleNetwork()
将一个数据框作为其主要输入,默认情况下假定第一列是每个 link 的 'source',第二列是 'target' 每个 link。它不需要描述节点的数据框,因为它假定唯一的节点是 linked 到 link 数据框中的某些节点,并通过确定 link 中的唯一值在内部创建节点列表 links数据框。
forceNetwork()
更强大和灵活,但它需要你传递两个数据帧,一个用于links,一个用于节点。您将包含唯一节点列表的数据框传递给参数 Nodes
。参数 NodeID
和 Group
是字符值,用于定义节点数据框中包含该信息的列的名称,例如NodeID = 'name'
和 Group = 'type'
。节点数据框中的 Group
列用于定义节点的颜色,并不是必需的,但 forceNetwork()
需要它,因此您可以在节点数据框中创建一个列每行具有相同的值,例如1
.
您可以采用上面的代码,并构建必要的数据框以使用 forceNetwork()
像这样(例如)...
library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx",
"zXZK7fkzrpPpJdb", "ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:",
"visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)
nodeFactors <- factor(sort(unique(c(screenName, mention))))
nodes <- data.frame(name = nodeFactors, group = 1)
screenName <- match(screenName, levels(nodeFactors)) - 1
mention <- match(mention, levels(nodeFactors)) - 1
links <- data.frame(screenName, mention, n)
forceNetwork(Links = links, Nodes = nodes, Source = 'screenName',
Target = 'mention', Value = 'n', NodeID = 'name', Group = 'group')