gganimate: включить в выражение заголовка дополнительную переменную, отличную от переменной уровня состояния или фрейма - PullRequest
0 голосов
/ 20 декабря 2018

Я хотел бы вставить другое значение столбца моих данных в gganimate заголовок анимации.

Пример, здесь переменная уровня состояний - x, и я быхотел бы добавить в заголовок переменную y:

df <- tibble(x = 1:10, y = c('a', 'a', 'b', 'd', 'c', letters[1:5]))
df

A tibble: 10 x 2
       x y    
   <int> <chr>
 1     1 a    
 2     2 a    
 3     3 b    
 4     4 d    
 5     5 c    
 6     6 a    
 7     7 b    
 8     8 c    
 9     9 d    
10    10 e 

Это работает, как и ожидалось:

ggplot(df, aes(x, x)) +
  geom_point() +
  labs(title = '{closest_state}') +
  transition_states(x,
                    transition_length = 0.1,
                    state_length = 0.1)

enter image description here

Это не удается:

ggplot(df, aes(x, x)) +
  geom_point() +
  labs(title = '{closest_state}, another_var: {y}') +
  transition_states(x,
                    transition_length = 0.1,
                    state_length = 0.1)

Ошибка в eval (parse (text = text, keep.source = FALSE), envir):
объект 'y' не найден

Также пробовал это, но y не изменится:

ggplot(df, aes(x, x)) +
  geom_point() +
  labs(title = str_c('{closest_state}, another_var: ', df$y)) +
  transition_states(x,
                    transition_length = 0.1,
                    state_length = 0.1)

enter image description here

Другой вариант - отобразить y как переменную уровня состоянийи используйте переменную frame вместо x, но в моем приложении y является либо необязательно уникальной символьной переменной, как указано выше, либо это числовая переменная, но опять-таки не обязательно уникальная и не обязательно-приказал.В этом случае gganimate (или ggplot?) Упорядочит его так, как считает нужным, в результате чего окончательный результат будет странным, а не порядок x:

ggplot(df, aes(x, x)) +
  geom_point() +
  labs(title = '{frame}, another_var: {closest_state}') +
  transition_states(y,
                    transition_length = 0.1,
                    state_length = 0.1)

enter image description here

Так как просто добавить изменяющееся значение неупорядоченной, не числовой переменной y?

Наконец: этот вопрос был задан здесь , но безвоспроизводимый пример, на который не было ответа, надеясь, что этот будет лучше.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Еще одна возможность, чуть более компактная, от самого автора gganimate, после того, как я открыл вопрос:

https://github.com/thomasp85/gganimate/issues/252#issuecomment-450846868

По словам Томаса:

Существует несколько причин, по которым случайные столбцы из входных данных не могут быть доступны, поэтому вряд ли это будет лучше, чем это ...

0 голосов
/ 20 декабря 2018

Одним грязным решением было бы paste собрать вместе переменные и создать новое для использования в transition_states:

df <- mutate(df, title_var = factor(paste(x, y, sep="-"), levels = paste(x, y, sep="-")))
# # A tibble: 6 x 3
# x y     title_var
# <int> <chr> <fct>    
# 1     1 a     1-a      
# 2     2 a     2-a      
# 3     3 b     3-b      
# 4     4 d     4-d      
# 5     5 c     5-c      
# 6     6 a     6-a  

Тогда мы могли бы использовать gsub() в ordet для удаления closest_state из нежелательной части, как это:

gsub(pattern = "\\d+-", replacement = "", "1-a") 
"a"

Итак:

ggplot(df, aes(x, x)) +
  geom_point() +
  labs(title = '{gsub(pattern = "\\d+-", replacement = "", closest_state)}') +
  transition_states(title_var, transition_length = 0.1, state_length = 0.1)

enter image description here

...