【问题标题】:Rounding frame_time and smooth transitions for gganimategganimate 的舍入 frame_time 和平滑过渡
【发布时间】:2019-04-06 18:31:40
【问题描述】:

我有以下数据框:

# Seed RNG
set.seed(33550336)

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

我想绘制作为t 函数出现和消失的点(即xy 坐标)。 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_fadeexit_fade 是这些点会淡入视野,然后退出。显然情况并非如此,但我将如何 实现这个结果?
  2. 我想对{frame_time} 进行四舍五入,这样当点在t 的分数处淡入和淡出时,将显示的实际时间t 将是一个整数。如果frame_time 是一个常规变量,那么使用bquoteround 之类的就足够简单了,但情况似乎并非如此。如何在我的标题中舍入 frame_time

【问题讨论】:

  • 对于第 2 部分,您可以使用Time: {round(frame_time,2)} 来完成时间。
  • @MrFlick 效果很好。您能否向我指出一些文档或 SO 答案,以解释与标题中的花括号和 frame_time 相关的情况?

标签: r ggplot2 gganimate


【解决方案1】:

这是一种相对手动的方法,它依赖于预先做更多的准备工作并将其输入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)

【讨论】:

  • 谢谢。我希望在gganimate 中已经实现了一种简单的方法,但这解决了问题。
  • {code in here} 表示法实际上非常聪明。它允许您计算您通常会在 R 中执行的任何操作,即 - labs(title = Time: "{round(frame_time, 1)}, Year = {2000 + round(frame_time, 1)}")
猜你喜欢
  • 2019-07-04
  • 2019-07-06
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2020-07-23
相关资源
最近更新 更多