금융데이터의 경우 영업일 데이터만 있는 csv, excel 파일들이 대부분이다. 이런 경우, 날짜 형식으로 변환해서 선그래프를 그리다보면, 토/일/휴일 같은 날짜도 x축에서 출력되다보니, 약간은 왜곡된 그래프로 보이게 된다. 물론 5년치 이런 데이터는 괜찮지만, 1달이내 그래프를 그리면 비영업일은 빼고 그래프를 표현하고 싶어진다.
데이터 가져오기
현재 데이터는 금융투자협회 투자자예탁금 현황 데이터를 가져왔다. 보면알겠지만, date에는 휴일은 빠져있다.
> tb_deposit
# A tibble: 20 × 2
date amt
<date> <dbl>
1 2026-03-26 111579004
2 2026-03-27 112837249
3 2026-03-30 111074174
4 2026-03-31 110288948
5 2026-04-01 111676635
6 2026-04-02 108573983
7 2026-04-03 109016507
8 2026-04-06 107467398
9 2026-04-07 108921448
10 2026-04-08 109833228
11 2026-04-09 112807019
12 2026-04-10 115364212
13 2026-04-13 116107492
14 2026-04-14 117672486
15 2026-04-15 117165120
16 2026-04-16 119074288
17 2026-04-17 120585455
18 2026-04-20 121817265
19 2026-04-21 121286062
20 2026-04-22 122538133
영업일/비영업일 상관없이 다 포함.
데이터는 영업일만 있긴하지만, 그냥 그래프를 그리면 데이터가 없는 비영업일이 중간중간 끼다보니 아래와 같이 약간 완만한 구간이 생길수 밖에 없다.
ggplot(tb_deposit, aes(x = date, y = amt)) +
geom_area(fill = "#BCBDDC", colour = "#6A51A3", alpha = 0.3) +
coord_cartesian(ylim = c(104000000, 126000000)) +
theme_bw()
영업일만 표현
그냥 데이터에 있던 일자들만 표현할 수 있다. date 형을 문자열로 변환하면 된다. 다만, 이렇게 하면서 조금 귀찮아지는 것들이 생긴다.
tb_deposit2 = tb_deposit |>
mutate(date2 = as.character(date))
문자열이다보니 모든 날짜가 x축에 나오다보니, 조금 포맷을 줄여서 일자만 나오도록 scale_x_discrete를 추가한다.
ggplot(tb_deposit2, aes(x = date2, y = amt, group = 1)) +
geom_area(fill = "#BCBDDC", colour = "#6A51A3", alpha = 0.3) +
coord_cartesian(ylim = c(104000000, 126000000)) +
scale_x_discrete(labels = label_date_short()(tb_deposit2 |> pull(date))) +
theme_bw()
label 표현 주기 변환하기
매일 나오게 하는 거보다 특정요일에만 날짜 표시하게끔 하나 기능을 추가할 수도 있다. wday() 함수를 이용해서 특정 요일만 filter 한 데이터를 이용하면 된다.
tb_breaks = tb_deposit2 |>
mutate(wday = wday(date), nrow = row_number()) |>
filter(wday == 4)
scale_x_discrete 함수를 이용하면 특정요일만 label 이 생기는걸 볼 수 있다. label_date_short 함수는 연도가 바뀔때, 달이 바뀔때마다 년/월 표시가 표시되도록 지원하는 함수이니 참고한다.
ggplot(tb_deposit2, aes(x = date2, y = amt, group = 1)) +
geom_area(fill = "#BCBDDC", colour = "#6A51A3", alpha = 0.3) +
coord_cartesian(ylim = c(104000000, 126000000)) +
scale_x_discrete(labels = label_date_short()(tb_breaks |> pull(date)),
breaks = tb_breaks |> pull(date2)) +
theme_bw()
요일 상관없이 특정 일수마다 표시
3일마다 표시하고싶다면, seq 함수를 이용해서 인덱스를 구하고 그걸 벡터에 대입하면 3일마다의 날짜만 추출할 수 있다. rev 로 하는 이유는 이 벡터의 순서대로 label_date_short 에 적용되다보니, 다시 원래 순서대로 수정해주기 위함이다.
my_breaks = tb_deposit2$date2[seq(length(tb_deposit2$date2),1, by = -3)] |>
rev()
# [1] "2026-03-27" "2026-04-01" "2026-04-06" "2026-04-09" "2026-04-14" "2026-04-17" "2026-04-22"
ggplot(tb_deposit2, aes(x = date2, y = amt, group = 1)) +
geom_area(fill = "#BCBDDC", colour = "#6A51A3", alpha = 0.3) +
coord_cartesian(ylim = c(104000000, 126000000)) +
scale_x_discrete(labels = label_date_short()(ymd(my_breaks)),
breaks = my_breaks) +
theme_bw()