R中的forceNetwork疯狂:没有显示边



我已经尝试使用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.numericas.integer——然而,现在已经将我的数据更正为基于0而不是基于1,我的forceNetwork显示对任何一种数据类型都能正常工作。

希望这能有所帮助!

我刚刚在自己的forceNetwork中解决了同样的问题。事实证明,我创建的边的数据帧(从iGraph导出(具有character类型,而不是int类型。使用as.numeric()铸造边缘"from"one_answers"to"列解决了问题,并且正确绘制了链接。

我希望这能有所帮助。

关于

是否

从技术上讲,即使您解决了其他可能的问题(如edg$Gene1edg$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 )

对我有用。

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新