R 그래프 - 시계모양 그래프 만들기

R 그래프를 가지고 시계모양의 그래프를 그려본다. 우선 시계모양을 그려야 하니, 도넛차트를 그려야 한다. 시간과 분을 하나의 원에 겹쳐 그릴수도 있겠지만, 2개로 나눠서 그려보려 한다. 시계라고 생각해서 그렸는데 그리고 보니, 백분율을 표현하는 것도 좋을 것 같다.

우선 아래 그림은 완성한 차트이며, 왼쪽 차트는 12시간을 나타내도록 12개의 구간으로 나눴고, 오른쪽 차트는 60분을 나타내려고 60개의 구간으로 나누었다.

그래프 데이터 만들기

우선 시간을 나타낼 도넛차트를 만들건데, 12개의 구간으로 나누어 놓고 4개만 다른 색상으로 셋팅하기위해 아래와 같이 데이터를 구성한다. z 가 색상 2개로 나누게 될 구분자가 된다. 왜 이렇게 만들었는지는 다음 차트를 보면 이해하기가 쉽다.

tb_hour = tibble(x = rep(1,12),
                 y = rep(1,12),
                 z = c(rep(1,4), rep(0,12-4)))

tb_hour %>% print(n = Inf)
# A tibble: 12 × 3
       x     y     z
   <dbl> <dbl> <dbl>
 1     1     1     1
 2     1     1     1
 3     1     1     1
 4     1     1     1
 5     1     1     0
 6     1     1     0
 7     1     1     0
 8     1     1     0
 9     1     1     0
10     1     1     0
11     1     1     0
12     1     1     0

그래프 만들기

도넛 차트 데이터를 만들기 전에, 우선 막대그래프를 만들어야 한다. geom_col 함수를 이용해서 그리게 되면, 12개의 값이 하나의 x값 위에 쌓여있는 누적막대그래프가 그려진다. 그게 잘 표시가 안되다보니, colour 값을 넣어주면 확연히 드러난다.

ggplot(tb_hour, aes(x, y, fill = factor(z))) +
  geom_col(colour = "gray100", size = 1)

coord_polar 로 우선 파이차트로 만들어 놓는다.

ggplot(tb_hour, aes(x, y, fill = factor(z))) +
  geom_col(colour = "gray100", size = 1) +
  coord_polar(theta = "y")

xlim 으로 가운데 공간을 비워주면, 도넛차트가 만들어진다.

ggplot(tb_hour, aes(x, y, fill = factor(z))) +
  geom_col(colour = "gray100", size = 1) +
  coord_polar(theta = "y") +
  xlim(-3, 1.5)

facet_wrap 을 이용해서 시간과 분을 나타낼 도넛차트를 한번에 그릴 수 있다.

tb1 %>% union_all(tb2) %>% 
  ggplot(aes(x,y, fill = factor(z))) +
  geom_col(colour = "gray100", size = 1) +
  xlim(-3, 1.5) +
  coord_polar(theta = "y") +
  facet_wrap(~g) +
  theme(legend.position = "none")

theme_light와 같은 테마를 한번씩 써주면, 기존 그래프보다는 좀 가벼워짐을 느낀다. 그래프 색상을 직접 지정하고 싶다면, scale_fill_manual 함수를 사용하면 된다.

tb1 %>% union_all(tb2) %>% 
  ggplot(aes(x,y, fill = factor(z))) +
  geom_col(colour = "gray100", size = 1) +
  xlim(-3, 1.5) +
  coord_polar(theta = "y") +
  facet_wrap(~g) +
  scale_fill_manual(values = c("gray50", "#F7C848")) +
  theme_light() +
  theme(legend.position = "none")

마지막으로 폰트와, 색상 등 디자인 요소들을 가미하면 아래와 같은 그래프를 만들 수 있다.


더 보면 좋을 글들