【问题标题】:Label X Axis in Time Series Plot using R使用 R 在时间序列图中标记 X 轴
【发布时间】:2010-12-04 18:19:09
【问题描述】:

我对 R 有点陌生,总体上对绘图的经验有限。我已经能够使用 zoo 将我的数据作为 R 中的时间序列对象获取,但我很难正确标记 xaxis,如果全部的话。

当我绘制我的动物园对象时

plot(z)

x 轴仅显示一个标签,即 2010 年。当系列是从 2009 年 4 月到 2010 年 10 月的每周时。

我尝试将我的系列转换回 ts 对象,甚至是数据框(只有一列,不包括日期)。

简单地说,我一般如何控制 x 轴标签以及时间序列对象?

提前致谢!

【问题讨论】:

    标签: r plot


    【解决方案1】:

    从一个例子开始:

    x.Date <- as.Date(paste(rep(2003:2004, each = 12), rep(1:12, 2), 1, sep = "-"))
    x <- zoo(rnorm(24), x.Date)
    plot(x)
    

    如果我们想要不同的刻度位置,我们可以取消默认轴绘图并添加我们自己的:

    plot(x, xaxt = "n")
    axis(1, at = time(x), labels = FALSE)
    

    或将它们组合起来:

    plot(x)
    axis(1, at = time(x), labels = FALSE)
    

    您需要指定刻度的位置,因此如果您需要每月、每周等值(而不是上面的观察时间),您需要自己创建相关位置(日期):

    ## weekly ticks
    plot(x)
    times <- time(x)
    ticks <- seq(times[1], times[length(times)], by = "weeks")
    axis(1, at = ticks, labels = FALSE, tcl = -0.3)
    

    请参阅?axis.Date 了解更多详情,另外?plot.zoo 有大量此类示例。

    【讨论】:

    • 是的。加文又做了一次。比我的解决方案更好,因为当我有一个固定间隔时使用 by="weeks" 参数。但是由于我的标签有标签,所以我将原封不动地发布它,并且 OP 可以接受他想要的。
    【解决方案2】:

    轴标签甚至不符合每月的划分,但在某些情况下可能很有用。过去 500 天的随机数据(总和):

    xx.Date <- as.Date((Sys.Date()-500):Sys.Date())
    x <- zoo(cumsum(rnorm(501)), xx.Date)
    tt=time(x)
    plot(x, xaxt ="n")
    tt <- time(x)
    ix <- seq(1, length(tt), by=60) #every 60 days
    fmt <- "%b-%d" # format for axis labels
    labs <- format(tt[ix], fmt)
    axis(side = 1, at = tt[ix], labels = labs,  cex.axis = 0.7)
    

    【讨论】:

      【解决方案3】:

      plot.zoo 使用 R 经典图形中的轴函数,但 zoo 也通过 xyplot.zoo 提供点阵图形。只需将 plot 更改为 xyplot 即可满足您的需求:

      library(zoo)
      library(lattice)
      
      # create test data
      z <- zooreg(1:83, start = as.Date("2009-04-01"), deltat = 7)
      
      xyplot(z)
      

      请注意,?plot.zoo?xyplot.zoo 以及动物园附带的三个小插曲中还有更多示例。在这些地方,您还可以找到不同方法的示例,这些示例展示了如何将经典图形的 axis 函数与 plot.zoo 一起用于高度自定义的轴。

      【讨论】:

        【解决方案4】:

        我已将以上所有内容和几个额外选项集中在一个地方,供我自己参考:

        # Time series plots with good X axis labels
        library(zoo)
        # data
        today = Sys.Date()
        dates = as.Date((today-500):today)
        z = zoo (100+cumsum(rnorm(501)), dates)
        
        # method1 : default X axis labels do not look good
        ?plot.zoo
        plot(z)
        ?plot.ts
        plot(ts(z))
        
        # method 2 : Lattice
        library(lattice)
        ?xyplot.zoo
        xyplot(z)
        xyplot(z, lwd=2, col="tomato")
        
        # method 3 : XTS
        library(xts)
        ?plot.xts
        plot(as.xts(z))
        plot(as.xts(z), auto.grid=F, major.format="%b %y", las=2)
        
        # method 4 : Base graph
        timeline = time(z)
        summary(timeline)
        index = seq(from=1, to=length(timeline), 90) # put ticks every 90 days
        plot(z, xaxt="n")
        axis(side=1, at=timeline[index], label=format(timeline[index], "%b %y"), cex.axis=0.8)
        
        # method 5 : ggplot
        library(ggplot2)
        library(scales)
        ?date_breaks
        df = data.frame(date=as.POSIXct(time(z)), value=as.numeric(z))
        head(df)
        # default plot
        ggplot(df, aes(x=date, y=value)) + geom_line()
        # formatted
        ggplot(df, aes(x=date, y=value)) + geom_line() + 
           scale_x_datetime(labels=date_format("%b '%y"))
        # custom breaks
        ggplot(df, aes(x=date, y=value)) + geom_line() + 
           scale_x_datetime(labels=date_format("%b '%y"), breaks=date_breaks("3 months"))
        

        【讨论】:

          【解决方案5】:

          如果时间是日期格式,这可能会有所帮助。

           ggplot(data_frame, aes(date,column)) + geom_point() +
              ggtitle("my title")+
              scale_x_date(date_breaks = "1 month",date_labels = "%b") + xlab("month") + 
              ylab("y_axis title")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-12
            • 1970-01-01
            • 2017-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-27
            • 2020-04-12
            相关资源
            最近更新 更多