gganimate 的舍入 frame_time 和平滑过渡
Rounding frame_time and smooth transitions for gganimate
我有以下数据框:
# Seed RNG
set.seed(33550336)
# Create data frame
df <- data.frame(x = runif(100),
y = runif(100),
t = runif(100, min = 0, max = 10))
我想绘制点(即在 x
和 y
坐标处)随 t
出现和消失的情况。 gganimate
很棒,所以我用了它。
# Load libraries
library(gganimate)
library(ggplot2)
# Create animation
g <- ggplot(df, aes(x = x, y = y))
g <- g + geom_point(colour = "#FF3300", shape = 19, size = 5, alpha = 0.25)
g <- g + labs(title = 'Time: {frame_time}')
g <- g + transition_time(t)
g <- g + enter_fade() + exit_fade()
animate(g, fps = 1)
此代码生成以下内容:
有几点我不喜欢这个。
- 转换非常突然。我希望使用
enter_fade
和 exit_fade
时点会淡入视野,然后退出。显然情况并非如此,但我如何达到这个结果呢?
- 我想四舍五入
{frame_time}
,这样当点在 t
的分数处淡入淡出时,显示的实际时间 t
将是一个整数.如果 frame_time
是一个常规变量,那么使用 bquote
和 round
之类的东西就足够简单了,但情况似乎并非如此。如何在我的标题中舍入 frame_time
?
这是一种相对手动的方法,它依赖于事先做更多的准备工作并将其输入 gganimate
。我想看看是否有更简单的方法可以在 gganimate
中更自动地执行此操作。
首先,我为要显示的每个帧复制了一个数据帧。然后我计算我目前正在查看的时间 (time
) 和我想要显示每个数据点的 t
之间的差异。我使用 cos
来处理缓入和缓出,因此每个点在给定时间的出现都用 display
来描述。在 ggplot 调用中,我然后将 alpha 和大小映射到 display
,并使用 transition_time(time)
在帧中移动。
# Create prep table
fade_time = 1
frame_count = 100
frames_per_time = 10
df2 <- map_df(seq_len(frame_count), ~df, .id = "time") %>%
mutate(time = as.numeric(time)/frames_per_time,
delta_norm = (t - time) / fade_time,
display = if_else(abs(delta_norm) > 1, 0, cos(pi / 2 * delta_norm)))
# Create animation
g <- ggplot(df2, aes(x = x, y = y, alpha = display, size = display))
g <- g + geom_point(colour = "#FF3300", shape = 19)
g <- g + scale_alpha(range = c(0, 1)) + scale_size_area(max_size = 5)
g <- g + labs(title = "{round(frame_time, 1)}")
g <- g + transition_time(time)
animate(g)
我有以下数据框:
# Seed RNG
set.seed(33550336)
# Create data frame
df <- data.frame(x = runif(100),
y = runif(100),
t = runif(100, min = 0, max = 10))
我想绘制点(即在 x
和 y
坐标处)随 t
出现和消失的情况。 gganimate
很棒,所以我用了它。
# Load libraries
library(gganimate)
library(ggplot2)
# Create animation
g <- ggplot(df, aes(x = x, y = y))
g <- g + geom_point(colour = "#FF3300", shape = 19, size = 5, alpha = 0.25)
g <- g + labs(title = 'Time: {frame_time}')
g <- g + transition_time(t)
g <- g + enter_fade() + exit_fade()
animate(g, fps = 1)
此代码生成以下内容:
有几点我不喜欢这个。
- 转换非常突然。我希望使用
enter_fade
和exit_fade
时点会淡入视野,然后退出。显然情况并非如此,但我如何达到这个结果呢? - 我想四舍五入
{frame_time}
,这样当点在t
的分数处淡入淡出时,显示的实际时间t
将是一个整数.如果frame_time
是一个常规变量,那么使用bquote
和round
之类的东西就足够简单了,但情况似乎并非如此。如何在我的标题中舍入frame_time
?
这是一种相对手动的方法,它依赖于事先做更多的准备工作并将其输入 gganimate
。我想看看是否有更简单的方法可以在 gganimate
中更自动地执行此操作。
首先,我为要显示的每个帧复制了一个数据帧。然后我计算我目前正在查看的时间 (time
) 和我想要显示每个数据点的 t
之间的差异。我使用 cos
来处理缓入和缓出,因此每个点在给定时间的出现都用 display
来描述。在 ggplot 调用中,我然后将 alpha 和大小映射到 display
,并使用 transition_time(time)
在帧中移动。
# Create prep table
fade_time = 1
frame_count = 100
frames_per_time = 10
df2 <- map_df(seq_len(frame_count), ~df, .id = "time") %>%
mutate(time = as.numeric(time)/frames_per_time,
delta_norm = (t - time) / fade_time,
display = if_else(abs(delta_norm) > 1, 0, cos(pi / 2 * delta_norm)))
# Create animation
g <- ggplot(df2, aes(x = x, y = y, alpha = display, size = display))
g <- g + geom_point(colour = "#FF3300", shape = 19)
g <- g + scale_alpha(range = c(0, 1)) + scale_size_area(max_size = 5)
g <- g + labs(title = "{round(frame_time, 1)}")
g <- g + transition_time(time)
animate(g)