Как изменить порядок анимации в каждом штате? - PullRequest
0 голосов
/ 25 февраля 2020

В настоящее время я работаю с gganimate и не могу найти способ правильно упорядочить столбики барплота. Я хочу представлять среднее по стране, с анимацией по годам. Я думаю, что нашел, как это сделать (см. Ниже), но я не могу найти, как заказать (и изменить порядок) страну каждый год. Я привожу пример ниже.

Я пытался с fct_reorder (), но я не могу даже получить один год с правильным порядком.

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

d <- tibble(country = as.factor(sample(c("France", "Germany", "UK"), 100, replace = TRUE)),
            year = sample(c(2000, 2002, 2004, 2006), 100, replace = TRUE),
            revenu = rnorm(100, mean = 1500, sd= 400))

d %>% group_by(country, year) %>%
  summarise(avg_revenu = mean(revenu, na.rm = TRUE)) %>%
  ggplot(aes(fct_reorder(country, avg_revenu), avg_revenu)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  transition_states(year, transition_length = 1, state_length = 1) +
  ggtitle("{closest_state}")

Я нашел эту страницу: Как gganimate упорядочивает временные ряды упорядоченного бара? , но я признаю, что не полностью понимаю процесс, и мое "среднее" "испорти мне голову ...

Кто-нибудь может мне помочь с этим? Спасибо!

1 Ответ

0 голосов
/ 02 марта 2020

Поскольку я получил свой собственный ответ, я публикую его здесь, на всякий случай, если он может помочь кому-то еще.

1) Рейтинг: идея состоит в том, чтобы вычислить «среднее число мест» по стране и году, и затем вычислять порядок страны по avg_revenu каждый год.

2) График: хитрость заключается в том, чтобы не использовать реальный столбик, а использовать geom_tile.

#example constitution
d <- tibble(
country = as.factor(sample(
  c("France", "Germany", "UK"), 100, replace = TRUE
)),
year = sample(c(2000, 2002, 2004, 2006), 100, replace = TRUE),
revenu = rnorm(100, mean = 1500, sd = 400)
  )

#ranking
d2 <- d %>% group_by(country, year) %>% summarise(avg_revenu = mean(revenu, na.rm = TRUE)) %>% arrange(year, avg_revenu) %>% group_by(year) %>% mutate(order = min_rank(avg_revenu) * 1.0) %>% ungroup()

#animation object
anim <- d2 %>%
  ggplot(aes(order, group = country)) +
  geom_tile(aes(
    y = avg_revenu / 2,
    height = avg_revenu,
    width = 0.9
  ), fill = "grey50") +
  theme(axis.text.y = element_blank(), axis.title.y = element_blank()) +
  scale_y_continuous(name = "Average revenu", breaks = c(0,500,1000,1500), limits = c(-500,NA)) +
  transition_states(year, transition_length = 1, state_length = 3) +
  geom_text(aes(y = 0, label = country), hjust = "right") +
  coord_flip(clip = "off") +
  ggtitle("{closest_state}")

#animation
animate(anim, nframes = 100)
...