与wordclouds的subplot/facets

uli*_*a2_ 5 r facet ggplot2 word-cloud

我试图以一种令人赏心悦目的方式制作几个wordcloud的子图/方面.

问题:

  1. 我不能让基础R wordcloud正确地组合-outputs
  2. 制作wordclouds ggplot2允许刻面但产生不令人满意的结果(丑陋的定位)

我试过两种方法来创建这些wordcloud-subplots.

1.我创建一个示例数据集(以下这里):

library(dplyr)
library(janeaustenr)
library(tidytext)

df <- austen_books() %>%
  unnest_tokens(word, text) %>% 
  anti_join(stop_words, by = "word") %>%
  group_by(book) %>%
  count(word) %>% 
  top_n(100, n)
Run Code Online (Sandbox Code Playgroud)

2.我的第一次尝试使用wordcloud包和基础R:

library(wordcloud)

par(mfrow = c(2,2))
png("jane_austen_wordclouds.png")

df %>% 
  filter(book == "Sense & Sensibility") %>% 
  with(wordcloud(word, n))

df %>% 
  filter(book == "Pride & Prejudice") %>% 
  with(wordcloud(word, n))

df %>% 
  filter(book == "Mansfield Park") %>% 
  with(wordcloud(word, n))

df %>% 
  filter(book == "Emma") %>% 
  with(wordcloud(word, n))

title( "Jane Austen Word Clouds", outer = TRUE)
dev.off() 
Run Code Online (Sandbox Code Playgroud)

创建:

在此输入图像描述

所以它不知何故只保存了最后一个子图.如果我不使用png("jane_austen_wordclouds.png")dev.off()直接从RStudio保存图,那么我得到:

在此输入图像描述

这也不好,因为它以某种方式截断了顶部和底部的最后三个子图.

3.其次,我使用ggplot(灵感来自于此):

library(ggplot2)
library(ggrepel)

df %>%
  filter(book %in% c("Sense & Sensibility", "Pride & Prejudice",
                     "Mansfield Park", "Emma")) %>%
  ggplot(., aes(x = 1, y = 1, size = n, label = word)) +
  geom_text_repel(segment.size = 0, segment.alpha = 0) +
  scale_size(range = c(2, 15), guide = FALSE) +
  theme_void() +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1)) +
  facet_wrap(~book) +
  labs(title = "Jane Austen Word Clouds")
ggsave("jane_austen_gg.png", width = 11, height = 11)
Run Code Online (Sandbox Code Playgroud)

这创造了: 在此输入图像描述

沿着对角线看起来很奇怪.并且wordcloud看起来更好,因为它也垂直定位了一些单词.

可能没有办法将漂亮的wordcloud数字插入ggplot?

小智 1

我相信您可能会发现使用 gridGraphics 和 gridExtra 将绘图保存为对象而不是以排列方式再次绘制它们很有用。我测试了以下代码并且它有效。首先将每个图保存在不同的对象中,如下所示:

toPlot<-df %>% 
  filter(book == "Sense & Sensibility") 
wordcloud(toPlot$word, toPlot$n, max.words=100, random.order=FALSE, scale=c(3,0.5))
grid.echo()
a <- grid.grab()

#wordcloud2
toPlot2 <- df %>% 
  filter(book == "Pride & Prejudice") 
wordcloud(toPlot2$word, toPlot2$n, max.words=100, random.order=FALSE, scale=c(3,0.5))
grid.echo()
b <- grid.grab()

 #wordcloud3
 toPlot3 <- df %>% 
   filter(book == "Mansfield Park") 
 wordcloud(toPlot3$word, toPlot3$n, max.words=100, random.order=FALSE, scale=c(3,0.5))
grid.echo()
c <- grid.grab()

#wordcloud4
toPlot4 <- df %>% 
  filter(book == "Emma") 
wordcloud(toPlot4$word, toPlot4$n, max.words=100, random.order=FALSE, scale=c(3,0.5))
grid.echo()
d <- grid.grab()
Run Code Online (Sandbox Code Playgroud)

然后,使用这 4 个对象,您可以根据给定的矩阵排列它们。有关布局的更多信息,请参阅:https://cran.r-project.org/web/packages/gridExtra/vignettes/arrangeGrob.html。在以下情况下,第二行中的两个词云的布局比上面的要小:

grid.newpage()
lay <- rbind(c(1,1,1,2,2,2),
             c(1,1,1,2,2,2),
             c(1,1,1,2,2,2),
             c(1,1,1,2,2,2),
             c(3,3,3,4,4,4),
             c(3,3,3,4,4,4))
grid.arrange(a,b,c,d, layout_matrix = lay)
Run Code Online (Sandbox Code Playgroud)

结果应该是这个图像:词云