← SNA 입문 · R로 시작하기 차례
3편Visualization
그려 보기
SNA 입문 · 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. 색 = 성별, 크기 = 받은 지명 수.
오른쪽 아래에 혼자 떨어진 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. 같은 자료·같은 좌표·같은 지표이므로
두 그림의 차이는 오직 문법과 기본 스타일뿐이다.| 하고 싶은 것 | sna::gplot | igraph::plot |
|---|---|---|
| 정점 색 | vertex.col | vertex.color |
| 정점 크기 | vertex.cex (반지름 배수) | vertex.size (기본 15) |
| 이름 표시 | displaylabels=TRUE, label= | vertex.label= |
| 화살표 크기 | arrowhead.cex | edge.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=를 지정할 필요조차 없다.