#r #ggplot2 #gganimate
#r #ggplot2 #gganimate
Вопрос:
Есть ли какой-либо способ заставить gganimate работать для времен перехода, которые являются диапазонами лет? В моих данных у меня есть три временных точки, две из которых являются диапазонами, как показано ниже.
данные:
Year rate group
2012-2014 7 Other CT, White
2015-2017 11 Other CT, White
2018 3 Fairfield, Black
2018 2 Fairfield, Hispanic
вот пример кода для ggplot, который я хотел бы анимировать
data %>% ggplot(aes(y = rate, x = group))
geom_col()
coord_flip()
labs(title = "Year: {frame_time}")
transition_time(Year)
когда я ввожу время перехода как «Год», я получаю сообщение об ошибке, потому что моя переменная Year является символом для размещения диапазонов. Это ошибка, которую я получаю:
Error: time data must either be integer, numeric, POSIXct, Date, difftime, orhms
могу ли я что-нибудь сделать, чтобы обойти эту ошибку и продолжить работу с диапазонами в их нынешнем виде?
Комментарии:
1. Создайте новый столбец с ячейками year (например,
ggplot2::cut_interval
), а затем используйте эту переменную вtransition_time
?
Ответ №1:
Я бы предложил либо использовать transition_manual
и рассматривать годы как категории (что приводит к потере плавного перехода), либо преобразовать диапазон лет в числа.
library(tidyverse); library(gganimate)
df1 <- tribble(~Year, ~rate, ~group,
"2012-2014", 7, "grp1",
"2015-2017", 11, "grp1",
"2018", 3, "grp1")
Первый подход, сохраняя год как есть в качестве символа:
df1 %>%
ggplot(aes(y = rate, x = group))
geom_col()
coord_flip()
labs(title = "Year: {current_frame}")
transition_manual(Year)
Второй подход, преобразование года в числовое значение. В этом случае я просто использовал первый год, но вы могли бы в качестве альтернативы присвоить значение среднему году или добавить строки со значением для каждого года в диапазоне.
df1 %>%
mutate(Year_numeric = parse_number(Year)) %>%
ggplot(aes(y = rate, x = group))
geom_col()
coord_flip()
labs(title = "Year: {round(frame_time)}")
transition_time(Year_numeric)
Наконец, если вы хотите представить все годы с диапазонами на заданном уровне, вы можете создать строки для всех лет компонента. Но для этого требуется некоторая смазка для локтя:
df1 %>%
# For ranged years, find how many in range:
mutate(year_num = 1 if_else(Year %>% str_detect("-"),
str_sub(Year, start = 6) %>% as.numeric() -
str_sub(Year, end = 4) %>% as.numeric(),
0)) %>%
# ... and use that to make a row for each year in the range
tidyr::uncount(year_num) %>%
group_by(Year) %>%
mutate(Year2 = str_sub(Year, end = 4) %>% as.numeric()
row_number() - 1) %>%
ungroup() %>%
# FYI at this point it looks like:
# A tibble: 7 x 4
# Year rate group Year2
# <chr> <dbl> <chr> <dbl>
#1 2012-2014 7 grp1 2012
#2 2012-2014 7 grp1 2013
#3 2012-2014 7 grp1 2014
#4 2015-2017 11 grp1 2015
#5 2015-2017 11 grp1 2016
#6 2015-2017 11 grp1 2017
#7 2018 3 grp1 2018
ggplot(aes(y = rate, x = group))
geom_col()
coord_flip()
labs(title = "Year: {round(frame_time)}")
transition_time(Year2)
Комментарии:
1. большое вам спасибо. первый предложенный вами подход — это именно то, что я искал!