如何在1个面板中绘制多个时间序列数据时自定义轴?

时间:2013-05-21 15:40:07

标签: r plot axis zoo

我的情况很安静,如this问题,我怎么需要在一个面板中绘制多个时间序列(或固定长度向量)。 (我想上传一张图片,但它说我没有足够的声誉......)

这是我的示例代码。

列“id”标识用户。 (示例代码只有1个用户)
  列“时间”刻度从1到24 * 7小时(每小时总结1周)
  列“A”,“B”,“C”是每小时属性摘要

> require(data.table)
# Create some data 
> dt<-data.table(id=rep(123,168),time=1:168,A=rnorm(168,10,5),B=rnorm(168,100,20),C=rnorm(168,10,5))
> dt
      id time         A         B         C
  1: 123    1  2.435577 147.01446 12.484723
  2: 123    2 15.119403  88.05115  7.226495
  3: 123    3 17.835930 110.01482  6.888222
  4: 123    4 10.455834 102.48860 13.098892
  5: 123    5  8.107672  83.70896  7.711350
 ---                                       
164: 123  164  8.301877 145.88020 10.195002
165: 123  165 12.403081  97.90534 14.249087
166: 123  166 16.563673 125.69398 11.039720
167: 123  167 11.091746  98.81823 15.131038
168: 123  168 10.190338  87.32466 11.422943
> z<-zoo(dt)
> plot(z[,3:5],yax.flip=TRUE,col=1:3) #plot all attributes timeseries in one panel

我想添加网格并自定义x轴,如下所示:

周一,1,2,3,...,23,周二,1,2,3,...,23,周三,1,2,3,...,23,周四,1,2,3,...,23日,周五,1,2,3,...,23,Sat.1,2,3,...,23,阳光,1,2,3 ,...,23

我尝试使用axisablinegrid来获取我想要的内容,但它根本不起作用。(如果plot.type=single可以正常工作)

1 个答案:

答案 0 :(得分:1)

您必须使用panel中的plot.zoo选项。这允许您将网格添加到所有面板。您还可以将底部轴添加到绘图中的最后一个面板。我没有把每小时的数字都放在一起,因为它太拥挤了。

ax.date <-as.POSIXlt("2013-01-06")+(0:167)*3600 #Dummy date for POSIXlt method

my.panel <- function(x, y, ..., pf = parent.frame()) {
 grid(NA,NULL)
 abline(v=seq(1,168,24),col = "lightgray", lty = "dotted", lwd = par("lwd"))
 lines(x, y, ...)

 #if bottom panel
 if (with(pf, length(panel.number) == 0 ||
        panel.number %% nr == 0 || panel.number == nser)) {
      # create ticks at x values and then label every 24th tick
      axis(side = 1, at = x, labels = FALSE, tcl=-0.3) #hour ticks
      axis(side = 1, at = seq(1,168,6), labels = FALSE) #6hour ticks ticks
      axis(1,at=seq(1,168,24), labels=format(ax.date[seq(1,168,24)],"%a")) #day of the week
      axis(1,at=seq(13,168,24),labels=format(ax.date[seq(13,168,24)],"%H"), cex.axis=0.7) #noon ticks
   }
 }
 plot(z[,3:5], panel = my.panel,yax.flip=TRUE,col=1:3,xaxt="n")

enter image description here