代码之家  ›  专栏  ›  技术社区  ›  Jyotirmoy Bhattacharya

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

  •  3
  • Jyotirmoy Bhattacharya  · 技术社区  · 14 年前

    是否有一种方法可以使用自动设置时间轴的ggplot绘制“ts”类的单变量时间序列?我想要类似于情节的东西。基本图形的ts()。

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

    我知道我可以通过手动将x轴设置为时间轴或带有自己标签的数字轴来解决上述所有问题。我特别想寻找一种方法,通过使用ts对象中的时间信息自动实现这一点。。

    4 回复  |  直到 14 年前
        1
  •  4
  •   learnr    14 年前

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

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

        2
  •  4
  •   Jyotirmoy Bhattacharya    14 年前

    我对从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))
    
        3
  •  2
  •   Jay    14 年前

    时间序列数据来自?举个例子。

    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或其他东西之前的数据准备有帮助。

    你可以把上面的例子合并成一个数据表。框架如下:

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

    这可以像这样绘制在ggplot中:

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

    祝你一切顺利,

    杰伊

        4
  •  0
  •   MYaseen208    10 年前

    这个怎么样?


    密码


    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