gganimate:仅显示最新状态的标签

gganimate: show label only for latest state

我正在尝试为散点图设置动画,仅显示最近点的标签。

我正在努力解决的问题是让前面的标签消失。 我知道 'closest_state' 可能是答案的一部分,但据我所知,淡出前面的标签并保留前面的点是不可能的。

我发现的是 this,但我正在努力实现它。

有什么帮助吗?非常感谢!

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)

reprex package (v0.3.0)

于 2020-03-24 创建

我只是 gganimate 的初学者,所以这可能不是最简单的方法,只是一种技巧。但它有效。试试这个:

基本思路是去除阴影痕迹。为了显示过去的值,我使用了一个膨胀的 df,其中通过按天拆分 df 将 obs 分组为帧,然后将天数累积到帧,...缺点。除了引入 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)

reprex package (v0.3.0)

于 2020-03-24 创建