gganimate с несколькими точками для одного и того же значения x

#r #ggplot2 #gganimate

Вопрос:

У меня есть некоторые данные, в которых несколько значений координат y для одного значения координаты x. Он похож на тот, который включен в этот вопрос. Он также имеет state переменную, которая должна использоваться для transition_state() функции in gganimate .

 library(data.table)

df <- data.table(
  x = seq(11),
  type1 = c(2, 3, 2.5, 3, 2, 2, 3, 2.5, 3.5, 3, 2),
  type2 = c(NA, 3, 3.5, 3, NA, NA, 3, 3.5, 4, 3, NA)
)
m.df <- melt.data.table(df, "x", variable.name = "grp")
m.df[x %in% seq(5), "state" := 1][x %in% seq(6, 11), "state" := 2]
m.df
#>      x   grp value state
#>  1:  1 type1   2.0     1
#>  2:  2 type1   3.0     1
#>  3:  3 type1   2.5     1
#>  4:  4 type1   3.0     1
#>  5:  5 type1   2.0     1
#>  6:  6 type1   2.0     2
#>  7:  7 type1   3.0     2
#>  8:  8 type1   2.5     2
#>  9:  9 type1   3.5     2
#> 10: 10 type1   3.0     2
#> 11: 11 type1   2.0     2
#> 12:  1 type2    NA     1
#> 13:  2 type2   3.0     1
#> 14:  3 type2   3.5     1
#> 15:  4 type2   3.0     1
#> 16:  5 type2    NA     1
#> 17:  6 type2    NA     2
#> 18:  7 type2   3.0     2
#> 19:  8 type2   3.5     2
#> 20:  9 type2   4.0     2
#> 21: 10 type2   3.0     2
#> 22: 11 type2    NA     2
#>      x   grp value state
 

Данные строятся с использованием gganimate, как показано ниже.

 library(ggplot2)

ggplot(m.df, aes(x, value, group = grp, color = grp))  
  geom_line(na.rm = T)  
  geom_point(na.rm = T)  
  theme_bw()
 

С сюжетом можно ознакомиться ЗДЕСЬ

Я хочу использовать transition_state() функцию gganimate, используя столбец состояния в данных, как показано ниже, но показывает ошибку.

 library(gganimate)

ggplot(m.df, aes(x, value, group = grp, color = grp))  
  geom_line(na.rm = T)  
  geom_point(na.rm = T)  
  transition_states(state)
#> Error in rep(seq_len(nrow(polygon)), splits   1): invalid 'times' argument
 

Что я здесь делаю не так?

Заранее спасибо

Ответ №1:

Один из вариантов заставить ваш код работать-это группироваться по обоим grp и state использовать, например interaction . В противном gganimate случае не удается разделить ваши данные на state , так как оба состояния присутствуют в каждой группе. Кроме того, вы должны поставить group aes после color aes. В противном случае вы столкнетесь с той же проблемой:

 library(ggplot2)
library(gganimate)

ggplot(m.df, aes(x, value, color = grp, group = interaction(grp, state)))  
  geom_line(na.rm = T)  
  geom_point(na.rm = T)  
  transition_states(state)
 

введите описание изображения здесь