目前,我正在使用库(“wordcloud”)来制作我拥有的一些文本数据的常用术语的词云。文本数据还带有关联的年份,我希望能够根据年份生成新的词云,并且我希望使用像 gganimate 这样的库自动对其进行动画处理。有什么办法可以做到这一点吗?我想可视化随着时间的推移最常见的关键词,但我很挣扎。有小费吗?
最佳答案
是的,在ggwordcloud
包的帮助下。我将使用 babynames 数据集作为一个有趣的示例,了解 100 年来 5 个最常见的婴儿名字如何变化。首先,加载所需的包并加载数据。
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.
这只是为绘图设置数据。如果我们只想要一个静态词云,我们会聚合年份。但我们保留了动画的年份。
对于绘图,我们使用 ggplot 和 geom_text_wordcloud
函数。
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 年最常见的名字,但在本世纪后半叶开始慢慢失去流行度。
关于r - 有没有办法在 R 中制作词云动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61132650/