ggplot2 에는 주식차트로 흔하게 쓰이는 캔들차트 함수가 따로 없다. 알아서 네모난 모양과 세로선 하나를 조합해서 캔들차트로 만들어야 한다. 그리 어렵진 않으나, 한번에 만드는 함수가 있으면 좋을 거 같긴한데, 이제껏 없는거 보면 알아서 잘 조합해서 사용하라는 거 같다.
데이터 가져오기
investing.com 에서 종목코드를 가지고 조회하면 쉽게 하이닉스 주가 정보를 다운받을 수 있다. 그 데이터를 가지고 약간의 가공을 통해 읽어들인다. up_yn 은 시가보다 종가가 올랐는지 여부를 저장해서 추후에 색을 셋팅할때 활용한다. 그리고 nrow 는 데이터가 영업일 내역만 있다보니, 차트를 만들때, 1,2,3…n 순번을 지정하고, x 축을 숫자에 기반해 그리려고 한다. 만약 x축을 날짜 데이터로 이용한다면, 중간중간 비영업일이 비어서 표시되는 상황이 발생한다.
dt_anystock = read_csv('./data/SK Hynix Inc Stock Price History.csv', show_col_types = F) |>
clean_names() |>
mutate(date = mdy(date)) |>
arrange(date) |>
mutate(up_yn = open <= price, nrow = row_number())
price 는 종가, open 은 시가, high 는 최고가, low 는 최저가 이다.
> dt_anystock |> head()
# A tibble: 6 × 9
date price open high low vol change_percent up_yn nrow
<date> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <lgl> <int>
1 2026-04-06 886000 877000 901500 869000 3.00M 1.14% TRUE 1
2 2026-04-07 916000 917000 933000 888000 3.30M 3.39% FALSE 2
3 2026-04-08 1033000 1007000 1056000 992000 6.60M 12.77% TRUE 3
4 2026-04-09 998000 1015000 1025000 990000 4.34M -3.39% FALSE 4
5 2026-04-10 1027000 1030000 1042000 1024000 3.04M 2.91% FALSE 5
6 2026-04-13 1040000 999000 1043000 996000 2.77M 1.27% TRUE 6
주식차트 만들기
주식차트는 캔들모양의 차트인데, 우선 직사각형의 모양이 필요하다. geom_rect 함수를 사용하며, 시가와 종가를 이용하여 그리면 된다. 그리고 xmin, xmax 에 0.3 을 각각 더하거나 빼고 있는데, 아까 x축의 값이 nrow 값, 즉 1,2,3…n 자연수로 되있기 때문에, 사각형 두께를 0.6 정도로 셋팅했다고 보면된다. 더 넓게, 더 좁게 셋팅하려면 저 숫자를 줄이거나 늘이면 된다.
ggplot(data = dt_anystock) +
geom_rect(aes(xmin = nrow - 0.3, xmax = nrow + 0.3,
ymin = open, ymax = price, fill = up_yn)) +
theme_bw()
최고가, 최저가를 잇는 선이 필요하다. 그 부분은 geom_segment 함수를 이용한다.
ggplot(data = dt_anystock) +
geom_rect(aes(xmin = nrow - 0.3, xmax = nrow + 0.3,
ymin = open, ymax = price, fill = up_yn)) +
geom_segment(aes(x = nrow, xend = nrow,
y = low, yend = high)) +
theme_bw()
x축 레이블 표시를 날짜로 해주는 것까지하면 거의 끝이다.
ggplot(data = dt_anystock) +
geom_rect(aes(xmin = nrow - 0.3, xmax = nrow + 0.3,
ymin = open, ymax = price, fill = up_yn)) +
geom_segment(aes(x = nrow, xend = nrow,
y = low, yend = high, colour = up_yn)) +
scale_x_continuous(labels = label_date_short()(dt_anystock |> pull(date)),
breaks = dt_anystock |> pull(nrow)) +
theme_bw()
마지막으로 scale_fill_manual, scale_colour_manual 를 이용하여 약간의 디자인과 색상을 덧붙이면 아래와 같이 완성.