R语言词云终极办理方案—wordcloud2包
此刻你也可以在R语言中绘制多样的词云了。wordcloud2是基于wordcloud2.js封装的一个R包,利用HTML5的canvas绘制。欣赏器的可视化具有动态和交互结果,相对付曾经的R包worldcoud,wordcloud2还支持任意形状的词云绘制,这也是我一直想要寻求的特性。
安装&示例从github安装wordcloud2包:if (!require(devtools)) install.packages(“devtools”)devtools::install_github(‘lchiffon/wordcloud2’)
包内含有两份data.frame名目标词频数据:英文版的demoFreq和中文版的demoFreqC,利用wordcloud2直接绘制即可。若需要绘制本身的词频数据,只需结构一个雷同的数据框即可,第一列代表词语,第二列存贮相应的词频。library(wordcloud2)wordcloud2(demoFreqC)wordcloud2(demoFreq)## 一个粗拙的例子# df = data.frame(letters, rpois(26, 20)) # wordcloud2(df)
定制颜色这里的颜色包罗配景致和词语颜色,别离对应backgroundColor和color两个参数。这两个参数可以接管CSS承认的任意的参数值,如’red’,’blue’可能’rgb(0,0,0)’以及十六进制的’#ff2fe9’等。别的color参数有更多可接管的参数:内置的随机色生成方案:random-light和random-dark,在Javasript里定制了相应的随机函数javasript回调函数: 用js撰写任意的颜色生成函数,如js_color_fun = “function (word, weight) { return (weight > 2000) ? ‘#f02222’ : ‘#c09292’;}”wordcloud2(demoFreqC, color = htmlwidgets::JS(js_color_fun), backgroundColor = ‘black’)
此处需要利用htmlwidgets的JS函数把字符形式的参数值理会成js函数。R中的函数向量: js回调函数想必让许多纯R语言用户懵逼,最简朴的方法是传入一个定制后的颜色向量。wordcloud2(demoFreqC, color = ifelse(demoFreqC[, 2] > 2000, ‘#f02222’, ‘#c09292’)这行代码R语言函数取代了js回调函数,结果沟通。
定制形状学会界说颜色可以让你的词云时黄时紫,却不能像马像牛又像羊。变形最简朴的方法就是界说shape参数,如wordcloud2(demoFreqC,shape=’star’)。还支持’diamond’,’cardioid’等参数(都是在js剧本中预界说好的对应的函数),更多请看函数辅佐文档。
内置的几个参数并不十分有趣,完全的自界说才亦可赛艇。wordcloud2答允你传入一张图片,把词云填充在图中的玄色区域。这样,找到一头牛和一匹马,你的云就可以调动了。wordcloud2(demoFreqC, figPath=’C:\\Users\\lenovo\\Desktop\\niu.png’) wordcloud2(demoFreqC, figPath=’C:\\Users\\lenovo\\Desktop\\ma.png’)
代码中所需的图片都可以在上图截取,这里就不放了。别的,假如想画成字符形状,你大概需要先画出字符,再利用wordcloud2函数绘制。贴心的作者郎老师早已定制好了相应的接口letterCloud函数,试试运行letterCloud(demoFreqC, word = ‘R’)。
该函数背后的逻辑如上所述,先画出图片再传入figPath参数。到这里,不禁想起cos一篇文章:showtext:字体,好玩的字体和洽玩的图形,文中利用showtext包挪用神奇的字体画出好玩的图形。此处也可以如法炮制,下载wmpeople1.TTF字体绘制出汉子和姑娘的图案,再挪用wordcloud2绘制相应形状的词云。library(showtext)library(Cairo)
link = “http://img.dafont.com/dl/?f=wm_people_1”;download.file(link, “wmpeople1.zip”, mode = “wb”);unzip(“wmpeople1.zip”);font.add(“wmpeople1”, “wmpeople1.TTF”);
plot_shape <- function(filename, char){ CairoPNG(filename, 500, 400) showtext.begin(); plot.new() offset = par(mar = par()$mar) op = par(mar = c(0,0,0,0)) text(0.6, 0.5, char, family=’wmpeople1′, cex=32) par(offset) showtext.end(); dev.off(); }
plot_shape(‘female.png’, ‘u’)plot_shape(‘male.png’, ‘p’)
接下来在淘宝首页搜索’男’和’女’两个要害词。对搜索功效的网页做处理惩罚,分词和词频统计。计较TF-IDF指标并用词云展示。绘制词云的数据该当是长尾漫衍的,即大量低频词和少数高频词。高频词刻画特点,低频词填充剩余位置,到达精明和雅观的结果。因此处理惩罚进程中对TF-IDF为0可能缺失的值都填充为1,以便让这些低频词显示出来。library(jiebaR)readChineseWords <- function (path) { # 读取网页或文件去除标点和英文,在windows则需配置encoding为’UTF-8′ rawstring = readLines(path, encoding = ‘UTF-8’) rawstring = paste0(rawstring, collapse = ‘ ‘) s = gsub(‘\\w’, ”, rawstring, perl=TRUE) s = gsub(‘[[:punct:]]’, ‘ ‘, s) return(s)}
# 淘宝首页搜索’男’和’女’对应的网页链接male_link = ‘https://s.taobao.com/search?q=%E7%94%B7&search_type=item&sourceId=tb.index’female_link = ‘https://s.taobao.com/search?q=%E5%A5%B3&search_type=item&sourceId=tb.index’
male_str = readChineseWords(male_link)female_str = readChineseWords(female_link)
# 分词 -> 计较tf-idf cc = worker()new_user_word(cc,’打底裤’,’ddk’)male_words = cc[male_str]female_words = cc[female_str]
idf = get_idf(list(male_words, female_words))get_tf_idf <- function(words){ words_freq = table(words) df = data.frame(name=names(words_freq), freq=as.numeric(words_freq)) df = merge(df, idf, all.x = TRUE) wc_df = data.frame(words=df$name, freq=ceiling(df$count * df$freq * 10)) # 缺失和0值替换成1 wc_df$freq[wc_df$freq == 0 | is.na(wc_df$freq)] = 1 return(wc_df)}
# 绘制词云male_df = get_tf_idf(male_words)female_df = get_tf_idf(female_words)wordcloud2(male_df, figPath = ‘male.png’, backgroundColor = ‘black’, color = ‘random-light’)wordcloud2(female_df, figPath = ‘female.png’, backgroundColor = ‘black’, color = ‘random-light’)#p#分页标题#e#
男士的搜索功效主要是“海澜”,“健详”和“牧之逸”的品牌信息(后俩还真没听过…),“棉质”和“衬衣”等,以及臭汉子要“防臭”。右中图的“打底裤”,“防走光”和“防晒”,“防水”,主题十理解确,又是一年夏季,女孩的短裙飞扬在街上的每个角落,风凉的同时也要留意防狼防天气。注:由于各人搜索功效的差异,最终获得的词云图也纷歧样。
交互默认生成的词云是自带交互结果的。鼠标悬浮某个词上会显示相应的词频,这是内置的js回调函数结果。可以自编js函数包围,好比下边的代码传入一个空函数,画出的词云就没有交互结果了。hoverFunction = htmlwidgets::JS(“function hover() {}”)wordcloud2(demoFreq,hoverFunction = hoverFunction)
这一部门就是纯粹的js了,有本领或有乐趣想要做些纷歧样结果的,可以瞅瞅源代码中的hover.js。
结语最后,想要更多的细节调试可以拜见wordcloud2作者的先容以及wordcloud2.js的API文档。
感激wordcloud2作者郎大为老师和wordcloud2.js的作者timdream。有乐趣和有本领的伴侣可以读读源代码,开开脑洞做些改造,如晋升下画图速度(改造wordcloud2.js的算法),组合多个词云等。
接待插手本站果真乐趣群贸易智能与数据阐明群乐趣范畴包罗各类让数据发生代价的步伐,实际应用案例分享与接头,阐明东西,ETL东西,数据客栈,数据挖掘东西,报表系统等全方位常识QQ群:81035754