Это связано с тем, что gganmiate
использует фиксированное число 100 кадров для анимации. На срок до 50 лет (обратите внимание, что 1670:1719
имеет длину 50, а не 49), это нормально, но если вы хотите построить больше лет, вам нужно больше кадров. Вы можете контролировать количество кадров, явно вызвав animate()
.
Для вашего примера это означает, что вы должны сначала сохранить свой график в переменной:
p <- ggplot(df) +
geom_point(aes(x = x, y = y, fill = z, size = u), shape = 21) +
labs( title = 'Year: {closest_state}') +
enter_appear() +
transition_states(year, transition_length = 1, state_length = 2)
Затем вы можете запустить анимацию, набрав любой из следующих символов
p
animate(p)
animate(p, nframes = 100)
Эти три строки эквивалентны. Первый - то, что вы сделали в своем примере: это будет неявно вызывать animate()
для рендеринга анимации. Вторая строка делает вызов animate()
явным, а третья также явно устанавливает количество кадров равным 100. Поскольку nframes = 100
является значением по умолчанию, эта последняя строка также делает то же самое, что и остальные.
Чтобы анимация работала, вам нужно установить большее количество кадров. 100 кадров работали в течение 50 лет, поэтому 182 кадра должны работать в течение 91 года в вашем полном кадре данных. Опять же, следующие две строки одинаковы:
animate(p, nframes = 182)
animate(p, nframes = 2 * length(unique(df$year)))
А теперь работает:
Я не знаю наверняка, почему вам нужно вдвое больше кадров, чем у вас лет, но после прочтения следующего утверждения из документации по transition_states()
Затем выполняется анимация между определенными состояниями и паузами в каждом состоянии.
Я бы предположил, что один кадр используется для перехода между двумя годами, а один кадр используется для представления даты для данного года.
Это будет означать, что вам на самом деле нужен один кадр, который вдвое меньше количества лет, потому что для перехода после прошлого года не требуется никаких кадров. Действительно, вывод из gganimate()
для nframes = 100
и nframes = 182
соответственно составляет:
Frame 99 (100%)
Finalizing encoding... done!
Frame 181 (100%)
Finalizing encoding... done!
Таким образом, это действительно создает именно то количество кадров, которое следует ожидать, если мое предположение было правильным.