Совокупные участки в гганимате 0.9.9.9 - PullRequest
0 голосов
/ 18 октября 2018

Мне не удалось найти ранее опубликованный вопрос, который достаточно ответил на этот вопрос.В предыдущих сообщениях принятые ответы использовали shadow_mark, чтобы сохранить постоянство ранее отображенных слоев.

Как сохранить предыдущие слои данных при выполнении анимации в R gganimate?

Сохранить точки в gganimate

ЭтоХороший обходной путь при отображении выходных данных в диаграмме рассеяния, но это не кумулятивное измерение, и оно не выполняется, например, при попытке сделать гистограмму с накоплением.

Рассмотрим следующие данные.Я хочу построить накопительную гистограмму с накоплением, используя переходное состояние в моей df.

df <- data.frame(t = c(2000, 2000, 2001, 2001, 2002, 2002), f = c("y", "n", "y", "n", "y", "n"), x = c("a", "a", "b", "c", "a", "c"), y = c(2,3,5,1,4,8))

> df t f x y 1 2000 y a 2 2 2000 n a 3 3 2001 y b 5 4 2001 n c 1 5 2002 y a 4 6 2002 n c 8

Я хочу отобразить данные из2000, и в следующем слое я хочу добавить данные за 2001 год как совокупные с предыдущим слоем.И снова, для следующего слоя я хочу добавить данные за 2002 год как кумулятивные с 2000 и 2001 годами.

Это показывает, почему shadow_mark не является решением для кумулятивных данных:

ggplot(df, aes(x=x, y=y, fill=f)) +
geom_col() + labs(x=NULL, y=NULL, fill=NULL, title="{closest_state}") +
transition_states(t, transition_length = 2, state_length = 1) +
shadow_mark() + enter_fade() + exit_shrink() + ease_aes('sine-in-out') + theme_bw() 

shadow_mark

Добавление вызова shadow_mark не приведет к желаемым результатам кумулятивного графика.«a» должно иметь суммарное значение 9.

Можно было бы разделить данные на 3 различных значения df для c(2000), c(2000,2001) и c(2000,2001,2002), а затем rbind после создания новогоКолонка штатов, но это похоже на очень хакерский подход.

Есть ли более чистый способ отображения совокупных данных с помощью инструментов, встроенных в gganimate?

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете создать новый столбец в данных с аддитивным результатом для каждого года и построить его напрямую.В приведенном ниже коде мы делаем это с помощью функции cumsum.Мы также используем complete, чтобы обеспечить наличие строки t для каждой комбинации f и x (установка y=0 в этих добавленных строках).Если мы этого не сделаем, накопленная сумма будет неправильной, если отсутствуют некоторые годы (значения t) для некоторых комбинаций f и x.Все преобразования данных выполняются на лету с помощью dplyr трубы:

library(tidyverse)
library(gganimate)

ggplot(df %>% 
         complete(t, nesting(f, x), fill=list(y=0)) %>% 
         arrange(t) %>%  
         group_by(x,f) %>%
         mutate(y_cum = cumsum(y)), 
       aes(x=x, y=y_cum, fill=f)) +
  geom_col() + 
  labs(x=NULL, y=NULL, fill=NULL, title="{closest_state}") +
  transition_states(t, transition_length = 2, state_length = 1) +
  enter_fade() + ease_aes('sine-in-out') + 
  theme_bw() +
  scale_y_continuous(breaks=0:10)

enter image description here

...