使用ggplot,如何自动设置时间序列图的x轴?

时间:2010-02-08 04:44:44

标签: r ggplot2

有没有办法使用自动设置时间轴的ggplot绘制类“ts”的单变量时间序列?我想要类似于plot.ts()的基本图形。

在我看来,最粗糙的时间粒度是一天。是对的吗?在我的工作中,我必须处理月度和季度数据,并将每个观测值分配到月/季度的开头/结尾将导致观测值水平不规则地间隔,因为月/季度的长度不等。这可能更有意义,但我的观众习惯于定期看几个月/四分之一。

我知道我可以通过手动将x轴设置为时间轴或使用我自己的标签设置为数字轴来解决上述所有问题。我特意寻找一种方法,通过使用ts对象中的时间信息自动执行此操作。

4 个答案:

答案 0 :(得分:4)

ggplot2不支持ts对象:仅支持类日期的日期和类POSIXct的时间。因此,您需要先将数据转换为合适的类。

请查看http://had.co.nz/ggplot2/scale_date.html示例。

答案 1 :(得分:4)

我粗略尝试从ts对象生成POSIX日期的函数,假设周期为年:

tsdates <- function(ts){
  dur<-12%/%frequency(ts)
  years<-trunc(time(ts))
  months<-(cycle(ts)-1)*dur+1
  yr.mn<-as.data.frame(cbind(years,months))
  dt<-apply(yr.mn,1,function(r){paste(r[1],r[2],'01',sep='/')})
  as.POSIXct(dt,tz='UTC')
}

这可以与ggplot一起使用:

qplot(tsdates(presidents),presidents,geom='line')

更完整的解决方案需要能够布置多个时间序列。此外,能够根据观察时间自动对齐点数,这样我们可以做以下事情:

qplot(presidents,lag(presidents))

答案 2 :(得分:2)

来自?ts示例的时间序列数据。

gnp <- ts(cumsum(1 + round(rnorm(100), 2)), start = c(1954, 7), frequency = 12)

new.date <- seq(as.Date(paste(c(start(gnp),1), collapse = "/")), by = "month", length.out = length(gnp))

seq函数可以使用日期对象。上面的示例提供了开始日期,指定了每月频率并表示要创建的日期向量的长度。

希望在使用ggplot2或其他内容之前,这有助于您的数据准备。

您可以将上面的示例组合到data.frame中,如下所示:

dat <- data.frame(date=new.date, value=gnp) 

这可以在ggplot中绘制,如下所示:

ggplot(data=dat) + geom_line(aes(date, gnp))

一切顺利,

答案 3 :(得分:0)

这个怎么样?


代码


set.seed(12345)
dat <- ts(data=runif(n=10, min=50, max=100), frequency = 4, start = c(1959, 2))
df <- data.frame(date=as.Date(time(dat)), Y=as.matrix(dat))
library(ggplot2)
ggplot(data=df, mapping=aes(x=date, y=Y))+geom_point()

输出


enter image description here