Как анимировать метку оси с помощью `gganimate`? - PullRequest
0 голосов
/ 27 апреля 2019

Я на самом деле очень удивлен, увидев, что не могу быстро найти руководство, как это сделать.Вот пример:

library(ggplot2)
library(gganimate)
library(data.table)
library(magrittr)

dt <- lapply(seq(10), function(i){
    mean = i
    label = paste0("T = ", i)
    dt = data.table(x = seq(0, 50, length.out = 100))
    set(dt, j = "y", value = dt[, dlnorm(x, meanlog = log(mean), sdlog = 0.2)])
    set(dt, j = "frameN", value = i)
    return(dt)
}) %>% rbindlist

print(dt)

p <- ggplot(dt, aes(x = x, y = y)) +
  geom_line() +
  scale_x_continuous(name = "x", breaks = c(0, 1)) +
  transition_manual(frameN)

animate(p)

Я хочу, чтобы breaks и labels из scale_x_continuous следовали моим собственным определениям:

arr_breaks <- c(1, 3, 2, 4, 3, 5, 4, 6, 5, 7)
arr_labels <- paste0(seq(10, 100, 10), " kg")

И затем

  • breaks = arr_breaks[1], labels = arr_labels[1] для кадра 1
  • breaks = arr_breaks[2], labels = arr_labels[2] для кадра 2

...

  • breaks = arr_breaks[10], labels = arr_labels[10] для кадра 10

Независимо от того, как я это делаю, я получаю ошибки.Есть идеи?

1 Ответ

0 голосов
/ 27 апреля 2019

Как заметил @ z-lin, gganimate в настоящее время не настроен (насколько мне известно) для анимации весов с различными перерывами.Эффект может быть близко аппроксимирован с использованием геомов, и с некоторыми дополнительными работами вы, вероятно, сможете точно визуально подобрать изменяющийся масштаб.

breaks_df <- data.frame(

frameN = c(1:10),
  arr_breaks = c(1, 3, 2, 4, 3, 5, 4, 6, 5, 7),
  arr_labels = paste0(seq(10, 100, 10), " kg")
)

p <- ggplot(dt, aes(x = x, y = y)) +
  geom_segment(data = breaks_df, color = "white",
               aes(x = arr_breaks, xend = arr_breaks,
                   y = -Inf, yend = Inf)) +
  geom_text(data = breaks_df, vjust = 3, size = 3.5, color = "gray30",
            aes(x = arr_breaks, y = 0, label = arr_labels)) +
  geom_line() +
  scale_x_continuous(name = "x", breaks = c(0)) +
  coord_cartesian(clip = "off") +
  transition_manual(frameN)
animate(p, width = 600, height = 250)

enter image description here

...