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)