Да, с помощью пакета 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)
Следующая команда находит 5 лучших имен для каждого пола в 1915 и 2015 годах, сгруппированных по годам.
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)
I остановил его до конца, просто чтобы показать вам, какие имена были возвращены, прежде чем пропустить годы и частоту, потому что я хочу объединить эти данные с оригиналом, чтобы получить частоту каждые 5 лет между 1915 и 2015, а не каждый год, потому что это занимает слишком много времени к графику.
Вот соединение.
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.
Так что это просто настройка данных для графика. Если бы мы просто хотели получить словосочетание stati c, мы бы собрали данные за год. Но мы сохраняем годы для анимации.
Для построения графиков мы используем 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")
Трудно отследить все имена (особенно мальчиков), когда все они расположены в случайных местах. Возможно замедление поможет. Но имя, которое больше всего выделяется из этого графика c, - «Мария», которое было самым распространенным именем в 1915 году, но затем постепенно начало терять популярность ко второй половине века.