그려 보기

R 실습 — 손으로 돌려 보기STAGED+ 스터디

지표를 계산하기 전에 반드시 한 번 그려 본다. 데이터를 잘못 읽었는지, 고립자가 있는지, 덩어리가 몇 개인지가 그림 한 장에서 다 보인다.

3.1 gplot과 plot — 같은 그림, 다른 문법 (Same Picture, Different Grammar)

col_sex <- ifelse(nod$female, "#f472b6", "#60a5fa")   # 여=분홍, 남=파랑
ind     <- sna::degree(adj, cmode = "indegree")       # 받은 지명 수

sna::gplot(adj, gmode = "digraph",
           vertex.col = col_sex,
           vertex.cex = 1.15 + ind * 0.13,
           displaylabels = TRUE, label = rownames(adj), label.cex = .5,
           boxed.labels = FALSE, label.pos = 5,
           edge.col = "#cbd5e1", arrowhead.cex = .45)
sna::gplot으로 그린 학급 네트워크
그림 1 — sna::gplot. 색 = 성별, 크기 = 받은 지명 수. 오른쪽 아래에 혼자 떨어진 1024가 보인다.
plot(g, layout = lay,
     vertex.color = col_sex,
     vertex.size  = 7 + ind * 1.5,
     vertex.label = rownames(adj), vertex.label.cex = .45,
     vertex.frame.color = "white",
     edge.color = "#cbd5e1", edge.arrow.size = .22)
igraph::plot으로 그린 같은 네트워크
그림 2 — igraph::plot. 같은 자료·같은 좌표·같은 지표이므로 두 그림의 차이는 오직 문법과 기본 스타일뿐이다.
하고 싶은 것sna::gplotigraph::plot
정점 색vertex.colvertex.color
정점 크기vertex.cex (반지름 배수)vertex.size (기본 15)
이름 표시displaylabels=TRUE, label=vertex.label=
화살표 크기arrowhead.cexedge.arrow.size
좌표 지정coord=layout=
배치 알고리즘mode="fruchtermanreingold"layout_with_fr()
크기 인자의 스케일이 완전히 다르다. vertex.cex = 15는 gplot에서 화면을 덮는 괴물이 되고, vertex.size = 1.5는 igraph에서 점으로 보이지도 않는다. 새 패키지의 그림 함수를 쓸 때는 args()부터 찍어 보는 습관이 시간을 아낀다.

3.2 좌표를 손에 쥐어야 하는 이유 (Why You Must Fix the Layout)

배치 알고리즘은 매번 다른 그림을 준다. 무작위 초기값에서 출발하기 때문이다. 그러면 "지난주에 보여 준 그림"과 "오늘 그린 그림"이 달라져 이야기가 이어지지 않는다. 좌표를 한 번 계산해서 변수에 담아 두고 계속 재사용하는 것이 정석이다.

set.seed(7)                        # 재현 가능하게
gu  <- igraph::as_undirected(g, mode = "collapse")
lay <- igraph::layout_with_fr(gu)  # 26 × 2 좌표 행렬

sna::gplot(adj, coord = lay, ...)  # 같은 좌표를
plot(g,        layout = lay, ...)  # 양쪽에 그대로
고립자가 그림을 망친다. 아무와도 연결되지 않은 1024는 밀어내는 힘만 받아 화면 끝까지 날아가고, 나머지 25명은 가운데 뭉쳐 뭉개진다. 좌표 행렬을 직접 고쳐 본체 옆에 붙이면 된다.
i <- which(rownames(adj) == "1024")
lay[i, ] <- c(max(lay[-i, 1]) + 1.2, min(lay[-i, 2]) - 0.3)
한글이 □□로 나올 때 — macOS에서 png()는 quartz 장치를 쓰는데 여기에 한글을 그리면 두부(tofu) 네모가 나온다. family="AppleGothic"을 줘도 안 고쳐진다. type="cairo"는 X11이 없으면 아예 실패한다. 해결책은 ragg다.
ragg::agg_png("그림.png", width = 1600, height = 1300, res = 200)
# ... 그림 그리기 ...
dev.off()
ragg는 시스템 폰트를 알아서 찾으므로 family=를 지정할 필요조차 없다.