#r #plot #time-series #zoo
#r #построение графика #временные ряды #zoo
Вопрос:
У меня есть следующий код на 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")
Комментарии:
1. В случае объектов xts / zoo печатное представление данных не очень полезно. Вывод из
dput(head(z,10))
был бы намного полезнее.
Ответ №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")
Комментарии:
1. или, возможно, этот вариант:
time(z) <- time(z) - trunc(time(z)); plot(z[,1])
2. Хах. Значит, также существует
zoo.time<-
функция? И я полагаю, это также означает, что я был не совсем прав, сказав, что функция 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)
Комментарии:
1. Есть ли причина не делать просто:
unique(trunc(tt,"hour"))
?2. @joran: На это есть совершенно веская причина… Я не знал об этом. Куда бы вы поместили это в моем коде выше?