在gganimate的transition_reveal中的标题表达中使用替代变量?

时间:2020-06-13 10:05:26

标签: r gganimate

除了在时间补间变量之外,我还想在每个帧的标题标签信息中使用替代变量。

软件包Maintenanceer提到通常是不可能的,但是提供了一个小的解决方法示例here。但是,在他的示例中,只有在方便地使用的时间变量与数据帧中每个元素的索引匹配时,它才起作用。

对于大多数其他应用程序,这是不现实的。例如

library(gganimate)
library(tidyverse)

stock <- bind_cols(date = round(as.numeric(time(EuStockMarkets)), 3),
                   EuStockMarkets) ## built-in dataset

stock %>% ggplot(aes(date, FTSE)) +
  geom_line() +
  transition_reveal(date) +
  labs(title = "{stock$FTSE[frame_along]}")

enter image description here

您只能看到NA,因为我的时间变量不能被强制转换为整数。即使我要强制执行此操作,也不会显示任何内容,因为我的时间向量中的第一个元素1991.496大于数据框中的行总数(1860)。

所以我考虑做这样的事情作为过滤器:

stock %>% ggplot(aes(date, FTSE)) +
  geom_line() +
  transition_reveal(date) +
  labs(title = "{stock$FTSE[which(stock$date == frame_along)]}")

我得到的是一堆闪烁的帧,但是从可见的帧中,我可以看到过滤器确实可以使正确的变量显示在标题中。我不确定这是什么问题,但我很想解决这个问题。

enter image description here

编辑:

经过更多的研究之后,我认为我的问题是我正在使用which来匹配双精度型向量:

stock <- bind_cols(date = as.integer(time(EuStockMarkets)),
                   EuStockMarkets)
stock <- stock %>% group_by(date) %>% summarise(ftse_sum = sum(FTSE))

stock %>% ggplot(aes(date, ftse_sum)) +
  geom_line() +
  transition_reveal(date) +
  labs(title = "{stock$ftse_sum[which(stock$date == frame_along)]}")

enter image description here

有效,但是这个汇总的数据集不是我感兴趣的。

我考虑过将时间变量转换为整数(例如乘以1000),然后将其转换为scale_x_continuous中的适当比例。

stock <- bind_cols(date = as.integer(round(as.numeric(time(EuStockMarkets)), 3)*1000),
                   EuStockMarkets)

stock %>% ggplot(aes(date, FTSE)) +
  geom_line() +
  scale_x_continuous(labels = function(x) x/1000) +
  transition_reveal(date) +
  labs(title = "{stock$FTSE[which(stock$date == as.integer(frame_along))]}")

enter image description here

尽管我现在专门针对frame_along中的整数矢量和整数值进行过滤,但还是再次返回了闪烁的动画。

马可的建议:

enter image description here

1 个答案:

答案 0 :(得分:0)

也许这就是您想要的。

stock %>% ggplot(aes(date, FTSE)) +
  geom_line() +
  transition_reveal(date) +
  labs(title = "{stock$FTSE[which.min(abs(stock$date-frame_along))]}")

enter image description here