есть ли какой-либо способ создать анимацию (gganimate) с диапазонами в качестве времени перехода?

#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. большое вам спасибо. первый предложенный вами подход — это именно то, что я искал!