График временной плотности в R

У меня есть нерегулярно измеренные наблюдения за явлением с отметкой времени:

2013-01-03 00:04:23
2013-01-03 00:02:04
2013-01-02 23:45:16
2013-01-02 23:35:16
2013-01-02 23:31:56
2013-01-02 23:31:30
2013-01-02 23:29:18
2013-01-02 23:28:43
...

Теперь я хотел бы нанести эти точки на ось X и применить к ним функцию плотности ядра, чтобы я мог визуально исследовать временную плотность, используя различные полосы пропускания. Что-то вроде этого должно получиться, хотя в приведенном ниже примере не используется разметка по оси x; Я хотел бы иметь метки, например, с определенными днями (1 января, 5 января и т. д.):

график плотности ядра

Однако важно, чтобы на графике были видны сами точки измерения, как показано выше.


person grssnbchr    schedule 24.05.2013    source источник


Ответы (2)


#dput
df <- structure(list(V1 = structure(c(2L, 2L, 1L, 3L, 1L, 4L, 5L, 4L), .Label = c("2013-01-02", "2013-01-03", "2013-01-04", "2013-01-05", "2013-01-11"), class = "factor"), V2 = structure(c(1L, 3L, 8L,  4L, 7L, 6L, 5L, 2L), .Label = c(" 04:04:23", " 06:28:43", " 10:02:04", " 11:35:16", " 14:29:18", " 17:31:30", " 23:31:56", " 23:45:16"), class = "factor")), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, -8L))

Использование ggplot, так как это дает детальный контроль над вашим сюжетом. Используйте разные слои для измерений и самой плотности.

df$tcol<- as.POSIXct(paste(df$dte, df$timestmp), format= "%Y-%m-%d %H:%M:%S")
library(ggplot2)
measurements <- geom_point(aes(x=tcol, y=0), shape=15, color='blue', size=5)
kde <- geom_density(aes(x=tcol), bw="nrd0")
ggplot(df) + measurements +  kde

Ведет к введите здесь описание изображения

Теперь, если вы хотите дополнительно настроить метки оси X (поскольку вы хотите отметить каждый отдельный день, вы можете использовать пакет scales. Мы собираемся использовать scale_x_date, но он принимает только «Дата»

library(scales)
df$tcol <- as.Date(df$tcol, format= "%Y-%m-%d %H:%M:%S")
xlabel <- scale_x_date(labels=date_format("%m-%d"), breaks="1 day")
ggplot(df) + xlabel + measurements +  kde

Это дает: введите здесь описание изображения

Обратите внимание, что часы, похоже, округлились.

Надеюсь, это поможет вам двигаться вперед.

person Ram Narasimhan    schedule 24.05.2013
comment
+1 за пример ggplot2, хотя я не понимаю, почему вы придерживаетесь такого сложного подхода при построении data.frame, и у вас тоже есть ошибка, то есть столбцы dte и timestmp не существуют. - person grssnbchr; 27.05.2013
comment
Я построил df, читая из csv, а затем использовал dput, чтобы он стал воспроизводимым примером. Вывод dput вот почему он кажется сложным. - person Ram Narasimhan; 27.05.2013
comment
Ага, ладно! Не беспокойтесь, в любом случае это хороший ответ, я им воспользовался. Однако у меня есть некоторые проблемы с указанием пропускной способности ядра в ggplot. Может быть, вы могли бы посмотреть и на мой другой вопрос? stackoverflow.com/ вопросы/16769305/ - person grssnbchr; 28.05.2013

Преобразуйте свои значения в POSIXct, преобразуйте это числовое значение (т. е. секунды во времени UNIX), а затем примените функцию плотности ядра. Если z - ваш вектор временных меток:

z2 <- as.POSIXct(z, "%Y-%m-%d %H:%M:%S", tz="GMT")
plot(density(as.numeric(z2)))

Тогда было бы относительно легко добавить помеченную ось X с помощью axis.

person Thomas    schedule 24.05.2013