ggplot2 를 이용해서 여러 유형의 그래프를 그릴수가 있다. 일부 제약은 있겠지만, 대부분의 그래프를 흉내낼수 있을 정도의 기능은 이미 다 있다. 이번에는 선그래프인데, x축까지 점선으로 보조선이 연결되있는 아래와 같은 그래프를 그려볼까한다. (ggplot2 로 만든 이미지이다.)
데이터 만들기
사용한 데이터는 기업대출 규모를 나타낸 수치였으며, 별도 엑셀파일 없어서 눈으로 그냥 타이핑해서 아래와 같이 억지로 만들었다. tidyverse
가 아니더라도 본인이 편한 데이터 변환방법을 사용하면 된다. x 와 y 값은 그래프에서 각 포인트의 좌표가 될것이며, x_label 과 y_label 은 텍스트를 셋팅하기위한 보조적인 정보이다.
library(tidyverse)
tb1 = tibble(x = 1:6,
y_text = c("635.8878", "648.7020", "660.5558",
"673.7552", "687.4270", "703.7512"),
x_label = c("'21년\n 12월", "'22년\n 2월", "4월", "6월", "8월", "10월")) %>%
mutate(y = as.numeric(y_text)) %>%
mutate(y1 = str_replace(y_text, "\\.", "조\n")) %>%
mutate(y2 = str_c(y1, "억")) %>%
select(x, y, y_label = y2, x_label)
# A tibble: 6 × 4
x y y_label x_label
<int> <dbl> <chr> <chr>
1 1 636. "635조\n8878억" "'21년\n 12월"
2 2 649. "648조\n7020억" "'22년\n 2월"
3 3 661. "660조\n5558억" "4월"
4 4 674. "673조\n7552억" "6월"
5 5 687. "687조\n4270억" "8월"
6 6 704. "703조\n7512억" "10월"
그래프 그리기
우선 선그래프를 그려본다. 그려보면 알겠지만, 수치들이 거의 비례하는지 거의 일직선처럼 보인다.
ggplot(tb1, aes(x,y)) +
geom_line()
이렇게 되면 구분이 안되니 geom_point
로 포인트를 추가한다.
ggplot(tb1, aes(x,y)) +
geom_line() +
geom_point()
각 포인트에서 x축까지 보조선을 내려서 그린다. 이때 사용하는게 geom_segment
함수를 이용해서 그릴수 있고, x, xend, y, yend
값을 바인딩하면 된다. 쉽게 생각해서, (x,y)
에서 (xend, yend)
좌표간에 선을 그려주는 함수라고 생각하면 된다. linetype
도 설정하면 점선 등으로 셋팅이 가능하다. 자세한 내용은 여기를 클릭한다.
ggplot(tb1, aes(x,y)) +
geom_line() +
geom_point() +
geom_segment(aes(x = x, y = y, xend = x, yend = 620),
linetype = "dotted")
마지막으로 수치를 각 포인트위에 표시해준다. \n
으로 개행문자를 넣어줘서 2줄로 텍스트 표시되도록 한다. 한글이 들어가다보니 폰트지정을 해줬고, vjust
로 위치조정을 했다.
ggplot(tb1, aes(x,y)) +
geom_line() +
geom_point() +
geom_segment(aes(x = x, y = y, xend = x, yend = 570),
linetype = "dotted") +
geom_text(aes(label = y_label), vjust = -0.6,
family = "NanumGothicExtraBold") +
lims(x = c(0.5, 6.5), y = c(570, 800))
불필요한 부분을 지워서 정리하면 끝.