3

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

在我看来,最粗略的时间粒度是一天。那正确吗?在我的工作中,我必须处理月度和季度数据,并且将每个观察值分配到月/季度的开始/结束会导致观察值在水平方向上不规则地间隔,因为月/季度的长度不相等。这可能更有意义,但我的观众习惯于看到有规律的月份/季度。

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

4

4 回答 4

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))
于 2010-02-09T03:54:17.353 回答
4

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

看看http://had.co.nz/ggplot2/scale_date.html的例子。

于 2010-02-08T11:00:02.647 回答
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))

一切顺利,

周杰伦

于 2010-02-09T21:27:04.047 回答
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()

输出


在此处输入图像描述

于 2014-08-17T20:11:06.500 回答