Есть ли способ оживить облако слов в R? - PullRequest
0 голосов
/ 10 апреля 2020

В настоящее время я использую библиотеку («wordcloud»), чтобы превратить в облако слов частых терминов некоторые имеющиеся у меня текстовые данные. Текстовые данные также сопровождаются соответствующим годом, и я хочу иметь возможность генерировать новые облака слов на основе года, и я хочу, чтобы они автоматически анимировались с использованием библиотеки, такой как gganimate. Есть какой-либо способ сделать это? Я хочу визуализировать наиболее частые ключевые слова с течением времени, но я изо всех сил. Какие-нибудь советы?

1 Ответ

1 голос
/ 10 апреля 2020

Да, с помощью пакета 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")

enter image description here

Трудно отследить все имена (особенно мальчиков), когда все они расположены в случайных местах. Возможно замедление поможет. Но имя, которое больше всего выделяется из этого графика c, - «Мария», которое было самым распространенным именем в 1915 году, но затем постепенно начало терять популярность ко второй половине века.

...