2015-12-02 2 views
1

Я использую facet_grid для построения данных временных рядов. ДанныеДанные временных рядов, сдвинутые на один день с использованием facet_grid/ggplot2

> dput(mel.ob) 
structure(list(timestamp = structure(c(1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800, 1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800, 1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800), tzone = "Asia/Kolkata", tclass = c("POSIXct", 
"POSIXt"), class = c("POSIXct", "POSIXt")), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("power", "hpanom", 
"lofanom"), class = "factor"), value = c(172.016104060554, 176.777480085691, 
184.018404140075, 175.561151940955, 182.52419107159, 175.216664665937, 
183.751597162088, 198.844153259955, 199.803173963254, 237.508030500042, 
285.079349749013, 188.377162014776, 452.238984323895, 304.084650686052, 
304.976941431231, 168.37194477982, 221.142072661718, 285.339264474312, 
243.126828978721, 526.165040140682, 583.26909929249, 549.145660841621, 
195.02748863608, 200.088289825199, 249.279407493724, 410.968041439378, 
368.949028046264, 361.528117646774, 394.092273548577, 439.027137154341, 
0.190453461153838, 0.738170304350057, 0.359277651161948, 0.383363598976019, 
0.357189854750563, 0.357189854750563, 0, 0.464407941461156, 0.842226206120729, 
0.928056670115148, 0.939184368487052, 0.174074829364281, 0.999333003990622, 
0.97052094947291, 0.957985395010343, 0.620128340774666, 0.971218262867733, 
0.918581736843709, 0.898790693128374, 0.992626480647862, 0.996099376857962, 
0.995219939905799, 0.864283999224187, 0.903098686478643, 0.929581519648184, 
0.98981186152571, 0.986686711459769, 0.989957071504958, 0.984688509451126, 
0.986320878558335, 0.02, 0.1, 0.03, 0.02, 0.07, 0.02, 0, 0.04, 
0.05, 0.45, 0.11, 0.01, 1, 0.1, 0.13, 0.03, 0.72, 0.13, 0.59, 
0.54, 0.72, 0.52, 0.08, 0.07, 0.14, 0.2, 0.15, 0.15, 0.17, 0.18 
)), row.names = c(NA, -90L), .Names = c("timestamp", "variable", 
"value"), class = "data.frame") 

Я использую следующий код для построения

f <- ggplot(data=mel.ob,aes(x=timestamp,y=value,ymin=0,ymax=value))+facet_grid(variable~., scales = "free_y")+ 
    theme(axis.title.x=element_blank(),axis.title.y=element_blank()) 
f1 <- f + geom_linerange(subset=.(variable=="hpanom")) # require(plyr) for dot function 
f2 <- f1 + geom_linerange(subset=.(variable=="lofanom")) 
f3 <- f2 + geom_line(subset=.(variable=="power")) 
f3 

На черчения я получаю следующий сюжет enter image description here

Таким образом, вопрос мой набор данных содержит данные даты 1 августа до 30 августа, но график показывает данные с 2 августа по 31 августа. Почему и как мой набор данных переместится на один день? Где я поступаю неправильно?

ответ

4

Сюжет на самом деле не сдвигает ваши даты. Ваши даты указаны в формате POSIXct, который включает часы, минуты и секунды. ggplot2 ставит каждую точку на точный час/минуту/секунду каждой даты. Все ваше время составляет 23 часа. Итак, строки, которые выглядят так, как будто, например, 3 августа, находятся на 23-м часе 2 августа. Аналогично, самая левая линия находится на 23-м часе 1 августа.

Если вы увеличиваете горизонтальную протяженность графика и смотрите внимательно, вы увидите, что вертикальные линии на основных линиях сетки сдвинуты немного (то есть на 1 час) слева от основных линий сетки, что находятся в полночь каждого дня.

У вас могут быть точки, нанесенные днем ​​(без учета часа), используя as.Date(timestamp) в вашем коде. Другой вариант - сохранить формат даты/времени, но поместите основные линии сетки точно там, где вы хотите. Например, вот как можно было бы поместить линии сетки каждую неделю, начиная с 1 августа в 23:00, но установить метки, чтобы быть только дата без времени:

f3 + scale_x_datetime(breaks=seq(min(mel.ob$timestamp), max(mel.ob$timestamp), 
           by="1 week"), 
         labels=as.Date(seq(min(mel.ob$timestamp), max(mel.ob$timestamp), 
            by="1 week"))) 

Подобно тому, как дополнительное примечание, дата/временные форматы в R - это просто числовые переменные с добавленным классом даты/времени. Класс POSIXct - количество секунд с 01.01.1970 00:00:00 (в часовом поясе UTC), в то время как класс Date - это количество дней с 01.01.1970. ggplot отображает эти числовые значения, но с разрывами и метками, соответствующими соответствующим классам дат. Вы можете увидеть базовые числовые значения, выполнив as.numeric(mel.ob$timestamp) и as.numeric(as.Date(mel.ob$timestamp)).

Смежные вопросы