R 그래프 - 타일 형태의 막대그래프 그리기

인터넷상에서 내가 배울만한 그래프를 찾아보는 편인데, 좀 특이한 막대그래프가 있어서 따라해봤다. 기본틀은 막대그래프인데, 그안에 타일모양으로 구성시켜 조금은 특이한 그래프이다. 아래 그래프와 같은 구조이며, 각 막대그래프위에 숫자표시까지해서 마무리했다.

그래프 데이터 만들기

막대그래프이긴하나 타일구조를 만들어야 하니, geom_tile 함수를 이용하기로 한다. 데이터를 만들때, 각 타일의 위치를 나타내도록 x,y 좌표값을 셋팅해야 한다. 예를 들어 (1,1), (1,2), (1,3), (1,2) 이렇게 총 4개의 쌍의 x,y 좌표를 만들어 봤다.

tb1 = tibble(x = c(1,2,3,1),
             y = c(1,1,1,2))

# A tibble: 4 × 2
      x     y
  <dbl> <dbl>
1     1     1
2     2     1
3     3     1
4     1     2

그래프 만들기

데이터가 만들어졌으니, 해당 데이터를 가지고 간단히 그래프를 그려본다. geom_tile 을 사용할 건데, 좌표만 설정이 되면 네모모양의 타일이 그 위치에 그려진다. (x, y) 값이 4쌍이니, 4개의 타일이 그려지고, 조금 여백을 주기위해, size = 2 로 간격을 더 두껍게 셋팅한다.

ggplot(tb1, aes(x, y, fill = factor(1))) +
  geom_tile(size = 2, colour = "gray100") +
  coord_fixed()

타일을 하나씩 늘리려고하면, 데이터만 추가하면 된다. x = 2, y = 2 위치에 타일을 추가한 예시이며, 조금 강조하기위해서 색상을 z 값을 추가해서, fill 설정을 한다. 초록색 부분이 추가된 타일이다.

tb1 = tibble(x = c(1,2,3,1,2),
             y = c(1,1,1,2,2),
             z = c(1,1,1,1,2))
# A tibble: 5 × 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     1     1
2     2     1     1
3     3     1     1
4     1     2     1
5     2     2     2

ggplot(tb1, aes(x, y, fill = factor(z))) +
  geom_tile(size = 2, colour = "gray100") +
  coord_fixed()

근데 문제는 그렇게 하나씩 일일이 추가할 수는 없고, 좀 다른 방법을 찾아야한다. 아래는 18개의 타일을 가로로 5개씩 쌓는 구조를 그리기위해 만든 데이터이며, 최초에 18이란 값만 셋팅하면 되니 조금 더 편해지긴 했다.

tb1 = tibble(v = 1:18) %>% 
  mutate(x1 = v %% 5) %>% 
  mutate(x2 = ifelse(x1 == 0, 5, x1)) %>% 
  mutate(y1 = (v-1) %/% 5) %>% 
  mutate(y2 = y1 + 1) %>% 
  select(x2, y2)

# A tibble: 18 × 2
      x2    y2
   <dbl> <dbl>
 1     1     1
 2     2     1
 3     3     1
 4     4     1
 5     5     1
 6     1     2
 7     2     2
 8     3     2
 9     4     2
10     5     2
11     1     3
12     2     3
13     3     3
14     4     3
15     5     3
16     1     4
17     2     4
18     3     4

이 데이터를 가지고 그래프를 그리면 가로 5개씩 타일이 쌓여 총 18개의 타일로 구성된 막대그래프가 그려진다.

ggplot(tb1, aes(x2, y2, fill = factor(1))) +
  geom_tile(size = 1, colour = "gray100") +
  coord_fixed()

이 개념만 잘 자리가 잡혔다면 더 확장해볼 수 있다. facet_wrap 함수를 이용하면, 이런 그래프를 한판에 여러개 만들 수가 있는데 중요한건 데이터 이다. 그에 맞게 데이터를 재구성 하면 된다.

ggplot(tb1, aes(x, y, fill = factor(g))) +
  geom_tile(size = 1, 
            colour = "gray100") +
  facet_wrap(~factor(g, v_ord), nrow = 1) +
  coord_fixed() +
  theme_bw() +
  theme(legend.position = "none",
        axis.title = element_blank())

마지막으로 텍스트 추가, 색상변경, 폰트 등을 셋팅해서 마무리하면 끝이다. 만들고 보니 약간 건물형상처럼 보이기도 한다. 아파트관련 데이터를 나타낼때, 각층에 사는세대가 4~5개이면 그것에 맞춰 그래프를 만들면 한눈에 현황이나 조사결과를 표현할 수도 있을 것 같다.


더 보면 좋을 글들