Отображение времени на тепловой карте в зависимости от даты ggplot - PullRequest
0 голосов
/ 25 мая 2020

Я хотел бы сделать тепловую карту с помощью ggplot. Результат должен быть примерно таким (хотя ось Y необходимо перевернуть):

heatmap time/date

Ниже представлен подмножество примеров данных. Для фактического приложения фрейм данных имеет более 1000 пользователей, а не только 3. Градиентная заливка должна основываться на ценности пользователей.

Date <- seq(
  from = as.POSIXct("2016-01-01 00:00"),
  to  = as.POSIXct("2016-12-31 23:00"),
  by = "hour"
)    
user1 <- runif(length(Date), min = 0, max = 10)
user2 <- runif(length(Date), min = 0, max = 10)
user3 <- runif(length(Date), min = 0, max = 10)
example <- data.frame(Date, user1, user2, user3)

example$hour <- format(example$Date, format = "%H:%M")
example$total <- rowSums(example[,c(2:4)])

Я пробовал несколько вещей, используя (fill = total) аргумент в сочетании с geom_tile, geom_raster и stat_de density2d (как это предлагается в аналогичных сообщениях здесь). Пример ниже:

ggplot(plotHuishoudens, aes(Date, hour, fill = Total)) +
  geom_tile() +
  scale_fill_gradient(low = "blue", high = "red")

Который показывает только отдельные точки, а не показывает ось y как непрерывную переменную (scale_y_continuous также не помогло с этим), хотя переменная является непрерывной?

Как создать тепловую карту, как в приведенном выше примере? И как мне сделать хорошую отсечку по оси Y (например, за 3 часа вместо часа)?

1 Ответ

2 голосов
/ 25 мая 2020

По способу определения ваших данных вы не получите желаемого результата, потому что example$Date - это объект POSIXct, то есть дата и час.

Итак, вы должны сопоставить свой график только с днем:

ggplot(data = example) + 
  geom_raster(aes(x=as.Date(Date, format='%d%b%y'), y=hour, fill=total)) + 
  scale_fill_gradient(low = "blue", high = "red")

enter image description here

Для вашего второго вопроса вы можете сгруппировать часы следующим образом:

example <- example %>% 
  group_by(grp = rep(row_number(), length.out = n(), each = 4)) %>%
  summarise(Date = as.Date(sample(Date, 1), format='%d%b%y'),
            total = sum(total),
            time_slot = paste(min(hour), max(hour), sep = "-"))

ggplot(data = example) + 
  geom_raster(aes(x = Date, y = time_slot, fill = total)) + 
  scale_fill_gradientn(colours = (cet_pal(6, name = "inferno"))) # I like gradients from "cetcolor" package

enter image description here

...