티스토리 뷰
얼마전에 격자모양 그래프를 만들어보았는데, geom_col 함수가 아니라 더 쉬운 geom_tile 함수가 있다. 괜히 어렵게 구현했나 싶긴하다고 잠깐 생각이 들긴 했으나, 데이터를 그에 맞춰서 구조를 짜서 만드는 법은 계속 늘고 있는 듯 하다.
어쨋든 오늘 만들어볼 그래프는 아래 그래프를 따라해볼 예정이다. 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
- 막대그래프
- 아이맥
- ggplot
- eclipse
- ipTIME
- vagrant
- javascript
- 마인크래프트
- 도넛차트
- heroku
- SVN
- github
- MySQL
- ktm모바일
- Spring
- python
- ggplot2
- R
- 맥북
- ubuntu
- Oracle
- 알뜰요금제
- 이클립스
- MyBatis
- java
- Google Chart Tools
- 자급제폰
- MongoDB
- 셀프개통
- docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |