R 그래프 - 높이가 다른 원그래프 그리기

원그래프를 하나 그려볼건데, 수치가 높을수록 면적이 커지는게 원그래프 이지만, 높이도 높아지는(?) 그래프를 그려볼까 한다. 말이 좀 이상하지만, 아래 완성본을 보면 대략 이해가 갈 것이다. 높이가 다르기 때문에 일반적인 원그래프 그릴때와는 다르게 geom_rect 를 사용할 것이다.

데이터 만들기

조금은 특별한 파이차트(원그래프)를 그리기위해서는 데이터가 몇가지 더 필요하다. 단순 x/y 좌표가 아니라, geom_rect 에서 원하는 파라메터 스타일에 맞춰야한다. 아래 도움말을 보면 xmin, xmax, ymin and ymax 4개의 코너의 위치가 필요하다고 하니 그에 맞춰서 데이터를 구성해야 한다.

Rectangles

Description

geom_rect() and geom_tile() do the same thing, but are parameterised differently: geom_rect() uses the locations of the four corners (xmin, xmax, ymin and ymax), while geom_tile() uses the center of the tile and its size (x, y, width, height). geom_raster() is a high performance special case for when all the tiles are the same size.

w 만 셋팅하면 데이터가 만들어지도록 데이터를 구성한다.

tb1 = tibble(w = c(5,4,3,2,1)) %>% 
  mutate(x2 = cumsum(w)) %>% 
  mutate(x1 = lag(x2, 1, default = 0), .before = x2) %>% 
  mutate(x_pos = (x1 + x2) / 2) %>% 
  mutate(y1 = 0) %>% 
  mutate(y2 = w) %>% 
  mutate(y3 = w/4 + 4) 

# A tibble: 5 × 7
      w    x1    x2 x_pos    y1    y2    y3
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     5     0     5   2.5     0     5  5.25
2     4     5     9   7       0     4  5   
3     3     9    12  10.5     0     3  4.75
4     2    12    14  13       0     2  4.5 
5     1    14    15  14.5     0     1  4.25

그래프 만들기

xmin, xmax, ymin, ymax 4개의 위치를 셋팅하고 난후, geom_rect 함수를 사용한다.

ggplot(tb1, aes(xmin = x1, 
                xmax = x2, 
                ymin = y1, 
                ymax = y2, 
                fill = factor(w))) +
  geom_rect() +
  coord_fixed()

coord_polar 를 이용해서 원그래프를 그리면, 면적도 다르면서 높이까지 다른 원그래프가 만들어진다. 근데 너무 편차가 크다보니 이쁘지도 않고 과한 느낌이라 약간의 보정이 필요할 듯 하다.

ggplot(tb1, aes(xmin = x1, 
                xmax = x2, 
                ymin = y1, 
                ymax = y2, 
                fill = factor(w))) +
  geom_rect() +
  coord_polar()

y3 값이 어느정도 높이값을 보정해놓은 수치이다.

ggplot(tb1, aes(xmin = x1, 
                xmax = x2, 
                ymin = y1, 
                ymax = y3, 
                fill = factor(w))) +
  geom_rect() +
  coord_fixed()

y3 값을 사용하니 조금 편차가 줄어들어 볼만한 차트가 되었다.

ggplot(tb1, aes(xmin = x1, 
                xmax = x2, 
                ymin = y1, 
                ymax = y3, 
                fill = factor(w))) +
  geom_rect() +
  coord_polar()

그래프에 수치를 텍스트로 추가해본다. 수치가 클수록 폰트의 크기도 크게 셋팅했으며, 적당한 위치를 자동계산하기 어려워서 y_pos에 직접 셋팅했다. 이것으로 틀은 완성되었다.

tb2 = tb1 %>% 
  mutate(y_pos = c(3,3,3,3,3.2)) %>% 
  mutate(text_size = c(10,8,6,5,4)) %>% 
  mutate(rate = paste0(round(w / sum(w) * 100, 1), "%"))

ggplot(tb2, aes(xmin = x1, 
                xmax = x2, 
                ymin = y1, 
                ymax = y3, 
                fill = factor(w))) +
  geom_rect() +
  geom_text(aes(x = x_pos, 
                y = y_pos, 
                label = rate), 
            size = tb2$text_size) +
  coord_polar() +
  theme(axis.title = element_blank())

마무리는 항상 그랬듯, 폰트/색상 등을 수정하여 마무리한다.


더 보면 좋을 글들