Katya Ognyanova 박사는 친절하게 네트워크 데이터에 대한 좋은 교육 내용과 함께 데이터도 인터넷에 공유해 주었다.
tidyverse
팩키지 read_csv()
함수를 통해 결점과 연결선 데이터를 불러오고 나서 이를 igraph
팩키지 graph_from_data_frame()
함수로 igraph
그래프 객체로 변환시킨다. 그리고 나서 plot
함수로 데이터가 정상적으로 들어왔는지 시각적으로 확인을 한다.
# 0. 환경설정 --------------
library(tidyverse)
library(igraph)
library(threejs) # devtools::install_github("bwlewis/rthreejs")
library(htmlwidgets)
library(crosstalk)
library(DT)
# 1. 데이터 가져오기 --------------
## 1.1. 데이터 읽어들이기
media_vert <- read_csv("data/Dataset1-Media-Example-NODES.csv")
media_edge <- read_csv("data/Dataset1-Media-Example-EDGES.csv")
## 1.2. 네트워크 데이터 변환
media_ng <- graph_from_data_frame(d = media_edge, vertices = media_vert, directed = FALSE)
plot(media_ng)
네트워크 데이터 시각화는 결국 결점(Vertex, Node)과 연결선(Edge)을 통해 다양한 시각적인 효과를 구현할 수 있다. 다만, 인터랙티브 네트워크 시각화는 다양한 자바스크립트 기반 팩키지와 함께 종류가 많다. 인터랙티브 네트워크 시각화에 사용되는 팩키지는 다음이 있다.
threejs
visNetwork
networkD3
ndtv-d3
igraph2graphjs
를 활용하여 igraph
객체를 threejs
객체로 바꿔 작업하는 것도 가능하지만, 윈도우에서는 여러가지 제약이 있다.
# 2. 네트워크 데이터 전처리 --------------
## 2.1. 네트워크 간략화
media_sng <- simplify(media_ng, remove.multiple = TRUE, remove.loops = FALSE,
edge.attr.comb=c(weight="sum", type="ignore"))
# media_sng_js <- igraph::igraph2graphjs(media_sng)
인터랙티브 네트워크 시각화를 위해서 set_vertex_attr
에 shape
를 지정하면 라벨을 직접 결점에 붙일 수 있을 뿐만아니라 결점 속성 크기도 라벨에 반영이 가능하다.
# 3. 인터랙티브 네트워크 간략화 --------------
## 3.1. 라벨 -----
media_sng <- set_vertex_attr(media_sng, "color", value = "dodgerblue")
media_sng <- set_vertex_attr(media_sng, "size", value = V(media_sng)$audience.size / 10)
media_sng <- set_vertex_attr(media_sng, "shape", value = V(media_sng)$media)
media_sng <- set_edge_attr(media_sng, "color", value = "lightblue")
graphjs(media_sng,
brush = TRUE,
main = "인터랙티브 네트워크")
인터랙티브 네트워크 시각화를 위해서 set_vertex_attr
에 size
를 지정하면 결점 크기도 변경할 수 있고, 연결선 색상도 변경이 가능하다. 다만, threejs
는 네트워크 데이터 시각화 속도에 방점을 찍어 개발되었기 때문에 연결선 선폭은 속성에 따라 선폭조정은 아직 지원하고 있지 않다.
## 3.2. 결점 크기 -----
media_sng <- set_vertex_attr(media_sng, "color", value = "dodgerblue")
media_sng <- set_vertex_attr(media_sng, "size", value = V(media_sng)$audience.size / 3)
media_sng <- set_edge_attr(media_sng, "color", value = "lightblue")
graphjs(media_sng,
vertex.label = V(media_sng)$media,
brush = TRUE,
main = "")
RStudio Crosstalk를 graphjs
와 함께 연결하여 사용하는 것이 가능하다.
# 4. Crosstalk 네트워크 --------------
sd <- SharedData$new(media_vert)
print(bscols(
graphjs(media_sng,
vertex.label = V(media_sng)$media,
brush=TRUE,
crosstalk=sd,
main = ""),
DT::datatable(sd, rownames=FALSE, options=list(dom='tp'))
))