以gtplot的Facet形式绘制多个家庭的多天数据

时间:2016-12-19 12:51:14

标签: r ggplot2 facet facet-wrap

我有三个家庭的每小时时间序列数据(H1, H2, H3)连续五天创建

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

现在我想以平面形式在家中绘制数据;因此我将数据框融化为

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 facet应仅包含home 1的数据,而H2 facet应包含home 2的数据。我知道我无法在geom_line()中传递homewise数据,任何人都可以帮助以正确的方式做。

1 个答案:

答案 0 :(得分:2)

我认为您可能会发现更有效地修改外部的数据调用ggplot而非内部(允许仔细检查每一步发生的事情,至少在我看来。)

在这里,我使用lubridate生成两个新列。第一个只保留允许刻面的日期(而不是时间)。第二个持有完整的日期时间,但我然后修改日期,以便它们都是相同的。这只留下了重要的时间(我们可以在图中抑制选定的日期)。

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