当前,我正在使用library(“ 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) %>%
top_n(n=5) %>%
# A tibble: 10 x 4
# Groups: year [2]
# 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 Emma F 2015 20435
# 7 Olivia F 2015 19669
# 8 Noah M 2015 19613
# 9 Liam M 2015 18355
#10 Sophia F 2015 17402
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,则可以按年份进行汇总。但是我们保留了动画的制作年限。
对于绘图,我们将ggplot与geom_text_wordcloud
函数一起使用。
gg <- babyyears %>%
ggplot(aes(label = name, size=n)) +
geom_text_wordcloud() +
theme_minimal()
然后是多年的过渡。
gg2 <- gg + transition_time(year) +
labs(title = 'Year: {frame_time}')
我想在结尾处添加一个暂停,否则动画会在完成后立即滚动到开头。
animate(gg2, end_pause=30)
anim_save("gg_anim_wc.gif")
很难跟踪所有名字(尤其是男孩),并将它们全部放在随机位置。也许放慢速度会有所帮助。但是,从该图形中最突出的名称是“玛丽”,这是1915年最常用的名称,但随后逐渐开始在本世纪下半叶逐渐消失。