gganimate:包括除状态级别变量之外的其他变量或标题表达式中的框架

Gio*_*oni 5 r ggplot2 gganimate

我想将我的数据的另一列值插入到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 
Run Code Online (Sandbox Code Playgroud)

这按预期工作:

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

在此输入图像描述

这失败了:

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

另一个选择是映射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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那么如何简单地添加无序而非数字y变量的变化值?

最后:这个问题在这里被问到但是没有可重复的例子所以没有回答,希望这个问题更好.

RLa*_*ave 5

一种肮脏的解决方案是将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  
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用gsub()in ordet 来删除closest_state不需要的部分,如下所示:

gsub(pattern = "\\d+-", replacement = "", "1-a") 
"a"
Run Code Online (Sandbox Code Playgroud)

所以:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这有效:`labs(title = '{gsub(pattern = "[0-9]+-", replacement = "", Closest_state)}')`。谢谢! (2认同)