在 gganimate 的 transition_reveal 的标题表达式中使用替代变量?
Using alternative variables in title expression in gganimate's transition_reveal?
我有兴趣使用时间补间变量之外的替代变量来获取每帧的标题标签信息。
软件包维护者提到它通常是不可能的,但提供了一个小 work-around 示例 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]}")
您只能看到 NA
显示,因为我的时间变量无法强制转换为整数。即使我强制执行它,它也不会显示任何内容,因为我的时间向量中的第一个元素 1991.496
大于我的数据框中的总行数 (1860)。
所以我想做这样的事情作为过滤器:
stock %>% ggplot(aes(date, FTSE)) +
geom_line() +
transition_reveal(date) +
labs(title = "{stock$FTSE[which(stock$date == frame_along)]}")
我得到的是一堆闪烁的帧,但从可见的帧中我可以看到过滤器确实可以让正确的变量显示在标题中。我不确定这里的问题是什么,但我很想让它正常工作。
编辑:
经过更多尝试后,我认为我的问题是我使用 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)]}")
有效,但这个汇总数据集不是我感兴趣的。
我考虑过将我的时间变量转换为整数(比如乘以 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))]}")
尽管我现在专门针对来自 frame_along
.
的整数向量和整数值进行过滤,但仍会再次返回闪烁动画
马哥的建议:
也许这就是您要找的。
stock %>% ggplot(aes(date, FTSE)) +
geom_line() +
transition_reveal(date) +
labs(title = "{stock$FTSE[which.min(abs(stock$date-frame_along))]}")
我有兴趣使用时间补间变量之外的替代变量来获取每帧的标题标签信息。
软件包维护者提到它通常是不可能的,但提供了一个小 work-around 示例 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]}")
您只能看到 NA
显示,因为我的时间变量无法强制转换为整数。即使我强制执行它,它也不会显示任何内容,因为我的时间向量中的第一个元素 1991.496
大于我的数据框中的总行数 (1860)。
所以我想做这样的事情作为过滤器:
stock %>% ggplot(aes(date, FTSE)) +
geom_line() +
transition_reveal(date) +
labs(title = "{stock$FTSE[which(stock$date == frame_along)]}")
我得到的是一堆闪烁的帧,但从可见的帧中我可以看到过滤器确实可以让正确的变量显示在标题中。我不确定这里的问题是什么,但我很想让它正常工作。
编辑:
经过更多尝试后,我认为我的问题是我使用 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)]}")
有效,但这个汇总数据集不是我感兴趣的。
我考虑过将我的时间变量转换为整数(比如乘以 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))]}")
尽管我现在专门针对来自 frame_along
.
马哥的建议:
也许这就是您要找的。
stock %>% ggplot(aes(date, FTSE)) +
geom_line() +
transition_reveal(date) +
labs(title = "{stock$FTSE[which.min(abs(stock$date-frame_along))]}")