Анимированные точки и линия регрессии вдоль даты с помощью gganimate () - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь оживить точки и линию регрессии Лесса, чтобы они появлялись / появлялись одновременно в течение года, но я вернулся с ошибкой, как описано ниже с представлением.

Это будет быть идеальной анимацией: https://user-images.githubusercontent.com/1775316/49728400-f0ba1b80-fc72-11e8-86c5-71ed84b247db.gif К сожалению, у нити, в которой я нашел это, не было сопровождающего кода.

См. мою проблему с представлением здесь:

#Animate points and regression loess line along with dates at the same time
library(MASS) #for phones reprex dataset
phones <- data.frame(phones) #Prepare reprex data
library(ggplot2) #for plotting
library(gganimate) #for animation

#Animation
ggplot(phones, aes(x = year, y = calls)) +
  geom_point() + geom_smooth(method = "loess", colour = "orange",
                             se = FALSE) +
  transition_time(year) + shadow_mark() + ease_aes("linear")

Это возвращает ошибку:

Error in `$<-.data.frame`(`*tmp*`, "group", value = "") : 
  replacement has 1 row, data has 0

Некоторые предлагают мне вставить aes(group = year) в geom_smooth(), но это возвращает ту же ошибку.

Заранее спасибо за вашу помощь!

1 Ответ

2 голосов
/ 26 марта 2020

Попробуйте сначала вычислить значение линии лесса в каждой из ваших точек данных, а затем отобразите это значение как go. Чтобы сделать линию более гладкой, вы можете предсказать значения в кадре данных, который имеет больше значений для «года». Вам нужно убедиться, что у вас есть библиотека transformr. Спасибо @paqmo за предложение использовать transition_reveal и OP для подсказки группы!

library(transformr)
smooth_vals = predict(loess(calls~year,phones))
phones$smooth_vals <- smooth_vals


#Animation
anim <- ggplot(phones, aes(x = year, y = calls)) +
  geom_point(aes(group = seq_along(year))) + 
  geom_line(aes(y = smooth_vals), colour = "orange") +
  transition_reveal(year) + 
  #shadow_mark() + 
  ease_aes("linear")

animate(anim, fps = 10, duration = 2)

the final animation

Если вы хотите изменить форму линия лесса, просто добавьте аргумент span к функции лесса:

smooth_vals = predict(loess(calls~year,phones, span = 1))
phones$smooth_vals <- smooth_vals

Вот как это выглядит - обратите внимание на более плотное прилегание к точкам:

graph with points and lines appearing but with closer loess fit

Этот сайт - отличный ресурс для gganimate, он помог мне найти решение: https://www.datanovia.com/en/blog/gganimate-how-to-create-plots-with-beautiful-animation-in-r/

...