R 为gganimate取整帧_时间并平滑过渡
我有以下数据框:R 为gganimate取整帧_时间并平滑过渡,r,ggplot2,gganimate,R,Ggplot2,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)) 该代码生成了以下内容: 关于这件事,有几件事我不喜欢 这种转变非常突然。我希望使用enter\u fade和exit\u fade
# Seed RNG
set.seed(33550336)
# Create data frame
df <- data.frame(x = runif(100),
y = runif(100),
t = runif(100, min = 0, max = 10))
该代码生成了以下内容:
关于这件事,有几件事我不喜欢
enter\u fade
和exit\u fade
可以让这些点淡入视野,然后退出。显然情况并非如此,但我将如何实现这一结果李>
{frame\u time}
进行四舍五入,这样当点在t
的分数处淡入淡出时,实际显示的时间t
将是一个整数。如果frame\u time
是一个规则变量,那么使用bquote
和round
这样的方法就足够简单了,但情况似乎并非如此。如何在我的标题中循环frame\u time
李>
这里有一个相对手动的方法,它依赖于事先做更多的准备工作,并将其输入
gganimate
。我想看看是否有一种更简单的方法可以在gganimate
中更自动地执行此操作
首先,我为要显示的每个帧制作一个数据帧的副本。然后计算当前查看的时间(time
)与要显示每个数据点时的t
之间的差值。我使用cos
来处理输入和输出,这样每个点在给定时间的外观都用display
来描述。在ggplot调用中,我将alpha和size映射到display
,并使用transition\u 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)
#创建准备表
衰减时间=1
帧计数=100
每分钟帧数=10
df2%
变异(时间=数值(时间)/帧/时间,
delta_norm=(t-时间)/衰减_时间,
显示=if_-else(abs(delta_-norm)>1,0,cos(pi/2*delta_-norm)))
#创建动画
对于第2部分,您可以使用time:{round(frame\u time,2)}
@MrFlick对时间进行取整。你能给我指一些文档或一个SO答案,解释标题中花括号和frame\u time
的情况吗?谢谢。我希望有一种简单的方法可以在gganimate
中实现,但这解决了问题。{code in here}
符号实际上非常聪明。它允许您计算在R.i.e.-实验室中通常会做的任何事情(title=Time:{round(frame\u Time,1)},Year={2000+round(frame\u Time,1)}”)
。
# 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)