Упорядочение баров выполняется ggplot
и не зависит от gganimate
.Бары упорядочены по сумме DIAG_RATE_65_PLUS
в каждом ACH_DATEyearmon
.Ниже я покажу, как упорядочены полосы, а затем предоставлю код для создания анимированного графика с желаемой сортировкой от низкого до высокого в каждом кадре.
Чтобы увидеть, как упорядочены полосы, сначала давайте создадим некоторую подделкуdata:
library(tidyverse)
library(gganimate)
theme_set(theme_classic())
# Fake data
dates = paste(rep(month.abb, each=10), 2017)
set.seed(2)
df = data.frame(NAME=c(replicate(12, sample(LETTERS[1:10]))),
ACH_DATEyearmon=factor(dates, levels=unique(dates)),
DIAG_RATE_65_PLUS=c(replicate(12, rnorm(10, 30, 5))))
Теперь давайте сделаем один столбчатый график.Столбцы представляют собой сумму DIAG_RATE_65_PLUS
для каждого NAME
.Обратите внимание на порядок значений оси x NAME
:
df %>%
ggplot(aes(reorder(NAME, DIAG_RATE_65_PLUS), DIAG_RATE_65_PLUS)) +
geom_bar(stat = "identity", alpha = 0.66) +
labs(title='{closest_state}') +
theme(plot.title = element_text(hjust = 1, size = 22))
![enter image description here](https://i.stack.imgur.com/WYWAD.png)
Ниже вы можете видеть, что порядок одинаков, когда мы явносумма DIAG_RATE_65_PLUS
по NAME
и сортировка по сумме:
df %>% group_by(NAME) %>%
summarise(DIAG_RATE_65_PLUS = sum(DIAG_RATE_65_PLUS)) %>%
arrange(DIAG_RATE_65_PLUS)
NAME DIAG_RATE_65_PLUS
1 A 336.1271
2 H 345.2369
3 B 346.7151
4 I 350.1480
5 E 356.4333
6 C 367.4768
7 D 368.2225
8 F 368.3765
9 J 368.9655
10 G 387.1523
Теперь мы хотим создать анимацию, которая сортирует NAME
по DIAG_RATE_65_PLUS
отдельно длякаждый ACH_DATEyearmon
.Чтобы сделать это, давайте сначала сгенерируем новый столбец с именем order
, который устанавливает желаемый порядок:
df = df %>%
arrange(ACH_DATEyearmon, DIAG_RATE_65_PLUS) %>%
mutate(order = 1:n())
Теперь мы создадим анимацию.transition_states
генерирует кадры для каждого ACH_DATEyearmon
.view_follow(fixed_y=TRUE)
показывает значения x только для текущего ACH_DATEyearmon
и поддерживает одинаковый диапазон оси Y для всех кадров.
Обратите внимание, что мы используем order
в качестве переменной x, но затем мы запускаем scale_x_continuous
, чтобы изменить x-метки на значения NAME
.Я включил эти метки в график, чтобы вы могли видеть, что они меняются с каждым ACH_DATEyearmon
, но вы, конечно, можете удалить их на вашем реальном графике, как вы это делали в своем примере.
p = df %>%
ggplot(aes(order, DIAG_RATE_65_PLUS)) +
geom_bar(stat = "identity", alpha = 0.66) +
labs(title='{closest_state}') +
theme(plot.title = element_text(hjust = 1, size = 22)) +
scale_x_continuous(breaks=df$order, labels=df$NAME) +
transition_states(ACH_DATEyearmon, transition_length = 1, state_length = 50) +
view_follow(fixed_y=TRUE) +
ease_aes('linear')
animate(p, nframes=60)
anim_save("test.gif")
![enter image description here](https://i.stack.imgur.com/vYIWi.gif)
Если вы отключите view_follow()
, вы сможете увидеть, как выглядит «весь» график (и вы можете, конечно, увидеть полный неанимированный график с помощьюостановка кода перед transition_states
).
p = df %>%
ggplot(aes(order, DIAG_RATE_65_PLUS)) +
geom_bar(stat = "identity", alpha = 0.66) +
labs(title='{closest_state}') +
theme(plot.title = element_text(hjust = 1, size = 22)) +
scale_x_continuous(breaks=df$order, labels=df$NAME) +
transition_states(ACH_DATEyearmon, transition_length = 1, state_length = 50) +
#view_follow(fixed_y=TRUE) +
ease_aes('linear')
![enter image description here](https://i.stack.imgur.com/VeRbv.gif)
ОБНОВЛЕНИЕ : Чтобы ответить на ваши вопросы ...
Чтобы упорядочить значения за определенный месяц, превратите данные в коэффициент с уровнями, упорядоченными по этому месяцу.Для построения повернутого графика вместо coord_flip
мы будем использовать geom_barh
(горизонтальная линейная диаграмма) из пакета ggstance
.Обратите внимание, что мы должны переключать y и x в aes
и view_follow()
и что порядок значений оси y NAME
теперь постоянен:
library(ggstance)
# Set NAME order based on August 2017 values
df = df %>%
arrange(DIAG_RATE_65_PLUS) %>%
mutate(NAME = factor(NAME, levels=unique(NAME[ACH_DATEyearmon=="Aug 2017"])))
p = df %>%
ggplot(aes(y=NAME, x=DIAG_RATE_65_PLUS)) +
geom_barh(stat = "identity", alpha = 0.66) +
labs(title='{closest_state}') +
theme(plot.title = element_text(hjust = 1, size = 22)) +
transition_states(ACH_DATEyearmon, transition_length = 1, state_length = 50) +
view_follow(fixed_x=TRUE) +
ease_aes('linear')
animate(p, nframes=60)
anim_save("test3.gif")
![enter image description here](https://i.stack.imgur.com/e3482.gif)
Для плавных переходов похоже, что ответ @ JonSpring хорошо с этим справляется.