[R 패키지] 3D 네트워크 시각화 - network3d
시작하기
R에는 ggraph
, igraph
와 같은 우수한 네트워크 시각화 라이브러리가 많이 있습니다. 이 라이브러리의 주요 문제점은 2 차원 시각화 (또는 igraph의 경우 정적 3D)로 제한된다는 것입니다. 경험상 수많은 네트워크 데이터에서 3 차원을 추가하면 훨씬 더 명확한 패턴이 나타납니다.
network3d
는htmlwidgets
패키지를 사용하여 만든 작은 R 패키지로, 네트워크 데이터를 노드와 에지 데이터 프레임 형태로 받아 물리 시뮬레이션을 수행하여 3 차원에서 최적의 레이아웃을 결정합니다.
설치방법
network3d 패키지는 아직 Cran에 등록되어 있지 않으므로, devtools 패키지를 사용하여 아래와 같이 설치해야합니다.
## Downloading GitHub repo nstrayer/network3d@master
## from URL https://api.github.com/repos/nstrayer/network3d/zipball/master
## Installing network3d
## '/Library/Frameworks/R.framework/Resources/bin/R' --no-site-file \
## --no-environ --no-save --no-restore --quiet CMD INSTALL \
## '/private/var/folders/bx/qhpyc2sn77l6vsnzj88qnmmm0000gn/T/Rtmp0PJbyb/devtools110cd59ba0c64/nstrayer-network3d-23b865f' \
## --library='/Library/Frameworks/R.framework/Versions/3.4/Resources/library' \
## --install-tests
##
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
예제를 위해 패키지안에 포함된 데이터세트를 로드 할 수 있습니다. 이 데이터셋은 일반 상대성 이론과 양자 우주론에서 연구자 들간의 협력 네트워크 데이터입니다.
data <- collaboration_networks # comes from the package
data$vertices %>% head() %>% knitr::kable()
id | name |
---|---|
3466 | 1 |
10310 | 2 |
5052 | 3 |
5346 | 4 |
15159 | 5 |
19640 | 6 |
data$edges %>% head() %>% knitr::kable()
source | target |
---|---|
3466 | 5233 |
3466 | 8579 |
3466 | 10310 |
3466 | 17038 |
10310 | 3466 |
10310 | 4583 |
이제 데이터를 전달해서 네트워크 3D 플롯을 그려봅시다.
network3d(data$vertices, data$edges)
이렇게 손쉽게 3D 네트워크 플롯을 구현할 수 있습니다. 이 플롯에 색상을 추가하려면 정점 데이터 프레임에 색상 열을 추가하면됩니다.
data$vertices <- data$vertices %>%
mutate(
color = 'steelblue',
name = paste('node', name)
)
network3d(data$vertices, data$edges)
노드의 크기를 더 작게 설정하고 가장자리 모호성을 증가시켜 연결을보다 명확하게 하기위해 시뮬레이션 매개 변수를 약간 조정합니다.다른 매개 변수를 드래그하여 값을 변경할 수 있습니다. Max iterations
는 기본값인 75에서 시작합니다. manybody_strength
를 기본값 -1 대신 0.5로 선택해보면 모서리에 의해 가해지는 힘에 더하여 반발하지 않고 서로 끌어 당기게 됩니다.
network3d(
data$vertices, data$edges,
node_size = 0.05,
edge_opacity = 0.25,
force_explorer = TRUE)
마지막으로 백그라운드 색상을 검은색으로 변경하고 노드색상을 Rcolorbrrewer
및 노드 크기에서 임의로 선택하여 0.01에서 0.1 사이의 무작위 균일한 드로잉으로 변경해봅시다.
data$vertices <- data$vertices %>%
mutate(
color = RColorBrewer::brewer.pal(12, name = 'Paired') %>% sample(size = n(), replace = TRUE),
size = runif(n(), min = 0.01, max = 0.1)
)
network3d(data$vertices, data$edges,
max_iterations = 100,
manybody_strength = 0.5,
background_color = 'black',
edge_opacity = 0.15)
이 패키지는 기본적으로 컴퓨터의 GPU에서 렌더링되기 때문에 GPU가 내장된 통합 그래픽 환경에서는 매끄럽게 돌아가지만, 낮은 사양의 환경에서는 약간 버벅거릴 수 있습니다.
성능을 향상시키는 한 가지 방법은 대화형 기능입니다. interactive = TRUE (기본값) 옵션을 설정하면 네트워크는 정점 데이터 프레임의 이름 열에 마우스 오버 한 모든 노드를 표시합니다. 이것이 계산되는 방식은 장면의 카메라에서 빔이 투영되고 그래프의 모든 단일 노드가 교차되어 가장 가까운 노드가 선택되면 노드와 교차하는지 확인하는 것입니다. 이것은 분명히 대형 네트워크에서 매우 느린 프로세스가 될 것입니다. 이를 더 빠르게 만드는 한 가지 방법은 octtree와 같은 공간 인식 데이터 구조를 사용하여 검색된 노드를 제한하는 것입니다. 또는 상호 작용이 필요하지 않을 때 더 빠른 성능을 얻으려면 interactive = FALSE를 설정하십시오. 여기서의 역설은 네트워크가 커질수록 상호 작용이 더 필요하다는 것입니다.
Shiny Hooks
현재 이 패키지는 Shiny 와 궁합이 잘 맞습니다.새로운 데이터로 네트워크를 자동으로 다시 그릴 수 있지만, 어느 노드가 선택되었는지에 대한 Shiny 통신을 허용하는 것이 좋을 것입니다. 이것은 너무 어렵지는 않지만 좋은 크로스 토크 형식을 따르기를 원합니다. 라이브러리는 데이터를 처리합니다.
사용해 보시면서 버그를 발견하거나 궁금한 사항이 있으시면 아래 Github 페이지에서 이용하시기 바랍니다.
출처: network3d - a 3D network visualization and layout library