我已经尝试使用R中的networkD3包绘制网络一周了。simpleNetwork
函数工作正常,但它不允许对图形的外观进行太多控制。forceNetwork
函数就是为了这个目的:显示具有丰富视觉特征的图形。
在这个问题中,我遇到的问题几乎是一样的。我仔细阅读了包文档,并尝试了上面线程中提出的解决方案,但没有成功:我得到的只是一个没有边缘连接它们的节点云。
这里是我的data.frame
s:
edg
Gene1 Gene2 Prob
1 22 3
2 22 6
3 22 6
4 22 9
5 22 3
6 22 4
7 22 8
8 22 4
9 22 6
10 22 8
11 22 6
12 22 10
13 22 6
14 22 3
15 22 6
16 22 6
17 22 0
18 22 4
19 22 6
20 22 4
垂直
Symbol Chr Expr
1 21 9
2 17 10
3 17 0
4 20 0
5 6 9
6 5 11
7 12 0
8 1 20
9 17 11
10 17 7
11 17 11
12 10 0
13 17 0
14 7 7
15 17 6
16 17 0
17 2 5
18 5 10
19 17 10
20 17 9
21 12 4
22 3 2
这导致了上面提到的没有边的节点云。如果我用放在节点上的实际标签更改"Symbol"列,也是一样的(根据包的要求,按照Links表的顺序(。
请注意,该包在本例中说明了该函数的使用,如果打开使用的数据集(MisLinks,MisNodes(,它们的内容与我的内容相同,除了节点的标签。运行同样的例子是有效的;使用我的数据运行不会。
这是我用来绘制网络的函数:
forceNetwork( Links = edg, Nodes = vert, Source = "Gene1", Target = "Gene2",
Value = "Prob", NodeID = "Symbol", Group = "Chr", opacity = 0.7,
colourScale = "d3.scale.category20b()", Nodesize = "Expr", zoom = T,
legend = T )
其他所有属性都正确显示(节点大小、图例、颜色(,但我一直看不到任何边。我的数据集中一定有一个错误,我无论如何都找不到。
我也遇到了同样的问题(simpleNetwork
工作正常,forceNetwork
首先只显示节点和边,然后根本不显示(。
问题(当你"重建从0开始编号的数据帧"时,你大概已经解决了这个问题(是你的原始链接数据edg从1开始,而不是从0开始?
networkD3文档,http://christophergandrud.github.io/networkD3/,有这样的注释:
注意:您可能已经习惯了R的1进制编号(即R中的计数从1开始(。然而,networkD3绘图是使用基于0的JavaScript创建的。因此,您的数据链接需要从0开始。
关于。不正确的数据类型,我最初也认为这可能是问题所在,我测试了将所有不同的列(除了NodeID的因子变量(转换为as.numeric
和as.integer
——然而,现在已经将我的数据更正为基于0而不是基于1,我的forceNetwork
显示对任何一种数据类型都能正常工作。
希望这能有所帮助!
我刚刚在自己的forceNetwork中解决了同样的问题。事实证明,我创建的边的数据帧(从iGraph导出(具有character
类型,而不是int
类型。使用as.numeric()
铸造边缘"from"one_answers"to"列解决了问题,并且正确绘制了链接。
我希望这能有所帮助。
关于
是否
从技术上讲,即使您解决了其他可能的问题(如edg$Gene1
和edg$Gene2
是非数字的(,您的示例数据也无法工作的原因是,您在edg
数据中引用了节点22
,该节点在"基于0的索引"术语中指向vert
数据帧的第23行,但该节点并不存在。
正如已经指出的,这可能是因为它是基于1的索引,应该进行转换,而可以很容易地完成转换
edg$Gene1 <- edg$Gene1 - 1
edg$Gene2 <- edg$Gene2 - 1
或者,人们可能打算指代另一个节点,该节点由于任何原因没有进入vert
数据帧,在这种情况下,该节点将需要添加到vert
数据帧,这可以很容易地通过(例如(…来完成。。。
vert <- rbind(vert, c(23,1,1))
您可以测试是否在edj
数据中引用了vert
数据中不存在的节点,比如。。。
all(unique(c(edg$Gene1, edg$Gene2)) %in% (1:nrow(vert) - 1))
# [1] FALSE
其应当返回CCD_ 21。如果没有,就说明出了问题。
您可以通过…确定edg
数据中引用的节点在vert
数据中不存在。。。
unique(c(edg$Gene1, edg$Gene2))[which(!unique(c(edg$Gene1, edg$Gene2)) %in% (1:nrow(vert) - 1))]
# [1] 22
将edg
中的索引调整为"基于0"的完全可复制示例
edg <- read.csv(header = TRUE, colClasses = 'character', text = '
Gene1,Gene2,Prob
1,22,3
2,22,6
3,22,6
4,22,9
5,22,3
6,22,4
7,22,8
8,22,4
9,22,6
10,22,8
11,22,6
12,22,10
13,22,6
14,22,3
15,22,6
16,22,6
17,22,0
18,22,4
19,22,6
20,22,4
')
vert <- read.csv(header = TRUE, colClasses = 'character', text = '
Symbol,Chr,Expr
1,21,9
2,17,10
3,17,0
4,20,0
5,6,9
6,5,11
7,12,0
8,1,20
9,17,11
10,17,7
11,17,11
12,10,0
13,17,0
14,7,7
15,17,6
16,17,0
17,2,5
18,5,10
19,17,10
20,17,9
21,12,4
22,3,2
')
# cast to numeric just to be sure
edg$Gene1 <- as.numeric(edg$Gene1)
edg$Gene2 <- as.numeric(edg$Gene2)
# adjust the indices so they're "0-based"
edg$Gene1 <- edg$Gene1 - 1
edg$Gene2 <- edg$Gene2 - 1
# Nodesize is also necessarily numeric
vert$Expr <- as.numeric(vert$Expr)
library(networkD3)
forceNetwork(Links = edg, Nodes = vert, Source = "Gene1", Target = "Gene2",
Value = "Prob", NodeID = "Symbol", Group = "Chr", opacity = 0.7,
Nodesize = "Expr", zoom = TRUE, legend = TRUE)
向vert
添加节点的完全可再现示例
edg <- read.csv(header = TRUE, colClasses = 'character', text = '
Gene1,Gene2,Prob
1,22,3
2,22,6
3,22,6
4,22,9
5,22,3
6,22,4
7,22,8
8,22,4
9,22,6
10,22,8
11,22,6
12,22,10
13,22,6
14,22,3
15,22,6
16,22,6
17,22,0
18,22,4
19,22,6
20,22,4
')
vert <- read.csv(header = TRUE, colClasses = 'character', text = '
Symbol,Chr,Expr
1,21,9
2,17,10
3,17,0
4,20,0
5,6,9
6,5,11
7,12,0
8,1,20
9,17,11
10,17,7
11,17,11
12,10,0
13,17,0
14,7,7
15,17,6
16,17,0
17,2,5
18,5,10
19,17,10
20,17,9
21,12,4
22,3,2
')
# cast to numeric just to be sure
edg$Gene1 <- as.numeric(edg$Gene1)
edg$Gene2 <- as.numeric(edg$Gene2)
vert$Expr <- as.numeric(vert$Expr)
# add another node to the Nodes data frame
vert <- rbind(vert, c(23,1,1))
library(networkD3)
forceNetwork(Links = edg, Nodes = vert, Source = "Gene1", Target = "Gene2",
Value = "Prob", NodeID = "Symbol", Group = "Chr", opacity = 0.7,
Nodesize = "Expr", zoom = TRUE, legend = TRUE)
我遇到了同样的问题,但在转换为数字之前,通过将源和目标的因子级别设置为与节点名称一致来解决它:
edg$Gene1<-factor(edg$Gene1,levels=vert$Symbol)
edg$Gene2<-factor(edg$Gene2,levels=vert$Symbol)
edg$source<-as.numeric(edg$Gene1)-1
edg$target<-as.numeric(edg$Gene2)-1
以便源向量和目标向量具有作为节点名称的一致因子级别(vert$Symbol
(,然后
forceNetwork( Links = edg, Nodes = vert, Source = "source", Target = "target",
Value = "Prob", NodeID = "Symbol", Group = "Chr", opacity = 0.7,
colourScale = "d3.scale.category20b()", Nodesize = "Expr", zoom = T,
legend = T )
对我有用。
希望这会有所帮助。