有没有办法在 R 中为词云制作动画?

Is there a way to animate a word cloud in R?

目前,我正在使用库("wordcloud") 将我拥有的一些文本数据制作为常用术语的词云。文本数据还带有关联的年份,我希望能够根据年份生成新的词云,并且我希望使用 gganimate 之类的库将其自动动画化。有什么办法吗?我想随着时间的推移可视化最频繁的关键字,但我很挣扎。有小费吗?

是的,在 ggwordcloud 包的帮助下。我将使用 babynames 数据集作为一个有趣的例子来了解 5 个最常见的婴儿名字在 100 年内是如何变化的。首先加载需要的包,加载数据。

library(babynames)   # Data
library(dplyr)       # Data management
library(ggplot2)     # Graph framework
library(ggwordcloud) # Wordcloud using ggplot
library(gganimate)   # Animation

data(babynames)

下一个命令查找 1915 年和 2015 年每个性别的前 5 个名字,按年份分组。

babies <- babynames %>%
  filter(year %in% c(1915, 2015)) %>%
  group_by(name, sex, year) %>%
  summarise(n=sum(n)) %>%
  arrange(desc(n)) %>%
  group_by(year, sex) %>%
  top_n(n=5) %>%

# A tibble: 20 x 4
# Groups:   sex, year [4]
   name     sex    year     n
   <chr>    <chr> <dbl> <int>
 1 Mary     F      1915 58187
 2 John     M      1915 47577
 3 William  M      1915 38564
 4 James    M      1915 33776
 5 Helen    F      1915 30866
 6 Robert   M      1915 28738
 7 Dorothy  F      1915 25154
 8 Margaret F      1915 23054
 9 Joseph   M      1915 23052
10 Ruth     F      1915 21878
11 Emma     F      2015 20435
12 Olivia   F      2015 19669
13 Noah     M      2015 19613
14 Liam     M      2015 18355
15 Sophia   F      2015 17402
16 Mason    M      2015 16610
17 Ava      F      2015 16361
18 Jacob    M      2015 15938
19 William  M      2015 15889
20 Isabella F      2015 15594

  ungroup() %>%
  select(name, sex)

我在结束前暂停只是为了向您展示在省略年份和频率之前返回了哪些名称,因为我想将此数据与原始数据合并以获得 1915 年至 2015 年之间每 5 年的频率,而不是每个年,因为绘制时间太长。

这是连接。

babyyears <- babynames %>%
  inner_join(babies, by=c("name","sex")) %>%
  filter(year>=1915 & year %% 5 == 0) %>%  # Keep all years if you like
  mutate(year=as.integer(year))  # For animation. Not sure why this is required.

所以这只是为绘图设置数据。如果我们只想要一个静态词云,我们会汇总年份。但是我们保留动画的年份。

为了绘图,我们使用带有 geom_text_wordcloud 函数的 ggplot。

gg <- babyyears %>%
  ggplot(aes(label = name, size=n)) +
  geom_text_wordcloud() +
  theme_classic()

然后穿越岁月

gg2 <- gg + transition_time(year) +
  labs(title = 'Year: {frame_time}')

我喜欢在结尾加个停顿,否则动画一结束就直接滚到开头。

animate(gg2, end_pause=30)
anim_save("gg_anim_wc.gif")

很难跟踪所有名字(尤其是男孩),因为它们都被放置在随机位置。也许放慢速度会有所帮助。但从这张图中最突出的名字是 "Mary",它在 1915 年是最常见的名字,但在本世纪后半叶开始慢慢失去人气。