Компактный мульти ggplot2 времен серии - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть большой days.data, сделанный из наблюдений за потреблением энергии в течение нескольких недель. Это df - это rbind нескольких дней, где каждый день имеет одинаковое количество строк (60 * 60 * 24). Где каждый ряд является наблюдением энергии. Из этого большого df я выбрал два дня i.data,, чтобы исследовать потребление.

df <- days.data[i.data,] %>%
  mutate(date = as.factor(as.Date(time,tz="CET")))%>%
  select( time, kWh, date)

df$csum <- ave(df$kWh, df$date, FUN=cumsum)

ggplot(df, aes(x = time, y = csum)) + 
  geom_line(aes(color = date, linetype = date)) +
  scale_color_manual(values = c("darkred", "steelblue")) +
  scale_x_datetime(
    breaks = seq(df[1,1],
                 df[nrow(df),1], 36000),
    labels = date_format(format="%H:%M", tz = "CET"),
    expand = c(0, 0))  

Пока все хорошо, сюжет выглядит не так уж плохо.

enter image description here

Дело в том, что я хотел бы объединить оба графика, а не с интервалом в одну неделю ... Поскольку оба дня имеют одинаковый размер, это должно быть возможно. Как только я пытаюсь использовать #df$time <- as.numeric(strftime(df$time,"%H:%M", tz = "CET")) ggplot говорит мне, что у меня есть дискретные значения,… мне нужно что-то подобное, но с обоими графиками:

enter image description here

Вот сводка моих данных (df из 172800 строк ...)

> summary(df)
      time                          kWh                    date            csum      
 Min.   :2020-03-20 00:00:00   Min.   :0.0000000   2020-03-20:86400   Min.   : 0.00  
 1st Qu.:2020-03-20 11:59:59   1st Qu.:0.0000000   2020-03-27:86400   1st Qu.: 0.00  
 Median :2020-03-23 23:59:59   Median :0.0000000                      Median :47.15  
 Mean   :2020-03-23 23:59:59   Mean   :0.0008111                      Mean   :36.78  
 3rd Qu.:2020-03-27 11:59:59   3rd Qu.:0.0000000                      3rd Qu.:69.43  
 Max.   :2020-03-27 23:59:59   Max.   :0.0881141                      Max.   :70.73  
> head(df)
                 time kWh       date csum
1 2020-03-20 00:00:00   0 2020-03-20    0
2 2020-03-20 00:00:01   0 2020-03-20    0
3 2020-03-20 00:00:02   0 2020-03-20    0
4 2020-03-20 00:00:03   0 2020-03-20    0
5 2020-03-20 00:00:04   0 2020-03-20    0
6 2020-03-20 00:00:05   0 2020-03-20    0
> 

Что я могу попробовать дальше?

1 Ответ

1 голос
/ 07 апреля 2020

Лучший способ сделать то, что вы хотите, это использовать фасеты. Это создает четкое и легкое наглядное различие между двумя днями. Кроме того, если вы собираетесь сравнивать более одной пары дней, может быть полезно сделать выбор дней внутри ggplot.

exdf <- data.frame(time = seq(as.POSIXct("2020-03-20"), as.POSIXct("2020-03-27"), 60))
exdf$kWh <- rlnorm(nrow(exdf))
exdf$date <- as.factor(as.Date(exdf$time))
exdf$csum <- ave(exdf$kWh, exdf$date, FUN = cumsum)

i.data <- c("2020-03-21", "2020-03-25")

ggplot(subset(exdf, date %in% i.data), aes(time, csum)) + 
  geom_line() +
  facet_wrap(~date, scales = "free_x")

enter image description here

...