在R语言中以网格布局绘制词云的解决方案求助
解决wordcloud2词云网格布局的问题
你遇到的这个问题其实挺普遍的——wordcloud2()生成的是htmlwidget类型的对象,而grid.arrange()只认基于grid绘图系统的输出(比如ggplot图、基础绘图转换的grobs对象),直接把两者放一起肯定会报错。下面给你两种实用的解决方案,分别适配不同的使用场景:
方案1:转成图片后用grid.arrange排列(适合在R绘图窗口/静态报告中展示)
这个方法需要借助webshot把htmlwidget格式的词云转成图片,再用gridExtra来做网格布局,步骤如下:
- 先安装并加载需要的包:
install.packages(c("webshot", "gridExtra", "png", "wordcloud2")) library(webshot) library(gridExtra) library(png) library(wordcloud2)
- 生成词云并导出为临时png文件:
# 生成你的两个词云对象 w1 <- wordcloud2(w_virgin, size = 0.8, shape = 'circle', rotateRatio = 0.5, minSize = 1) w2 <- wordcloud2(w_united, size = 0.8, shape = 'circle', rotateRatio = 0.5, minSize = 1) # 把词云保存为临时html,再转成png saveWidget(w1, "temp_w1.html") webshot("temp_w1.html", "w1.png", vwidth = 400, vheight = 400) # 可调整宽高 saveWidget(w2, "temp_w2.html") webshot("temp_w2.html", "w2.png", vwidth = 400, vheight = 400)
- 读取图片并做网格布局:
# 读取png图片 img1 <- readPNG("w1.png") img2 <- readPNG("w2.png") # 转换为grid可识别的grob对象 grob1 <- rasterGrob(img1) grob2 <- rasterGrob(img2) # 并排展示两个词云 grid.arrange(grob1, grob2, ncol = 2)
提示:第一次用webshot的话,可能需要安装PhantomJS,运行webshot::install_phantomjs()就能搞定。
方案2:用htmltools组合成交互式网页(适合网页/Shiny应用)
如果你的需求是做交互式展示(比如鼠标悬停显示词频),或者要嵌入网页/Shiny应用,直接用htmltools组合多个wordcloud2对象就行,不需要转成图片:
library(htmltools) library(wordcloud2) # 生成词云对象 w1 <- wordcloud2(w_virgin, size = 0.8, shape = 'circle', rotateRatio = 0.5, minSize = 1) w2 <- wordcloud2(w_united, size = 0.8, shape = 'circle', rotateRatio = 0.5, minSize = 1) # 组合成并排的交互式页面 browsable(tagList( div(style = "display: inline-block; margin: 0 20px;", w1), div(style = "display: inline-block;", w2) ))
运行这段代码后,会自动在浏览器中打开一个页面,两个词云并排展示,还保留了wordcloud2的所有交互功能。
内容的提问来源于stack exchange,提问作者JimminyCricket
相关产品推荐
相关产品推荐

