ggplot2를 이용한 기본적인 선그래프 그리기

ggplot2 를 이용해서 가장 기본적인 선그래프(라인그래프)를 그리는 방법을 정리해본다. 선그래프를 그리는 방법은 생각보다는 쉽지 않다. 소스 단 1줄로도 그릴 수 있지만, 사용하는 데이터의 구조와 필드들을 이해하고 제대로 함수를 사용해야만 그려진다.

데이터 이해하기

이 포스팅에서 사용할 데이터는 여기를 클릭하여 다운로드 받는다. 다운받은 파일은 readr 패키지를 이용하여 읽어서 변수에 저장한다. print 해서 보면, 3가지 필드로 이루어져 있음을 알 수 있다. name 필드는 년도와 월을 나타내며, 22.1~10월까지 10개월치의 데이터가 있음을 알 수 있다. value는 숫자형으로 그래프에서 나타낼 y축위치의 값이다. 마지막으로 x는 그냥 행마다 번호를 하나 부여해놨다.

tb2 = readr::read_csv("data.csv")
tb2 %>% print(n = Inf)

# A tibble: 10 × 3
   name   value     x
   <chr>  <dbl> <dbl>
 1 x22_1  21727     1
 2 x22_2  25254     2
 3 x22_3  27974     3
 4 x22_4  27180     4
 5 x22_5  27375     5
 6 x22_6  27910     6
 7 x22_7  31284     7
 8 x22_8  32722     8
 9 x22_9  41604     9
10 x22_10 47217    10

선그래프 기본 그리기

ggplot2 패키지를 이용해서 차트를 그릴때 가장먼저하는 것은 ggplot 함수에 데이터와, x/y 축에 바인딩될 필드를 셋팅하는 것이다. 이해를 돕기 위해 case1과 case2 의 소스를 준비해봤다. case1의 소스처럼 수행해도 되고, 아니면 case2 처럼 함수 입력변수명을 생략해도 된다. 두 케이스 동일한 결과를 나타낸다. ggplot 함수에 입력을 하고나면, 사실상 geom_line 함수에는 별다른 입력을 하지 않아도 그래프가 그려진다.

여기서 주목할 것은 aes 함수의 x축으로 설정되는 데이터 필드의 형식이 중요하다. 무조건 숫자형 혹은 날짜형(date)으로 셋팅하는 것을 권장한다. 숫자형인 1~10 으로만 되어 있던 x 필드를 셋팅하면 아래와 같이 선그래프가 쉽게 만들어진다.

# case1
ggplot(data = tb2, mapping = aes(x = x, y = value)) +
  geom_line()

# case2
ggplot(tb2, aes(x, value)) +
  geom_line()

그러나, 잘모르고 문자열 필드를 x축에 셋팅하게 되면 아래와 같은 에러메시지를 볼 수 있다.

ggplot(tb2, aes(name, value)) +
  geom_line()

# error 발생
"geom_path: Each group consists of only one observation.
Do you need to adjust the group aesthetic?"

그러나 문자열 필드로 셋팅하더라도 그려지게는 할 수 있다. group = 1 를 추가로 셋팅하면 아래의 그림처럼 그래프가 그려진다. 근데 그래프를 자세히 보니, x축의 순서가 이상하다. x22-1 부터 10까지 순차적이었으면 했는데, x22_1 뒤에 x22_10 가 위치되면서 그래프 모양이 잘못되었다.

ggplot(tb2, aes(name, value, value, group = 1)) +
  geom_line()

잘못되긴 했어도, 다시 정렬할 방법은 있다. reorder 함수를 이용해서 바로잡을 수도 있다. 자세한 방법이 궁금하면 여기를 클릭해서 참고. 이렇다보니 문자열로 x축을 셋팅하는건 그다지 좋은 선택지가 아니다.

ggplot(tb2, aes(reorder(name, x), value, group = 1)) +
  geom_line()

colour

선그래프에 색상을 설정하는 건 colour 혹은 color 을 이용해서 셋팅이 가능하다.

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "blue")

“blue” 같은 문자열은 어떻게 알고 사용할 수 있는걸까. colors() 를 실행해보면, 사용할 수 있는 색상문자열 리스트를 볼 수 있다. 이중에 골라서 쓰면 되고, 너무 많아서 일부만 표시해봤다.

colors()
  [1] "white"                "aliceblue"            "antiquewhite"        
  [4] "antiquewhite1"        "antiquewhite2"        "antiquewhite3"       
  [7] "antiquewhite4"        "aquamarine"           "aquamarine1"         
 [10] "aquamarine2"          "aquamarine3"          "aquamarine4"         
 [13] "azure"                "azure1"               "azure2"              
 [16] "azure3"               "azure4"               "beige"               
 [19] "bisque"               "bisque1"              "bisque2"             
 [22] "bisque3"              "bisque4"              "black"         
...(중략)...
[643] "violetred2"           "violetred3"           "violetred4"          
[646] "wheat"                "wheat1"               "wheat2"              
[649] "wheat3"               "wheat4"               "whitesmoke"          
[652] "yellow"               "yellow1"              "yellow2"             
[655] "yellow3"              "yellow4"              "yellowgreen" 

물론, 해시값으로도 색상을 셋팅할 수 있다.

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "#EB6440")

size - 굵기 설정

선의 굵기는 size 로 조정하면 된다.

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "#EB6440", size = 3)

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "#EB6440", size = 10)

alpha - 투명도 설정

선그래프의 투명도도 조절할 수 있다.

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "#EB6440", size = 3, alpha = 0.2)

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "#EB6440", size = 3, alpha = 0.5)

ggplot(tb2, aes(x, value)) +
  geom_line(colour = "#EB6440", size = 3, alpha = 0.8)


더 보면 좋을 글들