【问题标题】:Is there a way to animate a word cloud in R?有没有办法在 R 中为文字云设置动画?
【发布时间】:2020-07-22 18:02:03
【问题描述】:

目前,我正在使用库(“wordcloud”)来制作我拥有的一些文本数据的常用术语词云。文本数据还带有关联的年份,我希望能够根据年份生成新的词云,并且希望使用 gganimate 之类的库自动对其进行动画处理。有没有办法做到这一点?我想随着时间的推移可视化最常见的关键字,但我很挣扎。有小费吗?

【问题讨论】:

  • See here 提出一个人们可以帮助解决的 R 问题。这包括一个数据样本、所有必要的代码,以及对你正在尝试做什么和什么没有奏效的清晰解释。现在这对 SO 来说太宽泛了

标签: r data-visualization word-cloud gganimate


【解决方案1】:

是的,在 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.

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

对于绘图,我们使用带有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")

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

【讨论】:

  • 整洁。有没有办法限制每个特定名称的位置,所以它们不会在几年之间跳跃,只会变大/变小?此外,最好把女性名字放在(比如说)左半球,男性放在右边。
  • 是的 - 那是我想不通的事情。函数中有一个seed 参数来控制随机性,但它似乎无法修复单词。也许有人可以弄清楚...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2022-10-15
  • 2020-04-10
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多