gganimate: оставляйте точки в нескольких кадрах до и после - PullRequest
0 голосов
/ 30 января 2019

У меня есть data.frame, содержащий метки времени разных типов, геолокации.Я знаю, как построить анимацию каждого события как точку, час за часом, с помощью gganimate (*).Это будет что-то вроде:

df = data.frame("id"  = runif(500, 1e6, 1e7),
           'lat' = runif(500, 45, 45.1),
           'long'= runif(500, 45, 45.1),
           'datetime'= seq.POSIXt(from=Sys.time(), to=Sys.time()+1e5, length.out=500),
           'hour'=format(seq.POSIXt(from=Sys.time(), to=Sys.time()+1e5, length.out=500), "%H"),
           'event'=paste0("type", rpois(500, 1)))

ggplot(data=df) + 
  aes(x=long, y=lat, color=factor(event)) + 
  geom_point() +
  transition_states(hour, state_length = 1, transition_length = 0)

Теперь я бы хотел, чтобы точки «оставались» на экране дольше, например, если событие происходит в 17:00, я хочу, чтобы оно отображалось на анимации с2 вечера до 8 вечера (3 кадра до и после его позиции, и, если возможно, исчезать и исчезать).Я не знаю, как это сделать с gganimate, я пытался использовать transition_length, но это заставляет точки «двигаться», и это не имеет смысла для меня!

Спасибо,

(*) Редактировать : Я думал о добавлении 6 дублированных строк для каждой строки и изменении часа на -1 - +3, но он намного тяжелее и не может справиться с постепенным исчезновением

library(magrittr)

df %<>% mutate(hour = hour + 2) %>% bind_rows(df)
df %<>% mutate(hour = hour + 1) %>% bind_rows(df)
df %<>% mutate(hour = hour - 4) %>% bind_rows(df)
df %<>% mutate(hour = hour %% 24 )

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Вы можете использовать transition_components и указать 3 часа в качестве длины входа / выхода для каждой точки.

Данные :

set.seed(123)
n <- 50 # 500 in question
df = data.frame(
  id       = runif(n, 1e6, 1e7),
  lat      = runif(n, 45, 45.1),
  long     = runif(n, 45, 45.1),
  datetime = seq.POSIXt(from=Sys.time(), to=Sys.time()+1e5, length.out=n),
  hour     = format(seq.POSIXt(from=Sys.time(), to=Sys.time()+1e5, length.out=n), "%H"),
  event    = paste0("type", rpois(n, 1)))

Код:

df %>%
  mutate(hour = as.numeric(as.character(hour))) %>%

  ggplot() +
  aes(x=long, y=lat, group = id, color=factor(event)) + 

  # I'm using geom_label to indicate the time associated with each
  # point & highlight the transition times before / afterwards.
  # replace with geom_point() as needed
  geom_label(aes(label = as.character(hour))) +
  # geom_point() +

  transition_components(hour, 
                        enter_length = 3, 
                        exit_length = 3) +
  enter_fade() +
  exit_fade() +
  ggtitle("Time: {round(frame_time)}")

plot 1

Этот подход также работает с переменной даты и времени:

df %>%
  ggplot() +
  aes(x = long, y = lat, group = id, color = factor(event)) +
  geom_label(aes(label = format(datetime, "%H:%M"))) +
  transition_components(datetime,
                        enter_length = as_datetime(hm("3:0")),
                        exit_length = as_datetime(hm("3:0"))) +
  enter_fade() +
  exit_fade() +
  ggtitle("Time: {format(frame_time, '%H:%M')}")

plot

0 голосов
/ 30 января 2019

gganimate, по-видимому, не настроен для обработки точек на графике.Я думаю, что вам придется идти по ручному маршруту.

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

df_withRange <-
  df %>%
  mutate(hour = parse_number(hour)) %>%
  split(1:nrow(.)) %>%
  lapply(function(x){
    lapply(-3:3, function(this_time){
      x %>%
        mutate(frame_time = hour + this_time
               , offset = this_time
               , abs_offset = abs(this_time))
    }) %>%
      bind_rows()
  }) %>%
  bind_rows() %>%
  mutate(
    frame_time = ifelse(frame_time > 23, frame_time - 24, frame_time)
    , frame_time = ifelse(frame_time < 0, frame_time + 24, frame_time)
  )

Затем этот код настраивает сюжет:

ggplot(data=df_withRange
       , aes(x=long
             , y=lat
             , color=factor(event)
             , alpha = abs_offset
             )) +
  geom_point() +
  transition_states(frame_time) +
  labs(title = 'Hour: {closest_state}') +
  scale_alpha_continuous(range = c(1,0.2))

Сюжет:

enter image description here

Еще многое предстоит сделать (например, уровни затухания и т. Д.), Но это должно быть началом, по крайней мере,

...