[R] ggplot2 시계열 그래프에 세로선 추가하기 (adding vertical line to time-series plot using R ggplot2) : geom_vline()
R 분석과 프로그래밍/R 그래프_시각화 2017. 6. 10. 23:53(X축) 시간의 흐름에 따른 (Y축) 값의 추세, 변화 분석 및 탐색을 하는데 시계열 선 그래프(time series plot, line graph)를 많이 이용합니다.
이번 포스팅에서는 R ggplot2 패키지로 시계열 선그래프를 그리고, 거기에 세로선을 추가하는 작업을 해보겠습니다.
ggplot2 에서 세로선을 추가할 때 geom_vline() 함수를 사용하는데요, 이게 시계열 데이터의 경우는 as.numeric() 함수를 사용해서 시계열 데이터를 숫자형 데이터로 변환을 해주어야 에러가 안나고 제대로 세로선이 그려집니다.
이거 몰라서 한참을 구글링하면서 애 좀 먹었습니다. ^^;
간단한 시계열 데이터를 만들어서 예를 들어보겠습니다.
> ##====================================================== > ## adding multiple vertical lines at time-series plot using R ggplot2 > ##====================================================== > > # making time series data > dt <- c("20170609100000", "20170609100100", "20170609100200", + "20170609100300", "20170609100400", "20170609100500") > val <- c(5.2, 3.4, 3.9, 6.3, 4.7, 5.6) > > dt_val <- data.frame(dt, val) > dt_val <- transform(dt_val, + dt = as.POSIXct(dt, + format = '%Y%m%d%H%M%S', + origin = "1970-01-01", + tz = "UTC")) > > dt_val dt val 1 2017-06-09 10:00:00 5.2 2 2017-06-09 10:01:00 3.4 3 2017-06-09 10:02:00 3.9 4 2017-06-09 10:03:00 6.3 5 2017-06-09 10:04:00 4.7 6 2017-06-09 10:05:00 5.6
|
R ggplot2 패키지의 geom_line() 함수를 사용해서 시계열 선그래프를 그려보겠습니다.
> # making time series plot > library(ggplot2) > > ggplot(dt_val, aes(x = dt, y = val)) + + geom_line(size=1, color = "blue") + + ggtitle("Time-series plot")
|
R ggplot2로 세로선을 추가할 때는 geom_vline(xintercept = x) 함수를 추가해주면 됩니다. 하지만 xintercept 에 들어가는 값이 날짜, 시간 포맷의 데이터일 경우 아래 처럼 에러가 납니다.
> # To add vertical line at time series plot > # Error in Ops.POSIXt((x - from[1]), diff(from)) : '/' not defined for "POSIXt" objects > ggplot(dt_val, aes(x = dt, y = val)) + + geom_line(size = 1, color = "blue") + + geom_vline(xintercept = dt_val$dt[3], color = "red", linetype = 2) + + ggtitle("Adding vertical line at time-series plot using geom_vline()") Error in Ops.POSIXt((x - from[1]), diff(from)) : '/' not defined for "POSIXt" objects
|
R ggplot2 시계열 선그래프에 X축이 날짜, 시간 포맷의 시계열 데이터인 경우 특정 날짜/시간에 세로선을 추가하기 위해서는 as.numeric(x) 함수를 사용해서 숫자형 데이터로 포맷을 바꾸어 주어야 합니다.
> # Use as.numeric() function at xintercept > ggplot(dt_val, aes(x = dt, y = val)) + + geom_line(size = 1, color = "blue") + + geom_vline(xintercept = as.numeric(dt_val$dt[3]), color = "red", linetype = 2) + # as.numeric() transformation + ggtitle("Adding vertical line at time-series plot using geom_vline() and as.numeric() transformation")
|
만약 복수의 세로선을 추가하고 싶다면 아래의 예제를 참고하세요. 만약 3번째와 5번째 x변수의 날짜/시간에 세로선을 추가하고 싶다면 dataset$variable[c(3, 5)] 처럼 indexing을 해서 xintercept 에 넣어주면 됩니다.
(세로선 2개가 그려지기는 했는데요, 하단에 빨간색으로 "HOW_BACKTRACK environmental varialbe"이라는 경고메시지가 떴습니다. -_-; )
> # adding "Multiple" vertical lines > ggplot(dt_val, aes(x = dt, y = val)) + + geom_line(size = 1, color = "blue") + + geom_vline(xintercept = as.numeric(dt_val$dt[c(3,5)]), color = "red", linetype = 2) + + ggtitle("Adding multiple vertical lines at time-series plot using geom_vline()") HOW_BACKTRACE environmental variable.
|
이번에는 세로선을 그릴 기준 날짜/시간 데이터를 다른 데이터프레임에서 가져와야 하는 경우를 예로 들어보겠습니다. 먼저 세로선의 기준이 되는 xintercept 에 들어갈 날짜/시간 정보가 들어있는 data frame 을 만들어보죠.
> # adding multiple vertical lines with another data frame > dt_2 <- c("20170609100150", "20170609100430") > val_2 <- c("yes", "yes") > dt_val_2 <- data.frame(dt_2, val_2) > dt_val_2 <- transform(dt_val_2, + dt_2 = as.POSIXct(dt_2, + format = '%Y%m%d%H%M%S', + origin = "1970-01-01", + tz = "UTC")) > dt_val_2 dt_2 val_2 1 2017-06-09 10:01:50 yes 2 2017-06-09 10:04:30 yes
|
R ggplot2 시계열 선그래프를 그린 원본 데이터프레임(아래 예제에서는 dt_val)과는 다른 데이터프레임(아래 예제에서는 dt_val_2)의 날짜/시간 데이터를 사용해서 복수의 세로선을 그려보겠습니다. 두 개의 세로선이 그려지기는 했는데요, "HOW_BACKTRACE environmental variable"이라는 빨간색 경고 메시지가 떴습니다. 그런데, 예전에는 에러 메시지 뜨면서 안그려졌었는데, 블로그 쓰려고 다시 해보니 그려지기는 하는군요. ^^;
> # time series plot with multiple vertical lines from another data frame > ggplot(dt_val, aes(x = dt, y = val)) + + geom_line(size = 1, color = "blue") + + geom_vline(xintercept = as.numeric(dt_val_2$dt_2), color = "red", linetype = 2) + + ggtitle("Time-seires plot with multiple vertical line from another dataframe") HOW_BACKTRACE environmental variable. |
위의 예제처럼 했는데 혹시 Error: Aesthetics must be either length 1 or the same as the data (6): xintercept 와 같은 에러 메시지가 뜨고 그래프가 안그려진다면 아래처럼 geom_vline(data = dataframe, xintercept = ... ) 처럼 데이터를 가져오는 데이터프레임을 명시해주면 문제가 해결됩니다. 이걸 몰라서 또 한참을 고민하고, 구글링하고, 참 애먹었던 적이 있습니다. -_-;
> # time series plot with multiple vertical lines from another data frame(2) > ggplot(dt_val, aes(x = dt, y = val)) + + geom_line(size = 1, color = "blue") + + geom_vline(data = dt_val_2, xintercept = as.numeric(dt_val_2$dt_2), color = "red", linetype = 2) + + ggtitle("Time-series plot with multiple vertical lines from another dataframe 2")
|
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^
'R 분석과 프로그래밍 > R 그래프_시각화' 카테고리의 다른 글
클리브랜드 점 그래프 (KRUG 2017.11.18 주말 퀴즈) (2) | 2017.11.18 |
---|---|
[R] ggplot 그래프 크기 조정, 가로 세로 비율 조정 : coord_fixed(ratio = 2, 1, 0.5) (0) | 2017.09.09 |
[R] 간트 차트 (Gantt Chart) 그리기, Timeline 시각화 : timevis 패키지 (0) | 2017.05.29 |
[R] ggplot2 범례 위치 바꾸기, 범례 글자 크기 및 색깔 바꾸기, 범례 순서 바꾸기, 범례 없애기 (0) | 2017.05.27 |
[R ggplot2] R ggplot 배경을 흰색으로 바꾸기, x축 라벨 각도를 90도 돌리기, x축과 y축의 위치를 바꾸기 (10) | 2017.05.20 |