一、实现思路
1首先,加载所需的R包,其中包括jiebaR和wordcloud2,这些包用于分词和生成词云图。
2通过readLines()函数,读取文本文件 “sanguo1.txt” 的内容,文件路径是 “D:\个人文件\课内学习\大三上\数据分析可视化\sanguo1.txt”,并使用UTF-8编码进行读取。
3创建分词器 mixseg,这个分词器是jiebaR包的一部分,用于对文本进行分词。
4通过 mixseg <= text 将文本数据传递给分词器,然后使用 mixseg[text] 进行分词,将分词后的结果保存在 tmp 变量中。
5创建一个自定义的停用词列表 stopword,包含一些不需要显示在词云图中的常用词汇,如"小说"、“网站"等。
6使用 filter_segment() 函数,将停用词从分词结果 tmp 中过滤掉,以去除不需要的词汇。
7使用 tmp = tmp[nchar(tmp) > 1],将只包含一个字的词汇从结果中过滤掉,以保留至少包含两个字的词汇。
8使用 freq() 函数统计词汇的词频,并将结果保存在 words 变量中。
过滤词频低于等于9的词汇,即 words = words[words$freq >= 9,],以筛选出词频较高的词汇。
9设置一个图片路径 sanguo,这个图片将用作词云图的背景。
10使用 wordcloud2() 函数生成词云图,传递 words 数据框作为数据源,设置词云图的参数,如图形路径、大小、字体、颜色、背景颜色和形状等。
11最后,使用 letterCloud() 函数创建另一个词云图,其中 word = “三国演义” 表示在词云图中显示的主题词汇是"三国演义”,并设置其他参数来自定义词云图的外观。
二、完整代码(R语言)
#用于分词
library(jiebaR)
#用于画图
library(wordcloud2)
# 读取数据
text <- readLines("sanguo1.txt", warn = FALSE,encoding = "UTF-8")
#初始化分词器
mixseg = worker()
mixseg<=text
tmp = mixseg[text] #分词
#自定义停用词
stopword = c("小说","网站","删除","却说","左右","只见","今日","次日","问曰")
tmp = filter_segment(tmp,stopword) #过滤停用词
tmp = tmp[nchar(tmp)>1] ##过滤单字
#统计词频
words = freq(tmp)
words = words[words$freq>=9,]#筛选一定频率的词汇
sanguo = system.file("examples/sanguo.png",package = "wordcloud2")
###绘制云此图,其中demoFreg即为所用的数据,figPath = batman为所用图片
#绘画词云图
wordcloud2(words, figPath = sanguo,size = 0.6, fontFamily = "楷体",
color = "random-light", backgroundColor = "gray",shape = "star")
letterCloud(words, word = "三国演义", wordSize = 2,color = 'random-dark',backgroundColor = "snow")
三、运行结果
四、复现数据
需要将sanguo.png粘贴到wordcloud2包目录下的examples文件夹下函数才能找到图片。
sanguo.png
sanguo1.txt文本
链接:https://pan.baidu.com/s/1WcB-NeEzVMIlqaJbntN4SA?pwd=7w16
提取码:7w16
五、常见bug:成功运行但图像无法显示
根本问题:
现在我们直接从镜像网站所下载的wordcloud2是官方2018年所更新的从镜像网站下载的包是有Bug存在的,所以不能自定义词云图形状。
解决办法有两种:
- 从Github下载wordcloud2
- 直接下载老版本的wordcloud2。
解决步骤:
- 卸载已经下载的wordcloud2
- 终端输入
if (!require(devtools)) install.packages(“devtools”)
- 再输入
devtools::install_github(“lchiffon/wordcloud2”)