티스토리 뷰

얼마전에 격자모양 그래프를 만들어보았는데, geom_col 함수가 아니라 더 쉬운 geom_tile 함수가 있다. 괜히 어렵게 구현했나 싶긴하다고 잠깐 생각이 들긴 했으나, 데이터를 그에 맞춰서 구조를 짜서 만드는 법은 계속 늘고 있는 듯 하다. 

 

ggplot2 - 격자모양 그래프 만들기

ggplot2 로 격자모양의 그래프를 만들어보는 과정을 포스팅한다. 가로10, 세로10개 총100개의 네모를 데이터의 각 비중을 나타낼 수 있도록 그래프로 표현해봤다. 기본적으로 막대그래프를 그리되,

emflant.tistory.com

어쨋든 오늘 만들어볼 그래프는 아래 그래프를 따라해볼 예정이다. github 페이지를 가지고 있는 사람이라면 익숙한 그래프 일텐데, 얼마나 자주 github 에 push 를 했는지 알 수 있는 그래프이다. y 축은 일~토 까지 요일이고, x축은 주단위라고 보면된다. 주목할 건 월단위로 라벨을 표시했다는 걸 따라해볼 예정이다. 

 

ggplot 으로 어느정도 만들수 있을까. 아래가 최종 결과물이다. 색은 좀 다르고, 정사각형마다 약간씩 라운딩처리를 못한거 빼고는 비슷하게 구현한듯 하다. 비슷하게 만들어보자.

 

데이터를 셋팅한다. 저 네모 하나하나가 뜻하는건 결국은 date 일자이다. 2021-12-26부터 2022-07-30까지 데이터를 만들고, 일요일부터 주를 인식하기 위해서 sun_date 를 만들고 cumsum 을 이용해서 주(week) 데이터를 만든다. 그리고 일월화수목금토를 y 축으로 잡아야하기때문에, 숫자로 요일정보를 추가했다. 마지막으로 타일(tile)별로 색깔을 다르게 해주기 위한 난수를 추가한다.

tibble(date = seq.Date(ymd("2021-12-26"), ymd("2022-07-30"), by = "day"),
       wday = wday(date, label = T, abbr = T)) %>% 
  mutate(sun_date = ifelse(wday == "Sun", 1, 0)) %>% 
  mutate(x = cumsum(sun_date)) %>% 
  mutate(y = wday(date),
         z = rnorm(n()))

# A tibble: 217 × 6
   date       wday  sun_date     x     y      z
   <date>     <ord>    <dbl> <dbl> <dbl>  <dbl>
 1 2021-12-26 Sun          1     1     1  0.735
 2 2021-12-27 Mon          0     1     2  0.405
 3 2021-12-28 Tue          0     1     3  1.59 
 4 2021-12-29 Wed          0     1     4 -0.104
 5 2021-12-30 Thu          0     1     5 -1.12 
 6 2021-12-31 Fri          0     1     6  0.573
 7 2022-01-01 Sat          0     1     7  1.41 
 8 2022-01-02 Sun          1     2     1  1.42 
 9 2022-01-03 Mon          0     2     2  0.767
10 2022-01-04 Tue          0     2     3 -2.93 
# … with 207 more rows

 

이렇게 데이터가 준비되었으면 그래프를 만들어본다.  x,y 축 셋팅하고 fill 로 타일색상을 지정하면 아래의 그림이 나온다.

ggplot(tb1, aes(x, y, fill = z)) +
  geom_tile()

반응형

타일별로 간격을 조금 띄워주고, x 축과 y축을 비율대로 고정하는걸 추가한다.(coord_fixed) 이제 어느정도 원하는 모양으로 구색을 갖춘 듯 하다.

ggplot(tb1, aes(x, y, fill = z)) +
  geom_tile(width = 0.8, height = 0.8) +
  coord_fixed()

 

y 축 라벨을 직접 지정한다. 보통 scale_y_continuous 를 사용하지만, 이번엔 scale_y_reverse 로 지정했다 왜냐면, 1:일요일~7:토요일로 숫자가 되있다보니, 역순으로 y 축을 뒤집어야 한다. 그 외 사용법은 동일하다.

ggplot(tb1, aes(x, y, fill = z)) +
  geom_tile(width = 0.8, height = 0.8) +
  coord_fixed() +
  scale_y_reverse(breaks = c(2,4,6),
                  labels = c("Mon", "Wed", "Fri"))

 

x축은 아래쪽이 아니라 윗쪽에 라벨이 위치해 있어야 한다. position = "top" 으로 지정하면 되고, 어느정도 준비가 끝난 듯 하다.

ggplot(tb1, aes(x, y, fill = z)) +
  geom_tile(width = 0.8, height = 0.8) +
  coord_fixed() +
  scale_y_reverse(breaks = c(2,4,6),
                  labels = c("Mon", "Wed", "Fri")) +
  scale_x_continuous(breaks = tb1_x_breaks,
                     labels = month.abb[1:length(tb1_x_breaks)],
                     position = "top")

 

 

마지막으로 디자인을 정리하면, 아래와 같이 만들 수 있다. 여기서 ggplot2 가 아닌, 포토샾이나 어피니티포토 등의 이미지 툴을 이용한다면 종이질감이 나는 그래프도 완성해볼 수 있다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함