3

一周以来,我一直在尝试使用R 中的networkD3包绘制网络。simpleNetwork函数正常工作,但它不允许对图形的外观进行太多控制。该forceNetwork功能就是为此目的:显示具有丰富视觉特征的图形。

我遇到的问题在这个问题中几乎相同。我已经仔细阅读了包文档,并尝试了上述线程中提出的解决方案,但没有运气:我得到的只是一堆节点,没有连接它们的边缘。

这是我data.frame的:

边缘

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

好吧,这导致上面提到的没有边缘的节点云。如果我用我放在节点上的实际标签更改“符号”列(按照包的要求,尊重链接表的顺序),同样的事情。

请注意,该包通过示例说明了此功能的使用,如果您打开使用的数据集(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 )

其他所有属性都正确显示(节点大小、图例、颜色),但我一直看不到边缘。我的数据集中某处一定有错误,我无论如何都找不到。

4

4 回答 4

5

我遇到了同样的问题(simpleNetwork正常工作,forceNetwork首先只显示节点而没有边缘,然后根本没有显示)。

问题(当您“重建从 0 开始编号的数据帧”时可能已解决)是您的原始链接数据 edg 从 1 而不是 0 开始?

networkD3 文档http://christophergandrud.github.io/networkD3/有这样的注释:

注意:你可能已经习惯了 R 的从 1 开始的编号(即在 R 中从 1 开始计数)。然而,networkD3 图是使用 JavaScript 创建的,它是从 0 开始的。因此,您的数据链接需要从 0 开始。

回覆。我最初也认为可能是问题的不正确数据类型,我测试了所有不同的列(NodeID 的因子变量除外)as.numericas.integer- 但是现在将我的数据更正为基于 0 而不是基于 1,我的forceNetwork显示可以正常使用任何一种数据类型。

希望这可以帮助!

于 2016-02-28T15:59:30.523 回答
2

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

我希望这有帮助。

带着敬意,

将要

于 2016-01-11T15:09:54.950 回答
0

我遇到了同样的问题,但通过在转换为数字之前将源和目标的因子级别设置为与节点名称一致来修复它:

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 )

为我工作。

希望这会有所帮助。

于 2018-11-21T16:19:55.927 回答
0

从技术上讲,即使您解决了其他可能的问题(例如edg$Gene1edg$Gene2非数字),您的示例数据也不起作用的原因是因为您引用了数据中的一个节点22edg在“基于 0 的索引”术语中指向数据框的第 23 行,vert不存在。

正如已经指出的那样,这可能是因为它是基于 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

应该返回TRUE。如果没有,那就有问题了。

您可以确定在您的数据中引用了哪些节点,而这些节点在您的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)

于 2018-09-23T11:07:31.950 回答