【问题标题】:Use hours on the x-axis when plotting with zoo in R在 R 中使用 zoo 绘图时在 x 轴上使用小时
【发布时间】:2011-12-24 15:48:30
【问题描述】:

我在 R 中有以下代码:

z = read.zoo(filename, sep=',', header=T, index = 1:2, FUN=f)
plot(z[,1], col='red', lty=1, xaxt="n")

这会生成我的数据时间序列的线图,没有任何 x 轴。然后我想在几小时内添加一个带有标签的 x 轴,所以我尝试以下操作(我对 zoo FAQ 中示例的转换):

tt = time(z)
m = unique(hours(tt))
axis(side = 1, at = m, labels=substr(m, 1, 2))

但是没有轴出现。我在这里做错了什么?我尽可能地遵循这些示例,但将其从几个月改为几个小时。有什么想法吗?

如果有帮助,这里是z 输出的前几行:

                    AOT_500 Water.cm.
(04/27/10 06:53:26) 0.134940  1.403318
(04/27/10 07:01:26) 0.147529  1.425749
(04/27/10 07:07:15) 0.161837  1.411711
(04/27/10 07:12:05) 0.155312  1.415916
(04/27/10 07:21:36) 0.161960  1.438144
(04/27/10 07:34:29) 0.175276  1.426818
(04/27/10 07:50:08) 0.169452  1.435454
(04/27/10 08:09:39) 0.181987  1.437278
(04/27/10 08:50:58) 0.159755  1.372659
(04/27/10 09:04:12) 0.168336  1.348832
(04/27/10 09:10:04) 0.201690  1.383709

更新:应要求 - dput(head(z,10))的输出

structure(c(0.13494, 0.147529, 0.161837, 0.155312, 0.16196, 0.175276, 
0.169452, 0.181987, 0.159755, 0.168336, 1.403318, 1.425749, 1.411711, 
1.415916, 1.438144, 1.426818, 1.435454, 1.437278, 1.372659, 1.348832
), .Dim = c(10L, 2L), .Dimnames = list(NULL, c("AOT_500", "Water.cm."
)), index = structure(c(14726.2871064815, 14726.292662037, 14726.2967013889, 
14726.3000578704, 14726.3066666667, 14726.3156134259, 14726.3264814815, 
14726.3400347222, 14726.3687268519, 14726.3779166667), format = structure(c("m/d/y", 
"h:m:s"), .Names = c("dates", "times")), origin = structure(c(1, 
1, 1970), .Names = c("month", "day", "year")), class = c("chron", 
"dates", "times")), class = "zoo")

【问题讨论】:

  • 在 xts/zoo 对象的情况下,数据的打印表示不是很有用。 dput(head(z,10)) 的输出会更有帮助。
  • @JoshuaUlrich - 我已经更新了问题 - 谢谢。

标签: r plot time-series zoo


【解决方案1】:

目前,您仅将 y 值提供给绘图方法。我发现时间计算非常混乱,并决定改用没有轴的绘图方法。只需从时间中减去截断的时间即可得到小时数,plot.zoo 会为您很好地计算出来:

require(xts); require(chron)
mm <- times(tt)
plot((mm-trunc(mm) ), z[,1], col='red', lty=1, type="b", xlab="Time of Day")

【讨论】:

  • 或者这个变体:time(z) &lt;- time(z) - trunc(time(z)); plot(z[,1])
  • 哈。那么还有zoo.time&lt;- 函数吗?而且我想这也意味着我说 plot 函数只获取 y 值并不完全正确?
【解决方案2】:

看看中间数据。 m 是一个数字,但您在 axis 函数中使用它就像您期望它是一个字符串一样。即使它是一个字符串,它也不起作用,因为at= 需要与您正在绘制的对象的索引(在本例中为 chron)是同一类。

下面的代码做了我认为你想做的事情:

# find the hourly sections of the chron index
m <- trunc((tt-trunc(tt))*24)/(24)
# find the minimum index value for each hour
l <- tapply(tt, m, min)
# plot the series
plot(z[,1], col='red', lty=1, xaxt="n", xlab="")
# add the axis
axis(side=1, at=l, labels=unique(m), las=2)

【讨论】:

  • 是否有理由不这样做:unique(trunc(tt,"hour"))
  • @joran:有一个非常好的理由......我不知道。你会把它放在我上面的代码中的什么地方?
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多