2016-12-19 10 views
0

У меня есть почасовые временные ряды, данные из трех домов (H1, H2, H3) для непрерывных пяти дней, созданных вPlot нескольких дней данные из нескольких домов в Facet форме ggplot

library(xts) 
library(ggplot2) 
set.seed(123) 
dt <- data.frame(H1 = rnorm(24*5,200,2),H2 = rnorm(24*5,150,2),H3 = rnorm(24*5,50,2)) # hourly data of three homes for 5 days 
timestamp <- seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-01-05 23:59:59"), by = "hour") # create timestamp 
dt$timestamp <- timestamp 

Теперь я хочу построить homewise данных в виде фасета; Соответственно я таю dataframe как

tempdf <- reshape2::melt(dt,id.vars="timestamp") # melt data for faceting 
colnames(tempdf) <- c("time","var","val") # rename so as not to result in conflict with another melt inside geom_line 

В каждой грани (для каждого дома), я хочу, чтобы увидеть значение всех пять дней в виде линии сюжета (каждая грань должна содержать 5 строк, соответствующих разные дни). Соответственно,

ggplot(tempdf) + facet_wrap(~var) + 
    geom_line(data = function(x) { 
    locdat <- xts(x$val,x$time)# create timeseries object for easy splitting 
    sub <- split.xts(locdat,f="days") # split data daywise of considered home 
    sub2 <- sapply(sub, function(y) return(coredata(y))) # arrange data in matrix form 
    df_sub2 <- as.data.frame(sub2) 
    df_sub2$timestamp <- index(sub[[1]]) # forcing same timestamp for all days [okay with me] 
    df_melt <- reshape2::melt(df_sub2,id.vars="timestamp") # melt to plot inside each facet 
    #return(df_melt) 
    df_melt 
    }, aes(x=timestamp, y=value,group=variable,color=variable),inherit.aes = FALSE) 

Я заставил такую ​​же метку времени для всех дней дома сделать простую прокладку. С приведенным выше кодом я получаю график как enter image description here

Только проблема с вышеприведенным графиком заключается в том, что он строит одни и те же данные во всех грани. В идеале, фасет H1 должен содержать только данные только для дома 1 и H2 фасет должен содержать данные о доме 2. Я знаю, что я не могу передавать данные homewise в geom_line(), может ли кто-нибудь помочь в правильном направлении.

ответ

1

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

Здесь я использую lubridate для создания двух новых столбцов. Первый имеет только дату (а не время), чтобы разрешить огранку. Второй содержит полное datetime, но я затем изменяю дату, чтобы они были одинаковыми. Это оставляет только времена важными (и мы можем подавить выбранную дату в сюжете).

library(lubridate) 

tempdf$day <- date(tempdf$time) 
tempdf$forPlotTime <- tempdf$time 

date(tempdf$forPlotTime) <- 
    "2016-01-01" 

Тогда, я могу передать, что модифицированный data.frame к ggplot. Вы, скорее всего, захотите изменить цвета/метки, но это должно стать хорошим началом.

ggplot(tempdf 
     , aes(x = forPlotTime 
      , y = val 
      , col = as.factor(day))) + 
    geom_line() + 
    facet_wrap(~var) + 
    scale_x_datetime(date_breaks = "6 hours" 
        , date_labels = "%H:%M") 

Формирует:

enter image description here

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

  • Нет связанных вопросов^_^