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