R을 통해 역사적 인물들의 관계를 분석하는 네트워크를 생성하는 것을 목적으로 진행하게된 이번 워크샾에서는 R에서 제공하는 visNetwork패키지(https://datastorm-open.github.io/visNetwork/)를 사용하여 네트워크 시각화에서 각 요소의 특징을 바꾸는 것으로 시작하여 실제 역사 데이터를 활용하여 네트워크를 생성하는 전반적인 과정을 다루고자 한다.

1.패키지 설치하기

# install.packages("visNetwork")
library(visNetwork, quietly = TRUE)

네트워크 시각화를 생성하기 위해 우선 visNetwork패키지를 설치하고 불러온다.

2.기본적인 네트워크 생성하기

nodes <- data.frame(id = 1:8)
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8))
visNetwork(nodes, edges, width = "100%")

노드는 각각의 원을 의미하며, 엣지는 원들사이에 연결된 선을 의미한다. 노드에서는 각원들의 정보를 정의하고 엣지는 원들간의 관계를 선으로 연결한다. 그리고 visNetwork를 통해 네트워크를 생성한다. 코드를 실행하면 8개의 원들과 원들사이의 정보를 나타내는 네트워크가 생성된다.

3.노드의 정보를 업데이트하기

3.1.Label

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8));nodes
##   id  label
## 1  1 Node 1
## 2  2 Node 2
## 3  3 Node 3
## 4  4 Node 4
## 5  5 Node 5
## 6  6 Node 6
## 7  7 Node 7
## 8  8 Node 8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8));edges
##   from to
## 1    1  5
## 2    6  3
## 3    2  5
## 4    3  7
## 5    4  7
## 6    7  1
## 7    1  4
## 8    6  2
## 9    1  8
visNetwork(nodes, edges, width = "100%")

노드에 이름을 지정하여 원 위에 각 노드의 정보를 나타낼 수 있다.

3.2.Shape

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"));nodes
##   id  label    shape
## 1  1 Node 1   square
## 2  2 Node 2 triangle
## 3  3 Node 3      box
## 4  4 Node 4      dot
## 5  5 Node 5     star
## 6  6 Node 6  ellipse
## 7  7 Node 7 database
## 8  8 Node 8  diamond
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8));edges
##   from to
## 1    1  5
## 2    6  3
## 3    2  5
## 4    3  7
## 5    4  7
## 6    7  1
## 7    1  4
## 8    6  2
## 9    1  8
visNetwork(nodes, edges, width = "100%")

노드에 모양을 지정하여 노드의 모양을 원이 아닌 다른 형태로 변경할 수 있다.

3.3.Group

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"));nodes
##   id  label    shape group
## 1  1 Node 1   square     A
## 2  2 Node 2 triangle     B
## 3  3 Node 3      box     A
## 4  4 Node 4      dot     B
## 5  5 Node 5     star     A
## 6  6 Node 6  ellipse     B
## 7  7 Node 7 database     A
## 8  8 Node 8  diamond     B
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8));edges
##   from to
## 1    1  5
## 2    6  3
## 3    2  5
## 4    3  7
## 5    4  7
## 6    7  1
## 7    1  4
## 8    6  2
## 9    1  8
visNetwork(nodes, edges, width = "100%")

그룹을 지정하여 노드의 색상을 그룹에 따라 표시할 수 있다. 네트워크에서 노드들이 속한 집단을 표시 할 때 효과적이다.

3.4.Color

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink"));nodes
##   id  label    shape    color
## 1  1 Node 1   square  darkred
## 2  2 Node 2 triangle     grey
## 3  3 Node 3      box   orange
## 4  4 Node 4      dot darkblue
## 5  5 Node 5     star   purple
## 6  6 Node 6  ellipse      red
## 7  7 Node 7 database     blue
## 8  8 Node 8  diamond     pink
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8));edges
##   from to
## 1    1  5
## 2    6  3
## 3    2  5
## 4    3  7
## 5    4  7
## 6    7  1
## 7    1  4
## 8    6  2
## 9    1  8
visNetwork(nodes, edges, width = "100%")

노드의 색상도 지정하여 변경할 수 있다.

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink"));nodes
##   id  label    shape group    color
## 1  1 Node 1   square     A  darkred
## 2  2 Node 2 triangle     B     grey
## 3  3 Node 3      box     A   orange
## 4  4 Node 4      dot     B darkblue
## 5  5 Node 5     star     A   purple
## 6  6 Node 6  ellipse     B      red
## 7  7 Node 7 database     A     blue
## 8  8 Node 8  diamond     B     pink
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8));edges
##   from to
## 1    1  5
## 2    6  3
## 3    2  5
## 4    3  7
## 5    4  7
## 6    7  1
## 7    1  4
## 8    6  2
## 9    1  8
visNetwork(nodes, edges, width = "100%")

그룹과 색상을 같이 사용할 경우 색상이 그룹보다 우선을 적용된다. 두 요소를 같이 사용하는 것보다 따로 사용하는 것이 좋다.

3.5.Shadow

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink"), shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE));nodes
##   id  label    shape    color shadow
## 1  1 Node 1   square  darkred  FALSE
## 2  2 Node 2 triangle     grey   TRUE
## 3  3 Node 3      box   orange  FALSE
## 4  4 Node 4      dot darkblue   TRUE
## 5  5 Node 5     star   purple   TRUE
## 6  6 Node 6  ellipse      red   TRUE
## 7  7 Node 7 database     blue  FALSE
## 8  8 Node 8  diamond     pink   TRUE
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8));edges
##   from to
## 1    1  5
## 2    6  3
## 3    2  5
## 4    3  7
## 5    4  7
## 6    7  1
## 7    1  4
## 8    6  2
## 9    1  8
visNetwork(nodes, edges, width = "100%")

노드의 그림자도 지정하여 변경할 수 있다.

4.엣지의 정보를 업데이트하기

4.1. Label

nodes <- data.frame(id = 1:8);nodes
##   id
## 1  1
## 2  2
## 3  3
## 4  4
## 5  5
## 6  6
## 7  7
## 8  8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9));edges
##   from to  label
## 1    1  5 Edge 1
## 2    6  3 Edge 2
## 3    2  5 Edge 3
## 4    3  7 Edge 4
## 5    4  7 Edge 5
## 6    7  1 Edge 6
## 7    1  4 Edge 7
## 8    6  2 Edge 8
## 9    1  8 Edge 9
visNetwork(nodes, edges, width = "100%")

엣지에 이름을 지정하여 선 위에 각 엣지의 정보를 나타낼 수 있다.

4.2. Length

nodes <- data.frame(id = 1:8);nodes
##   id
## 1  1
## 2  2
## 3  3
## 4  4
## 5  5
## 6  6
## 7  7
## 8  8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100));edges
##   from to  label length
## 1    1  5 Edge 1    100
## 2    6  3 Edge 2    200
## 3    2  5 Edge 3    300
## 4    3  7 Edge 4    400
## 5    4  7 Edge 5    300
## 6    7  1 Edge 6    200
## 7    1  4 Edge 7    100
## 8    6  2 Edge 8    500
## 9    1  8 Edge 9    100
visNetwork(nodes, edges, width = "100%")

각 엣지의 길이도 변경 할 수 있다. 네트워크에서 노드간의 유사성이 높은 경우 엣지의 길이를 짧게, 노드간의 유사성이 낮은 경우 엣지의 길이를 길게 시각화한다.

4.3. Width

nodes <- data.frame(id = 1:8);nodes
##   id
## 1  1
## 2  2
## 3  3
## 4  4
## 5  5
## 6  6
## 7  7
## 8  8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4));edges
##   from to  label length width
## 1    1  5 Edge 1    100     4
## 2    6  3 Edge 2    200     1
## 3    2  5 Edge 3    300     3
## 4    3  7 Edge 4    400     2
## 5    4  7 Edge 5    300     4
## 6    7  1 Edge 6    200     1
## 7    1  4 Edge 7    100     2
## 8    6  2 Edge 8    500     3
## 9    1  8 Edge 9    100     4
visNetwork(nodes, edges, width = "100%")

각 엣지의 굵기도 변경 할 수 있다. 네트워크에서 노드간의 유사성이 높은 경우 엣지의 굵기를 굵게, 노드간의 유사성이 낮은 경우 엣지의 굵기를 얇게 시각화한다.

4.4. Arrows

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8));nodes
##   id  label
## 1  1 Node 1
## 2  2 Node 2
## 3  3 Node 3
## 4  4 Node 4
## 5  5 Node 5
## 6  6 Node 6
## 7  7 Node 7
## 8  8 Node 8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"));edges
##   from to  label length width    arrows
## 1    1  5 Edge 1    100     4        to
## 2    6  3 Edge 2    200     1      from
## 3    2  5 Edge 3    300     3    middle
## 4    3  7 Edge 4    400     2 middle;to
## 5    4  7 Edge 5    300     4        to
## 6    7  1 Edge 6    200     1      from
## 7    1  4 Edge 7    100     2    middle
## 8    6  2 Edge 8    500     3 middle;to
## 9    1  8 Edge 9    100     4    middle
visNetwork(nodes, edges, width = "100%")

노드들 사이의 관계의 방향성을 지정 할 수 있다. - to: 노드 1 -> 노드 5 - from: 노드 3 -> 노드 6 - middle: 노드 2 -> 노드 5 (기본적인 화살표 방향은 to와 같지만 엣지의 중간에 에로우를 생성한다.) - middle;to: 노드 3 -> 노드 7 (기본적인 화살표 방향은 to와 같고 엣지의 중간과 끝 부분에 에로우를 생성한다.)

4.5. Dashes

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8));nodes
##   id  label
## 1  1 Node 1
## 2  2 Node 2
## 3  3 Node 3
## 4  4 Node 4
## 5  5 Node 5
## 6  6 Node 6
## 7  7 Node 7
## 8  8 Node 8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE));edges
##   from to  label length width    arrows dashes
## 1    1  5 Edge 1    100     4        to  FALSE
## 2    6  3 Edge 2    200     1      from  FALSE
## 3    2  5 Edge 3    300     3    middle  FALSE
## 4    3  7 Edge 4    400     2 middle;to  FALSE
## 5    4  7 Edge 5    300     4        to  FALSE
## 6    7  1 Edge 6    200     1      from  FALSE
## 7    1  4 Edge 7    100     2    middle  FALSE
## 8    6  2 Edge 8    500     3 middle;to   TRUE
## 9    1  8 Edge 9    100     4    middle  FALSE
visNetwork(nodes, edges, width = "100%")

엣지들중 중요한 역할을 하는 엣지를 표시하기 위해 해당 선을 점선으로 바꾸어 시각화 할 수 있다.

4.6. Shadow

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8));nodes
##   id  label
## 1  1 Node 1
## 2  2 Node 2
## 3  3 Node 3
## 4  4 Node 4
## 5  5 Node 5
## 6  6 Node 6
## 7  7 Node 7
## 8  8 Node 8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE));edges
##   from to  label length width    arrows dashes shadow
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE
visNetwork(nodes, edges, width = "100%")

엣지의 그림자도 지정하여 변경할 수 있다.

4.7. Color

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8));nodes
##   id  label
## 1  1 Node 1
## 2  2 Node 2
## 3  3 Node 3
## 4  4 Node 4
## 5  5 Node 5
## 6  6 Node 6
## 7  7 Node 7
## 8  8 Node 8
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink","darkgray"));edges
##   from to  label length width    arrows dashes shadow    color
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE  darkred
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE     grey
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE   orange
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE darkblue
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE   purple
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE      red
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE     blue
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE     pink
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE darkgray
visNetwork(nodes, edges, width = "100%")

엣지의 컬러도 지정해서 변경이 가능하다.

5.제목 및 범례 생성하기

5.1.제목 생성하기

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"), shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE));nodes
##   id  label    shape group shadow
## 1  1 Node 1   square     A  FALSE
## 2  2 Node 2 triangle     B   TRUE
## 3  3 Node 3      box     A  FALSE
## 4  4 Node 4      dot     B   TRUE
## 5  5 Node 5     star     A   TRUE
## 6  6 Node 6  ellipse     B   TRUE
## 7  7 Node 7 database     A  FALSE
## 8  8 Node 8  diamond     B   TRUE
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink","darkgray"));edges
##   from to  label length width    arrows dashes shadow    color
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE  darkred
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE     grey
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE   orange
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE darkblue
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE   purple
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE      red
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE     blue
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE     pink
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE darkgray
visNetwork(nodes, edges, main = "R을 사용한 네트워크 시각화", width = "100%")

visNetwork의 요소중 main기능에 텍스트를 추가하면 제목이 생성된다.

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"), shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE));nodes
##   id  label    shape group shadow
## 1  1 Node 1   square     A  FALSE
## 2  2 Node 2 triangle     B   TRUE
## 3  3 Node 3      box     A  FALSE
## 4  4 Node 4      dot     B   TRUE
## 5  5 Node 5     star     A   TRUE
## 6  6 Node 6  ellipse     B   TRUE
## 7  7 Node 7 database     A  FALSE
## 8  8 Node 8  diamond     B   TRUE
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink","darkgray"));edges
##   from to  label length width    arrows dashes shadow    color
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE  darkred
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE     grey
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE   orange
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE darkblue
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE   purple
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE      red
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE     blue
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE     pink
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE darkgray
visNetwork(nodes, edges, main = "R을 사용한 네트워크 시각화", submain = "조선시대사학회", width = "100%")

visNetwork의 요소중 submain기능에 텍스트를 추가하면 부제목이 생성된다.

5.2.캡션 생성하기

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"), shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE));nodes
##   id  label    shape group shadow
## 1  1 Node 1   square     A  FALSE
## 2  2 Node 2 triangle     B   TRUE
## 3  3 Node 3      box     A  FALSE
## 4  4 Node 4      dot     B   TRUE
## 5  5 Node 5     star     A   TRUE
## 6  6 Node 6  ellipse     B   TRUE
## 7  7 Node 7 database     A  FALSE
## 8  8 Node 8  diamond     B   TRUE
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink","darkgray"));edges
##   from to  label length width    arrows dashes shadow    color
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE  darkred
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE     grey
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE   orange
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE darkblue
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE   purple
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE      red
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE     blue
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE     pink
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE darkgray
visNetwork(nodes, edges, footer = "Fig.1 R을 사용한 네트워크 시각화", width = "100%")

visNetwork의 요소중 footer기능에 텍스트를 추가하면 시각화의 아래쪽에 텍스트가 생성되고 캡션의 역할을 할 수 있다.

5.3.범례 생성하기

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"), shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE));nodes
##   id  label    shape group shadow
## 1  1 Node 1   square     A  FALSE
## 2  2 Node 2 triangle     B   TRUE
## 3  3 Node 3      box     A  FALSE
## 4  4 Node 4      dot     B   TRUE
## 5  5 Node 5     star     A   TRUE
## 6  6 Node 6  ellipse     B   TRUE
## 7  7 Node 7 database     A  FALSE
## 8  8 Node 8  diamond     B   TRUE
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink","darkgray"));edges
##   from to  label length width    arrows dashes shadow    color
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE  darkred
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE     grey
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE   orange
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE darkblue
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE   purple
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE      red
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE     blue
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE     pink
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE darkgray
visNetwork(nodes, edges, width = "100%") %>% visLegend()

dplyr에서 지원하는 파이프를 사용하여 visLegend()visNetwork()와 같이 실행하면 자동으로 노드의 그룹에 따라 범례를 생성하여 준다.

nodes <- data.frame(id = 1:8, label = paste("Node", 1:8), shape = c("square", "triangle", "box", "dot", "star", "ellipse", "database", "diamond"), group = c("A","B","A","B","A","B","A","B"), shadow = c(FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE));nodes
##   id  label    shape group shadow
## 1  1 Node 1   square     A  FALSE
## 2  2 Node 2 triangle     B   TRUE
## 3  3 Node 3      box     A  FALSE
## 4  4 Node 4      dot     B   TRUE
## 5  5 Node 5     star     A   TRUE
## 6  6 Node 6  ellipse     B   TRUE
## 7  7 Node 7 database     A  FALSE
## 8  8 Node 8  diamond     B   TRUE
edges <- data.frame(from = c(1,6,2,3,4,7,1,6,1), to = c(5,3,5,7,7,1,4,2,8), label = paste("Edge", 1:9), length = c(100,200,300,400,300,200,100,500,100),width = c(4,1,3,2,4,1,2,3,4),arrows = c("to", "from", "middle", "middle;to","to", "from", "middle", "middle;to","middle"), dashes = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), shadow = c(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE), color = c("darkred", "grey", "orange", "darkblue", "purple","red","blue","pink","darkgray"));edges
##   from to  label length width    arrows dashes shadow    color
## 1    1  5 Edge 1    100     4        to  FALSE  FALSE  darkred
## 2    6  3 Edge 2    200     1      from  FALSE   TRUE     grey
## 3    2  5 Edge 3    300     3    middle  FALSE  FALSE   orange
## 4    3  7 Edge 4    400     2 middle;to  FALSE   TRUE darkblue
## 5    4  7 Edge 5    300     4        to  FALSE  FALSE   purple
## 6    7  1 Edge 6    200     1      from  FALSE   TRUE      red
## 7    1  4 Edge 7    100     2    middle  FALSE  FALSE     blue
## 8    6  2 Edge 8    500     3 middle;to   TRUE   TRUE     pink
## 9    1  8 Edge 9    100     4    middle  FALSE   TRUE darkgray
visNetwork(nodes, edges, width = "100%") %>% visLegend(position = "right", main = "범례")

visLegend()의 요소인 positionmain을 통해 범례의 위치와 제목을 생성할 수 있다.

6.데이터를 사용하여 네트워크 생성하기

6.1.레미제라블(Les miserables) 데이터

nodes <- jsonlite::fromJSON("https://raw.githubusercontent.com/datastorm-open/datastorm-open.github.io/master/visNetwork/data/nodes_miserables.json")
edges <- jsonlite::fromJSON("https://raw.githubusercontent.com/datastorm-open/datastorm-open.github.io/master/visNetwork/data/edges_miserables.json")

6.2.레미제라블(Les miserables) 데이터를 사용해서 네트워크 생성하기

visNetwork(nodes, edges, height = "700px", width = "100%") 

실제 데이터(data.frame)에서 각 노드와 엣지에서 사용하는 요소들로 열을 만들고 visNetwork()에 데이터를 적용하여 네트워크를 생성 할 수 있다.

visNetwork(nodes, edges, height = "700px", width = "100%") %>% visOptions(selectedBy = "group")

visOptions()을 통해 그룹 별로 네트워크를 확인 할 수 있는 옵션을 생성할 수 있다.

visNetwork(nodes, edges, height = "700px", width = "100%") %>% visOptions(selectedBy = "group", highlightNearest = TRUE)

visOptions()을 통해 흥미로운 노드와 그 노드와 직접적으로 관계를 맺는 주변 노드를 확인하는 기능을 highlightNearest를 통해 구현 할 수 있다.

visNetwork(nodes, edges, height = "700px", width = "100%") %>% visOptions(selectedBy = "group", highlightNearest = TRUE, nodesIdSelection = TRUE)

nodesIdSelection을 통해 노드의 이름을 선택하는 옵션을 생성하고 이 기능을 통해 선택된 노드와 그 노드와 직접적으로 관계를 맺는 주변 노드를 확인 할 수 있다.

visNetwork(nodes, edges, height = "700px", width = "100%") %>% visOptions(selectedBy = "group", highlightNearest = TRUE, nodesIdSelection = TRUE) %>% visPhysics(stabilization = FALSE)

visPhysics()에서 stabilizationFALSE로 지정하면 네트워크가 초기 생성될때 노드간의 상호 중력을 계산하는 과정을 모두 볼 수 있어 네트워크에 더 동적인 효과를 줄 수 있다.

6.3.역사 데이터 (i.e., 고려 초기, 태조 왕건의 혼인 네트워크)

6.3.1.역사 데이터 (i.e., 고려 초기, 태조 왕건의 혼인 네트워크) 불러오기

6.3.2. 경로 지정하기

# getwd()
# setwd("/Users/seongminmun/Desktop/Development/Rprogram/R_Script/data/")
# dir()

현재 R과 연결된 자신의 작업 환경 경로를 확인하고 데이터가 있는 경로로 지정한다.

6.3.3. 노드 데이터 불러오기

node <- read.csv("node_teajo.csv", header=TRUE, fileEncoding="UTF-8"); head(node)
##   X id              label group city
## 1 0  0               태조     0 개경
## 2 1  1 신혜왕후유씨_태조1     1 정주
## 3 2  2             유천궁     1 정주
## 4 3  3 정덕왕후유씨_태조6     1 정주
## 5 4  4             유덕영     1 정주
## 6 5  5 장화왕후오씨_태조2     2 나주

필요하지 않은 정보들도 포함되어 있는 것을 확인 할 수 있다.

node <- node[,c(2,3,4)]; head(node)
##   id              label group
## 1  0               태조     0
## 2  1 신혜왕후유씨_태조1     1
## 3  2             유천궁     1
## 4  3 정덕왕후유씨_태조6     1
## 5  4             유덕영     1
## 6  5 장화왕후오씨_태조2     2

필요없는 열은 제거하고 데이터를 저장한다.

6.3.4. 엣지 데이터 불러오기

edge <- read.csv("edge_teajo.csv", header=TRUE, fileEncoding="UTF-8"); head(edge)
##   X from to           from_kor             to_kor
## 1 0    0  1               태조 신혜왕후유씨_태조1
## 2 1    0  2               태조             유천궁
## 3 2    1  2 신혜왕후유씨_태조1             유천궁
## 4 3    0  3               태조 정덕왕후유씨_태조6
## 5 4    0  4               태조             유덕영
## 6 5    3  4 정덕왕후유씨_태조6             유덕영

필요하지 않은 정보들도 포함되어 있는 것을 확인 할 수 있다.

edge <- edge[,c(2,3)]; head(edge)
##   from to
## 1    0  1
## 2    0  2
## 3    1  2
## 4    0  3
## 5    0  4
## 6    3  4

필요없는 열은 제거하고 데이터를 저장한다.

6.4.역사 데이터 (i.e., 고려 초기, 태조 왕건의 혼인 네트워크)를 사용하여 네트워크 생성하기

visNetwork(node, edge, height = "700px", width = "100%") %>% visOptions(selectedBy = "group", highlightNearest = TRUE, nodesIdSelection = TRUE) %>% visPhysics(stabilization = FALSE)

실제 가공된 역사 데이터(data.frame)에서 고려 초기 태조 왕건이 어떤 지방 호적들과 혼인 네트워크를 형성하였는지 확인할 수 있다.