gganimate: показывать ярлык только для последнего состояния - PullRequest
2 голосов
/ 24 марта 2020

Я пытаюсь анимировать график рассеяния, показывая только метки для самой последней точки.

Я борюсь с тем, чтобы предыдущие метки исчезли. Я понимаю, что «closest_state» может быть частью ответа, но, насколько я могу судить, исчезновение предыдущих меток и сохранение предыдущих точек невозможно.

Я нашел это , но я изо всех сил пытаюсь это реализовать.

Любая помощь? Большое спасибо!

library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.6.3
#> Warning: package 'forcats' was built under R version 3.6.3
library(gganimate)
#> Warning: package 'gganimate' was built under R version 3.6.2

ggplot(airquality %>% 
               filter(Month==5), 
             aes(Day, Temp)) +
  labs(title='{closest_state}')+
  geom_point(color='red', size=10) +
  geom_text(aes(label=paste("temp:", Temp, "\n", 
                        "day:", Day)),
            x=20,
            y=80,
            size=10)+
  transition_states(Day, state_length = 50)+
  shadow_mark(colour = 'black', size = 5)

Создано в 2020-03-24 пакетом Представить (v0.3.0)

1 Ответ

1 голос
/ 24 марта 2020

Я просто новичок в gganimate, так что это, вероятно, не самый простой способ, а просто взлом. Но это работает. Попробуйте это:

Основная идея c - избавиться от следов тени. Чтобы показать прошлые значения, я использую раздутую df, где obs группируются в кадры, разделяя df по дням, затем накапливают Days to frames, ... Недостаток. Помимо установки df, мы должны сделать несколько дополнительных шагов манипулирования данными, чтобы получить правильные цвета и размеры.

library(tidyverse)
library(gganimate)

df <- airquality %>% 
  filter(Month == 5) %>% 
  split(.$Day) %>% 
  accumulate(~ bind_rows(.x, .y)) %>% 
  bind_rows(.id = "frame") %>% 
  mutate(frame = as.integer(frame)) %>% 
  group_by(frame)  %>% 
  mutate(label = paste("temp:", last(Temp), "\n", "day:", last(Day)),
         color = ifelse(Day == last(Day), "red", "black"),
         size = ifelse(Day == last(Day), 10, 5)) %>% 
  ungroup()

ggplot(df) +
  labs(title = '{closest_state}') +
  geom_point(aes(Day, Temp, color = color, size = size)) +
  scale_color_identity() +
  scale_size_identity() +
  geom_text(aes(label = label), x=20, y=80, size=10)+
  transition_states(frame, state_length = 50)

Создано в 2020-03-24 by представительный пакет (v0.3.0)

...