ggplot2 extensions - ggrepel

by Minho Lee — on  ,  ,  ,  , 

cover-image

ggplot2 extenstions

최근 ggplot2 2.0버전이 공개되면서 ggplot2의 기능을 확장시키는 방법에 대한 공식적인 가이드가 제시되었다. 그에 따라 기존부터 존재하던 ggplot2 관련 패키지들도 새로운 버전에 맞게 수정되거나, 수정되고있고, 다양한 추가 기능을 포함하는 패키지들도 함께 공개되고있다.

앞으로 확대될 ggplot2의 extension들을 소개하는 페이지도 생겼다 http://ggplot2-exts.github.io/

네트워크 시각화, 애니메이션 추가 등 다양한 기능을 가진 extension들이 존재하지만 이번 글에서는 text label을 겹치지 않도록 해주는 ggrepel 패키지를 소개하려고 한다


ggrepel

ggplot2geom_textgeom_label을 사용하다 보면 텍스트가 겹치는 경우가 많이 생긴다. 이러한 경우에 ggrepel은 텍스트가 겹치지 않도록 수정된 geom을 제공해준다

library(ggplot2)
library(ggrepel)
library(dplyr)

ggplot2msleep 데이터를 가지고 그래프를 그렸다.

name의 텍스트들이 길기 때문에 적은 수의 데이터를 가지고 그리더라도 텍스트가 많이 겹치는 것을 볼 수 있다.

msleep %>% 
  filter(!is.na(sleep_rem)) %>%
  filter(sleep_total > 12) %>% 
  ggplot(aes(x = sleep_rem, y = awake)) + 
    geom_point(alpha = 0.5) +
    geom_text(aes(label = name))

문자열로 된 레이블같은 경우에는 문자열 자체가 가지는 너비와 높이가 있지만 그러한 값들이 데이터에 포함되어 있지는 않다. 따라서 ggplot2로는 문자열이 겹쳐서 가독성이 떨어지는 현상에 대해서 대처하기 힘들었다.

이러한 문제에 간단하게 대응할 수 있는 기능이 ggplot2 2.0.0 버전에 추가되었다.( 업데이트 내용 링크) geom_text에서 check_overlap = TRUE를 설정해주면 겹치는 항목을 제거해서 보여준다. 크게 노력하거나 시간을 들이지 않고 간단하게 시행할 수 있지만, 일부 항목이 누락된다는 단점이 있다.

msleep %>% 
  filter(!is.na(sleep_rem)) %>%
  filter(sleep_total > 12) %>% 
  ggplot(aes(x = sleep_rem, y = awake)) + 
    geom_point(alpha = 0.5) +
    geom_text(aes(label = name), check_overlap = TRUE)




ggrepelgeom_text_repel의 경우 텍스트들이 차지하는 공간을 고려해서 배치해준다

사용하는 방법은 기존 함수와 비슷하다. hjust, vjust등 기존 geom_text, geom_label 함수에서 사용할 수 있는 옵션 중 일부는 사용할 수 없다.

항목이 많으면 시간이 오래걸릴 수 있다.

msleep %>% 
  filter(!is.na(sleep_rem)) %>%
  filter(sleep_total > 12) %>% 
  ggplot(aes(x = sleep_rem, y = awake)) + 
    geom_point(alpha = 0.5) +
    geom_text_repel(aes(label = name))


geom_text와 마찬가지로 geom_label에 대응하는 geom_label_repel함수가 있다

msleep %>% 
  filter(!is.na(sleep_rem)) %>%
  filter(sleep_total > 12) %>% 
  ggplot(aes(x = sleep_rem, y = awake)) + 
    geom_point(alpha = 0.5) +
    geom_label_repel(aes(label = name))


현재 버전에서는 plot 크기에 따라 text/label의 크기가 변하지 않는 등 개선사항이 남아있다. 추후에 업데이트를 통해서 해결할 예정이라고 한다.




ggrepel 뿐만 아니라 다양한 ggplot2 관련 패키지들이 공개되고 있다.

R은 통계 분석 뿐만 아니라 시각화에서도 큰 강점을 보인다고 생각하는데, 이번 기회로 인해 ggplot2로 대응할 수 있는 영역이 더 확대되었으면 하는 바람이다.

Comments