【问题标题】:Going crazy with forceNetwork in R: no edges displayed用 R 中的 forceNetwork 发疯:没有显示边缘
【发布时间】:2015-07-02 21:23:40
【问题描述】:

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

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

这里是我的data.frames:

边缘

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

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

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

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

【问题讨论】:

  • 试试forceNetwork( Links = transform(edg, Gene1 = Gene1-1, Gene2 = Gene2 - 1), Nodes = transform(vert, Symbol = Symbol -1), Source = "Gene1", Target = "Gene2", Value = "Prob", NodeID = "Symbol", Group = "Chr", opacity = 0.7, colourScale = "d3.scale.category20b()", Nodesize = "Expr", zoom = T, legend = T ),它使顶点ID以0而不是1开头。
  • 不!没有任何变化,边缘不显示。我重建了数据帧,命名为 NodeIds 0:21 和相应的边缘。没有什么变化。还尝试在“符号”列中使用标签而不是数字:仍然只显示节点。最终尝试将列名更改为包示例中使用的列名(我知道这很傻):仍然只有节点。
  • 奇怪。上面的代码产生imgur.com/73b0eiJ。我使用 networkD3 v0.1.7。
  • 嗯。奇怪的!最终得到与上述测试集相同的结果。然后我将相同的技术(实际上重建的数据帧从 0 开始编号)应用于更具体的测试用例,具有 160 个节点和 170 个边。新的数据集实际上是包含多列的完整表,我只是指定了源、目标和 NodeId(这次是完整标签)。早期的尝试导致了一个空白的查看器面板。然后我可以得到我期望的情节。没有改变任何东西。这个功能的背后是什么?非常感谢@lukeA
  • 可能是一个错误?不能说,因为我无法重现您的错误。

标签: r plot htmlwidgets networkd3


【解决方案1】:

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

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

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

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

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    我希望这会有所帮助。

    关于,

    【讨论】:

      【解决方案3】:

      从技术上讲,即使您解决了其他可能的问题(例如 edg$Gene1edg$Gene2 是非数字的),您的示例数据也不起作用的原因是您在 @ 中引用了节点 22 987654324@ 数据,在“基于 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
      

      应该返回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)

      【讨论】:

        【解决方案4】:

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

        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 )
        

        为我工作。

        希望这有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-07
          相关资源
          最近更新 更多