본문 바로가기

정리/데이터 분석

[R] ggplot2 그래프 겹치기.

728x90
ggplot2-2plot

본 포스팅에서는 ggplot2를 이용해 2개의 plot을 겹쳐 그리려 합니다.

아래와 같이 데이터 생성 및 변환을 위해 library를 추가해 줍니다.


 설명을 덧붙이자면 dplyr 은 %>% chaining operation을 위해 추가했습니다. 


reshape 는 melt, cast 함수로 데이터 변환을 편하게 하기 위해 추가했습니다. 

changepoint 는 cpt.mean cpt.var 등의 함수로 통계적인 change point 를 선별해 냅니다. 단 한개만 찾을 수도 있고 최대 개수를 지정할 수 있습니다. 

TTR은 Moving Standard Deviation 을 간단히 계산해줄 수 있는 runSD 함수를 포함하고 있습니다.

 ggplot2는 그래프 시각화 패키지입니다.

# 0. set-----------------------------------------------
library(dplyr)
library(reshape)
# install.packages("changepoint")
library(changepoint)
library(TTR)
library(ggplot2)



다음은 100점 점수 변환, 가상 sample 데이터를 생성하는 과정입니다. scale을 써서 더 간단히 변환할 수 있고 sample 을 써서 더 다양하게 생성해 낼 수 있지만 그냥 만들어 봤습니다.

# 1. virtual input--------------------------------------------------------------
values<-rnorm(40, mean=0, sd = 1) %>%{. - min(.)} %>% { c(.)/max(.)} *100
inputs<-data.frame(tgt_id=rep("4SD",40), parameter=c(rep("var1",20),rep("var2",20)), value=values, step_id=c(1:20, 1:20), stringsAsFactors = F)



다음은 runSD를 돌려 Moving SD를 생성하는 과정입니다.

runSD(x=, n=) 함수의 parameter중 n 은 붙어있는 몇개의 input의 개수로 편차를 계산하는지 설정하는 값입니다.

여기서 runSD의 n 을 4로 뒀기 때문에 inputs$runSD[1:3] 값은 NA 가 됩니다.

이를 버릴 수는 없어서 표준편차로 na 값을 교체해줍니다. (na.replace 라는 메소드도 있긴한데 사용하지 않았습니다.)

inputs$value<-scale(inputs$value)
inputs[["runSD"]]<-inputs %>%
  group_by(tgt_id, parameter, step_id) %>%
  {runSD(x={.$value}, n=4)}
inputs$runSD[is.na(inputs$runSD)]<-sd(inputs$value)



다음은 plot 을 겹치는 과정 입니다.

보시다시피 ggplot() 을 시작으로 연이어 그릴 때는 ggplot()을 다시 사용할 수 없습니다.

inputs 에 value , runSD 라는 컬럼이 존재하여 처음엔 파란색의 value 값을 그려주고

geom_line 으로 마지막에 runSD 를 빨간색으로 그려줍니다.

gg<-ggplot(inputs, aes(x=1:nrow(inputs), y=value) )
gg+geom_line(color="blue")+geom_line(aes(x=1:nrow(inputs),y=runSD), color="red")

이 다음 작업은 changepoint 를 찾아내는 겁니다.

cpt.var 사용법은 단순 합니다. Q 는 최대 change point 개수를 의미 합니다. 그리고 data 로 change point 를 찾아냅니다.

상세한 사용방법은 help(cpt.var) 로 볼 수 있습니다.  기대한 만큼의 정화도는 나오지 않고 있습니다.

cpcp<-cpt.var(inputs$runSD, Q=1)  ## 맥시멈 1

gg<-ggplot(inputs, aes(x=1:nrow(inputs), y=value) )
gg+geom_line(color="blue")+
  geom_line(aes(x=1:nrow(inputs),y=runSD),color="red")+geom_vline(xintercept =cpcp@cpts , color="green", cex=1)