ggplot2 선그래프에 보조선 그리기

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))

불필요한 부분을 지워서 정리하면 끝.


더 보면 좋을 글들