3

我有以下数据框:

# Seed RNG
set.seed(33550336)

# Create data frame
df <- data.frame(x = runif(100), 
                 y = runif(100), 
                 t = runif(100, min = 0, max = 10))

我想绘制点(即 atxy坐标)作为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)

此代码产生以下内容:

在此处输入图像描述

有几件事我不喜欢这个。

  1. 过渡非常突然。我希望使用enter_fadeandexit_fade是这些点会淡入视野,然后退出。显然情况并非如此,但我如何实现这个结果?
  2. 我想对 进行舍入{frame_time},以便当点以 的分数淡入和淡出时,将显示t的实际时间t将是一个整数。如果frame_time是一个常规变量,使用类似的东西就足够简单了bquoteround但情况似乎并非如此。我怎样才能frame_time在我的标题中四舍五入?
4

1 回答 1

2

这是一种相对手动的方法,它依赖于预先做更多的准备工作并将其输入gganimate. 我想看看是否有更简单的方法可以在内部gganimate更自动地执行此操作。

首先,我为要显示的每一帧复制数据帧。然后我计算我目前正在查看的时间 ( time) 和t我想要显示每个数据点的时间之间的差异。我cos用来处理缓入和缓出,因此每个点在给定时间的外观都用display. 在 ggplot 调用中,我将 alpha 和 size 映射到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)

在此处输入图像描述

于 2018-11-12T23:55:21.403 回答