R 그래프 - 링(Ring) 모양 차트 그리기

애플워치의 운동기록을 표현될 때, 링(Ring) 모양의 그래프로 표시된다. ggplot2 를 가지고 이런 링모양의 그래프를 그릴 수 있을지 한번 그려봤다. 기본 컨셉은 흔한 도넛 차트인데, 막대의 각 끝에 부드럽게 라운딩 처리만 추가해봤다. 라운딩 처리를 ggplot2 패키지에서 기본지원해주면 좋으련만 그런 옵션이 없다보니, geom_point 로 덧붙여서 비슷한 효과를 냈다.

그래프 데이터 만들기

이번 그래프의 데이터는 정말 간단하다. x/y 값 4개의 쌍으로만 이루어져 있으면 만들 수 있다.

tb1 = tibble(x = 1:4,
            y = sample(20:100, 4, replace = T)) 


# A tibble: 4 × 2
      x     y
  <int> <int>
1     1    82
2     2    37
3     3    23
4     4    31

그래프 그리기

처음에는 간단히 막대그래프를 그려준다.

ggplot(tb1, aes(x,y, fill= factor(x))) +
  geom_col() 

coord_polar 함수를 이용해서 도넛차트를 만들어 준다. lims 함수로 y 옵션에 0~100 범위를 셋팅해야 하는데, 이걸 셋팅하지 않으면, y 값중에 가장 높은 수치를 가지고 원 모양이 만들어지다보니, 정확한 백분율의 느낌을 주기위해 셋팅이 필요했다.

# 왼쪽 그래프
ggplot(tb1, aes(x,y, fill= factor(x))) +
  geom_col() +
  coord_polar(theta = "y") +
  lims(y = c(0, 100))

# 오른쪽 그래프
ggplot(tb1, aes(x,y, fill= factor(x))) +
  geom_col() +
  coord_polar(theta = "y") +
  lims(x = c(-2, 5), y = c(0, 100))

마지막으로 도넛차트 끝에 둥글게 라운딩처리를 해야 한다. geom_point 함수를 이용해서 둥글게 만들었는데, size를 지정하는게 너무 어려웠다. 눈으로 봐가면서 수치를 조정하다보니, 시간이 좀 걸린다. 기본 그래프는 완성되었다.

ggplot(tb1, aes(x,y, fill= factor(x))) +
  geom_col() +
  geom_point(aes(x = x, y = 0, color = factor(x)), size = v_point_size) +
  geom_point(aes(color = factor(x)), size = v_point_size) +
  coord_polar(theta = "y") +
  lims(x = c(-2, 5), y = c(0, 100))

마지막으로, facet_wrap 함수를 이용해서 여러차트를 한판에 만들고, 폰트/색상 등 조정하면 아래와 같은 그래프를 만들 수 있다.


더 보면 좋을 글들