ggplot2,时间序列和变更点包

时间:2013-12-10 08:11:40

标签: r ggplot2 time-series

我有以下数据集(Bu.Dis):

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

使用ggplot将其绘制为时间序列非常简单:

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包时,我必须将数据帧转换为时间序列向量。

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)

用“情节”绘制这个矢量也很容易,但我想用ggplot来做。问题是,var.Bu.Dis是一个S4对象。如何用ggplot绘制这个S4对象?

顺便说一句,是否有更简单的方法将“日期”中的条目转换为时间序列兼容的日期格式(最好是像2001-1或2001-Q1那样的四分之一格式)?

2 个答案:

答案 0 :(得分:1)

我想我自己回答了这个问题(至少我遇到的大多数问题): ggplot无法绘制ts数据。所以你必须改变它。

ggplot(melt(data.frame(time=as.numeric(time(var.Bu.Dis@data.set)), var.Bu.Dis@data.set), 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 :(得分:1)

我会查看ggfortify,它可以将ts对象解析为ggplot2: 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()进行一些聚合。

干杯,

亚当