2013-12-10 4 views
2

I가 다음과 같은 데이터 집합 (Bu.Dis) : 시계열로 플롯 ggplot를 사용ggplot2, 시계열 및 Changepoint는 패키지

row.names Date  DIS 
    116  1Q1 0.1120 
    117  1Q2 0.1104 
    118  1Q3 0.3794 
    119  1Q4 0.3983 
    120  2Q1 0.3175 
    121  2Q2 0.2275 
    122  2Q3 0.2171 
    123  2Q4 0.1973 
    124  3Q1 0.2499 
    125  3Q2 0.1819 
    126  3Q3 0.2613 
    127  3Q4 0.2302 
    128  4Q1 0.3795 
    129  4Q2 0.2406 
    130  4Q3 0.2486 
    131  4Q4 0.2464 

매우 간단합니다 :

require(ggplot2) 
Bu.Dis["Date"] <- NA 
Bu.Dis$Date <- seq(as.Date("2001/1/1"), as.Date("2004/12/31"), by = "3 months") 
ggplot(Bu.Dis, aes(Date, DIS))+geom_line()+ 
    theme(legend.position = "none", panel.background = element_rect(fill = "#FFFFFF", colour="#000000"), 
    panel.grid.major = element_line(colour = "grey", linetype = "dotted")) 

그러나, changepoint 패키지를 사용하려고하면 dataframe을 timeseries 벡터로 변환해야합니다.

Bu.Dis.ts <- ts(Bush.Dis[,2], c(2001, 1), frequency = 4) 
var.Bu.Dis=cpt.var(Bu.Dis.ts, method="PELT") 
plot(var.Bu.Dis) 

이 벡터를 "plot"으로 플로팅하는 것도 꽤 쉽지만 ggplot을 사용하고 싶습니다. 문제는 var.Bu.Dis가 S4 객체라는 것입니다. 이 S4 객체를 ggplot으로 어떻게 그립니 까?

그런데 "Date"의 항목을 timeseries 호환 날짜 형식 (2001-1 또는 2001-Q1과 같은 1/4 형식)으로 변환하는 더 쉬운 방법이 있습니까?

답변

1

나는이 질문에 혼자서 대답했다고 생각한다. (최소한 내가 가진 대부분의 문제) : ggplot은 TS 데이터를 플로팅 할 수 없다. 그래서 당신은 그것을 변형시켜야합니다.

ggplot(melt(data.frame(time=as.numeric(time([email protected])), [email protected]), id.vars="time"), aes(time, value)) + 
    geom_line() + 
    geom_vline(xintercept = cpts.ts(var.Bu.Dis), colour="red", linetype = "dotdash") 

geom_vline은 "변경 지점"을 그리는 데 사용됩니다.

하지만이 메시지가 계속 얻을 : 를

". 자동 연속을 디폴트 타입 TS의 객체의 크기를 선택하는 방법을 알고하지 마십시오"하지만 한 가지 문제가 남아 여전히 존재 : 을 x 축에서 , 단지 몇 년이 표시되지만 쿼터는 표시되지 않습니다. 어떻게 바꿀 수 있습니까?

1

나는 ggplot2에 TS 개체를 구문 분석 할 수있는 ggfortify을 보일 것이다 http://rpubs.com/sinhrks/plot_ts

ggfortify에 대한 또 다른 좋은 점은 시계열 통계를 지원한다는 것입니다 : http://rpubs.com/sinhrks/plot_tsstats

는 년 분기로 날짜 필드의 서식을 지정하려면 다음을 시도하십시오.

library(zoo) 
yq <- as.yearqtr(Bu.Dis$Date, format = "%Y/%m/%d") 
format(yq, format = "%Y-0%q") 

조합하면 필요한 것을 얻을 수 있습니다. 분기마다 여러 번 관찰을한다고 가정하면 stat_summary()를 사용하여 일부 집계를 수행해야 할 수 있습니다.

건배,

아담