2017-05-12 1 views
2

도움을 주셔서 감사합니다.networkd3 R의 forceNetwork가 edgelist에없는 모든 노드를 표시하는 이유는 무엇입니까?

Rnetworkd3 패키지를 사용하여 노드 목록과 링크 (edgelist)의 forceNetwork 플롯을 플롯합니다. 이것은 내가 링크 확률> 0.6 < 1. 전체 edgelist 되었습니다 만 해당 링크를 선택 훨씬 더 큰 edgelist의 샘플입니다

> edgelist 

     round_prob NODEAid NODEBid 
33979  0.6245 6990 6588 
4899  0.9797 1042 1041 
37109  0.6046 7498 7531 
27771  0.7144 5906 16029 
3603  0.6452  783  804 
28491  0.6078 6034 5862 
4518  0.6245  962 9874 
19613  0.6745 4121 10285 
19916  0.8721 4179 4180 
8249  0.6821 1737 1733 
35389  0.7150 7145 16992 
32010  0.6495 6728 16921 
22553  0.6959 4722 4549 
14996  0.6031 3273 12929 
35927  0.6245 7221 9814 
15349  0.6245 3337 3233 
34833  0.6109 7085 6852 
39044  0.6117 7936 7977 
39075  0.6844 7944 10978 
11691  0.6821 2572 2587 

:

나는 edgelist/링크 목록이 샘플을 가져 오기 전에 인덱스가 제로입니다.

또한 1875 개의 행이있는 노드리스트도 있습니다.

enter image description here

문제 :로 확대하기 전에,이이 음모를 제공

forceNetwork(Links = edgelist, Nodes = nodes, Source = "NODEAid", 
      Target = "NODEBid", Value = "round_prob", NodeID = "node", 
      Group = "gr", opacity = 0.9) 

:

> head(nodes) 

    node id gr 
0 1097 0 1 
1 1149 1 1 
2 1150 2 1 
3 3395 3 1 
4 3396 4 1 
5 3523 5 1 

내가 forceNetwork을 사용하여 플롯하려고 : 그것의 샘플이 있습니다 나는 단지 20 쌍의 노드가 있지만, 내 플롯에는 수천이 더 있습니다 (숫자를 반환 할 수 없음).

연결되지 않은 지점 위로 마우스를 가져 가면 해당 노드가 노드 목록에 가능한 모든 노드로 구성되었음을 확인할 수있었습니다.

기본적으로 나는 forceNetwork이 에지 링리스트에없는 모든 노드를 플로팅한다고 생각합니다.

왜 이런 일이 발생합니까? 어떻게 그렇게 할 수 있습니까?


이 질문에 Going crazy with forceNetwork in R: no edges displayed 당으로 내 모든 데이터가 숫자 형식 및 인덱스 제로 있다는 것을 확인했다. 나는 아직도이 오류가 발생합니다.

참고 :이 질문에서 How to plot a directed Graph in R with networkD3? 및이 자습서 https://christophergandrud.github.io/networkD3/에서 forceNetwork 예제를 실행하면 예상대로 출력됩니다.

답변

2

나도 자동으로 전달 또는 simpleNetwork 먼저 노드 목록을 만든 다음 forceNetwork에 그 전달과 마찬가지로 유사한 코드를 사용하는 에지리스트에 따라 노드 목록을 생성 simpleNetwork을 사용하는 것이 좋습니다 것입니다 ...

edgelist <- read.table(header = T, text = " 
round_prob NODEAid NODEBid 
33979  0.6245 6990 6588 
4899  0.9797 1042 1041 
37109  0.6046 7498 7531 
27771  0.7144 5906 16029 
3603  0.6452  783  804 
28491  0.6078 6034 5862 
4518  0.6245  962 9874 
19613  0.6745 4121 10285 
19916  0.8721 4179 4180 
8249  0.6821 1737 1733 
35389  0.7150 7145 16992 
32010  0.6495 6728 16921 
22553  0.6959 4722 4549 
14996  0.6031 3273 12929 
35927  0.6245 7221 9814 
15349  0.6245 3337 3233 
34833  0.6109 7085 6852 
39044  0.6117 7936 7977 
39075  0.6844 7944 10978 
11691  0.6821 2572 2587 
") 

library(networkD3) 

simpleNetwork(edgelist, Source = 'NODEAid', Target = 'NODEBid') 

sources <- edgelist$NODEAid 
targets <- edgelist$NODEBid 
node_names <- factor(sort(unique(c(as.character(sources), 
            as.character(targets))))) 
nodes <- data.frame(name = node_names, group = 1, size = 8) 
links <- data.frame(source = match(sources, node_names) - 1, 
       target = match(targets, node_names) - 1, 
       value = edgelist$round_prob) 

forceNetwork(Links = links, Nodes = nodes, Source = "source", 
      Target = "target", Value = "value", NodeID = "name", 
      Group = "group", opacity = 0.9) 
+1

그는 (simpleNetwork 이후) 필요한 코드를 수행합니다. 그리고 여러분이 통과 한 엣지리스트를 기반으로 노드 목록을 생성 한 다음 둘 모두를 'forceNetwork'에 전달하는 것이 해결책이라는 것은 맞습니다. 단지 하나의 웃음. 'simpleNetwork (edgelist) '에서 df가 예상 된 순서대로 있지 않기 때문에 그래프가 약간 잘못 표시 될 것으로 예상됩니다. – Mamonu

+1

위의 코드에서'simpleNetwork' 명령을 수정했습니다 ... 소스 및 대상에 대한 열 이름을 명시 적으로 설정할 수 있습니다. –

+0

@CJYetman 여러분의 도움으로 많은 도움을 주셨습니다. :) 그래서'nodes'의 인덱스 (처음 4 자리수의 노드 ID를 주문한 후 0으로 초기화 됨)가'source'와' 목표'ids. 따라서'target '의'source' 값은'nodes'의 리셋 ID와 일치해야합니다. * 원래 데이터의 샘플링에서 남은 원래의 4 자리 숫자는이 경우가 아닙니다. – Chuck

2

나는 가장자리 목록에있는 노드 만 포함하도록 노드 목록을 부분 집합해야한다고 생각합니다.

+0

안녕하세요. Christopher. 귀하의 회신에 진심으로 감사드립니다. 그래서 그것을 시도하고 그것은 작동하지 않았다. 그러나, 내가하지 않은 것은 edgelist의 nodelist에 대한 인덱스를 재설정 한 것입니다. (즉, 원래의 ID 인'1097 1149 ...'가있는 두 가지 하위 세트가 있습니다. 0 아마도. 나는 이것을 다시 구현하고 다시 너에게 간다. 다시 너에게 감사한다. – Chuck

+0

안녕하세요, 크리스토퍼. @CJYetman 덕분에 나는 이것을 작동시킬 수있었습니다. 나는 그가 대답하지 않았다면, 당신의 제안은 귀하의 응답과이 패키지를 작성해 주셔서 너무 감사드립니다.좋은 하루 되세요 :) – Chuck

관련 문제