Program Tip

R에서 대규모 네트워크를 시각화하는 방법은 무엇입니까?

programtip 2020. 12. 27. 19:59
반응형

R에서 대규모 네트워크를 시각화하는 방법은 무엇입니까?


네트워크 시각화는 실제로 과학에서 보편화되었습니다. 그러나 네트워크의 규모가 커짐에 따라 일반적인 시각화의 유용성이 떨어집니다. 노드 / 정점 및 링크 / 가장자리가 너무 많습니다. 종종 시각화 노력은 결국 "헤어볼"을 생성합니다.

이 문제를 극복하기 위해 몇 가지 새로운 접근법이 제안되었습니다.

더 많은 접근 방식이 있다고 확신합니다. 따라서 내 질문은 다음과 같습니다. 머리카락 문제를 극복하는 방법, 즉 R을 사용하여 대규모 네트워크를 시각화하는 방법은 무엇입니까?

다음은 예시 네트워크를 시뮬레이션하는 코드입니다.

# Load packages
lapply(c("devtools", "sna", "intergraph", "igraph", "network"), install.packages)
library(devtools)
devtools::install_github(repo="ggally", username="ggobi")
lapply(c("sna", "intergraph", "GGally", "igraph", "network"), 
       require, character.only=T)

# Set up data
set.seed(123)
g <- barabasi.game(1000)

# Plot data
g.plot <- ggnet(g, mode = "fruchtermanreingold")
g.plot

여기에 이미지 설명 입력

이 질문은 GraphViz에 비해 너무 큰 무 방향 그래프 시각화 와 관련이 있습니까? . 그러나 여기에서는 일반적인 소프트웨어 권장 사항이 아니라 위에 제공된 데이터를 사용하여 R을 사용하여 대규모 네트워크를 잘 시각화하는 데 도움이되는 구체적인 예제 ( 이 스레드의 예제와 비교 ​​: R : Scatterplot with 너무 많은 포인트 ).


매우 큰 네트워크를 시각화하는 또 다른 방법 은 노드를 표시하기 위해 점 대신 수평선 을 사용하는 BioFabric (www.BioFabric.org)을 사용하는 것입니다. 그런 다음 수직선 세그먼트를 사용하여 가장자리가 표시됩니다. 이 기술의 빠른 D3 데모는 http://www.biofabric.org/gallery/pages/SuperQuickBioFabric.html 에서 볼 수 있습니다.

BioFabric은 Java 애플리케이션이지만 간단한 R 버전은 https://github.com/wjrl/RBioFabric 에서 구할 수 있습니다 .

다음은 R 코드의 일부입니다.

 # You need 'devtools':
 install.packages("devtools")
 library(devtools)

 # you need igraph:
 install.packages("igraph")
 library(igraph)

 # install and load 'RBioFabric' from GitHub
 install_github('RBioFabric',  username='wjrl')
 library(RBioFabric)

 #
 # This is the example provided in the question:
 #

 set.seed(123)
 bfGraph = barabasi.game(1000)

 # This example has 1000 nodes, just like the provided example, but it 
 # adds 6 edges in each step, making for an interesting shape; play
 # around with different values.

 # bfGraph = barabasi.game(1000, m=6, directed=FALSE)

 # Plot it up! For best results, make the PDF in the same
 # aspect ratio as the network, though a little extra height
 # covers the top labels. Given the size of the network,
 # a PDF width of 100 gives us good resolution.

 height <- vcount(bfGraph)
 width <- ecount(bfGraph)
 aspect <- height / width;
 plotWidth <- 100.0
 plotHeight <- plotWidth * (aspect * 1.2)
 pdf("myBioFabricOutput.pdf", width=plotWidth, height=plotHeight)
 bioFabric(bfGraph)
 dev.off()

다음은 질문자가 제공 한 데이터의 BioFabric 버전의 샷이지만 m> 1 값으로 생성 된 네트워크가 더 흥미 롭습니다. 삽입 된 세부 정보는 네트워크의 왼쪽 상단 모서리의 클로즈업을 보여줍니다. 노드 BF4는 네트워크에서 가장 높은 수준의 노드이며 기본 레이아웃은 해당 노드에서 시작하는 네트워크의 너비 우선 검색 (가장자리 방향 무시)이며 인접 노드는 노드 수준이 감소하는 순서로 순회됩니다. 예를 들어 노드 BF4의 이웃의 약 60 %가 1 차라는 것을 즉시 확인할 수 있습니다. 또한 엄격한 45도 하단 에지에서이 1000 개 노드 네트워크에 999 개의 에지가 있으므로 트리임을 알 수 있습니다.

예제 데이터의 BioFabric 프레젠테이션

전체 공개 : BioFabric은 제가 작성한 도구입니다.


흥미로운 질문입니다. 나열하신 도구를 대부분 몰랐습니다. 감사합니다. 목록 HivePlot추가 할 수 있습니다 . 고정 된 수의 축 (일반적으로 2 개 또는 3 개)에 노드를 투영하는 것으로 구성된 결정 론적 방법입니다. 링크 된 페이지를보세요, 많은 시각적 예가 있습니다.

여기에 이미지 설명 입력

데이터 세트에 범주 형 노드 속성이있는 경우 더 잘 작동하므로 노드가 이동할 축을 선택하는 데 사용할 수 있습니다. 예를 들어, 대학의 소셜 네트워크를 연구 할 때 : 한 축은 학생, 다른 축은 교사, 세 번째는 행정 직원입니다. 그러나 물론 이산 된 숫자 속성 (예 : 각각의 축에있는 젊은이, 중년 및 노인)으로도 작동 할 수 있습니다.

그런 다음 다른 속성이 필요하며 이번에는 숫자 (또는 적어도 서수) 여야합니다. 축에서 노드의 위치를 ​​결정하는 데 사용됩니다. 차수 또는 전이성 (클러스터링 계수)과 같은 일부 토폴로지 측정 값을 사용할 수도 있습니다.

하이브 플롯을 만드는 방법
(출처 : hiveplot.net )

이 방법이 결정 론적이라는 사실은 흥미 롭습니다. 왜냐하면 별개의 (그러나 비교 가능한) 시스템을 나타내는 다른 네트워크를 비교할 수 있기 때문입니다. 예를 들어, 두 대학을 비교할 수 있습니다 (동일한 속성 / 측정 값을 사용하여 축과 위치를 결정하는 경우). 또한 다양한 속성 / 측정 조합을 선택하여 시각화를 생성함으로써 동일한 네트워크를 다양한 방식으로 설명 할 수 있습니다. 이것은 실제로 소위 하이브 패널 덕분에 네트워크를 시각화하는 데 권장되는 방법입니다.

이러한 하이브 플롯을 생성 할 수있는 여러 소프트웨어가이 게시물의 시작 부분에서 언급 한 페이지에 나열되어 있습니다. 여기에는 Java 및 R의 구현도 포함됩니다.


최근에이 문제를 다루고 있습니다. 그 결과 다른 해결책을 찾았습니다. 커뮤니티 / 클러스터별로 그래프를 축소합니다. 이 접근 방식은 위의 OP에서 설명한 세 번째 옵션과 유사합니다. 경고의 한마디로,이 접근 방식은 무 방향 그래프에서 가장 잘 작동합니다. 예를 들면 :

library(igraph)

set.seed(123)
g <- barabasi.game(1000) %>%
  as.undirected()

#Choose your favorite algorithm to find communities.  The algorithm below is great for large networks but only works with undirected graphs
c_g <- fastgreedy.community(g)

#Collapse the graph by communities.  This insight is due to this post http://stackoverflow.com/questions/35000554/collapsing-graph-by-clusters-in-igraph/35000823#35000823

res_g <- simplify(contract(g, membership(c_g))) 

이 프로세스의 결과는 아래 그림과 같습니다. 여기서 정점의 이름은 커뮤니티 멤버십을 나타냅니다.

plot(g, margin = -.5)

여기에 이미지 설명 입력

위는이 끔찍한 엉망보다 분명히 더 멋지다

plot(r_g, margin = -.5)

여기에 이미지 설명 입력

커뮤니티를 원래 정점에 연결하려면 다음과 유사한 것이 필요합니다.

mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g)))

IMO 이것은 두 가지 이유로 좋은 접근 방식입니다. 첫째, 이론적으로 모든 크기 그래프를 다룰 수 있습니다. 커뮤니티를 찾는 과정은 접힌 그래프에서 계속 반복 될 수 있습니다. 둘째, 대화 형 접근 방식을 채택하면 매우 읽기 쉬운 결과를 얻을 수 있습니다. 예를 들어 사용자가 축소 된 그래프의 정점을 클릭하여 커뮤니티를 확장하여 원래 정점을 모두 표시 할 수 있다고 상상할 수 있습니다.


또 다른 흥미로운 패키지는 networkD3 입니다. 이 라이브러리에는 그래프를 표현하는 무수한 방법이 있습니다. 특히 forceNetwork흥미로운 옵션이 있습니다. 대화 형이므로 실제로 네트워크를 탐색 할 수 있습니다. EDA에는 좋지만 최종 작업에는 너무 "흔들기"일 수 있습니다.


나는 주위를 둘러 보았고 좋은 해결책을 찾지 못했습니다. 내 접근 방식은 노드를 제거하고 가장자리 투명성을 가지고 노는 것입니다. 기술적 인 솔루션 이라기보다는 디자인 솔루션에 가깝지만 랩톱에서 많은 복잡함없이 최대 50,000 에지의 gephi와 같은 네트워크를 그릴 수있었습니다.

귀하의 예와 함께 :

plot(simplify(g), vertex.size= 0.01,edge.arrow.size=0.001,vertex.label.cex = 0.75,vertex.label.color = "black"  ,vertex.frame.color = adjustcolor("white", alpha.f = 0),vertex.color = adjustcolor("white", alpha.f = 0),edge.color=adjustcolor(1, alpha.f = 0.15),display.isolates=FALSE,vertex.label=ifelse(page_rank(g)$vector > 0.1 , "important nodes", NA))

여기에 이미지 설명 입력

트위터의 예는 30,000 개의 에지가있는 네트워크를 언급합니다.

여기에 이미지 설명 입력

참조 URL : https://stackoverflow.com/questions/22453273/how-to-visualize-a-large-network-in-r

반응형