R中的forceNetwork正在疯狂:未显示边

R中的forceNetwork正在疯狂:未显示边,r,plot,htmlwidgets,networkd3,R,Plot,Htmlwidgets,Networkd3,一个星期以来,我一直在尝试使用R中的networkD3包绘制一个网络。simpleNetwork函数正常工作,但它不允许对图形的外观进行太多控制。forceNetwork功能用于显示具有丰富视觉功能的图形 我所面临的问题与所讨论的几乎相同。我已经仔细阅读了包文档,并尝试了上面线程中提出的解决方案,但没有成功:我得到的只是一个没有边缘链接的节点云 这里是我的data.frames: edg 垂直 这会导致上面提到的没有边的节点云。如果我用实际的标签更改“Symbol”列,我会在节点上添加相同的标签

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

我所面临的问题与所讨论的几乎相同。我已经仔细阅读了包文档,并尝试了上面线程中提出的解决方案,但没有成功:我得到的只是一个没有边缘链接的节点云

这里是我的
data.frame
s:

edg

垂直

这会导致上面提到的没有边的节点云。如果我用实际的标签更改“Symbol”列,我会在节点上添加相同的标签(按照包的要求,遵循Links表的顺序)

请注意,该软件包举例说明了此函数的使用,如果打开使用的数据集(错误链接、错误节点),其内容与我的内容相同,只是节点的标签不同。运行完全相同的示例是可行的;使用我的数据运行不需要

以下是我用来绘制网络的函数:

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中修复了相同的问题。事实证明,我创建的(从iGraph导出的)边的数据帧具有
character
类型,而不是
int
类型。使用
as.numeric()
强制转换边“from”和“to”列解决了问题,链接绘制正确

我希望这有帮助

关于,


Will

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

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

networkD3文档中有以下注释:

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

Re。不正确的数据类型,我最初也认为这可能是问题所在,我测试了将所有不同的列(NodeID的factor变量除外)强制转换为.numericvs
as.integer
——但是现在已将我的数据更正为基于0而不是基于1,my
forceNetwork
显示器可正常显示任一数据类型


希望这有帮助

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

正如已经指出的,这可能是因为它在基于1的索引中,应该进行转换,这可以很容易地用

edg$Gene1 <- edg$Gene1 - 1
edg$Gene2 <- edg$Gene2 - 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我遇到了同样的问题,但在转换为数字之前,通过将源和目标的因子级别设置为与节点名称一致,解决了这个问题:

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
对我有用


希望这会有所帮助。

试试
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,colorscale=“d3.scale.category20b(),Nodesize=“Expr”,zoom=T,legend=T)
,这使得顶点ID以0而不是1开头。不!不会更改,不会显示边。我重建了数据帧,命名为NodeIds 0:21,并相应地重建了边。没有什么变化。还尝试在“符号”列中使用标签而不是数字:仍然只显示节点。最终尝试将列名更改为包示例中使用的列名(我知道这很愚蠢):仍然只有nodes.square。上面的代码可以生成。我使用networkD3 v0.1.7.mmm。奇怪的最终通过上述测试集得到了与您相同的结果。然后,我将相同的技术(实际上是从0开始重建数据帧)应用到一个更具体的测试用例中,该测试用例有160个节点和170个边。新的数据集实际上是包含多个列的完整表,我只指定了源、目标和节点ID(这次是完整标签)。早期的尝试导致了一个空白的查看器面板。然后我就能得到我所期望的情节。没有任何改变。这个函数的背后是什么?非常感谢@Lukeam可能是个虫子?不能说,因为我不能重现你的错误。
all(unique(c(edg$Gene1, edg$Gene2)) %in% (1:nrow(vert) - 1))
# [1] FALSE
unique(c(edg$Gene1, edg$Gene2))[which(!unique(c(edg$Gene1, edg$Gene2)) %in% (1:nrow(vert) - 1))]
# [1] 22
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
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 )