首先,加载recharts
:
library(recharts)
词云只有一种类型: wordCloud
关键是:
x
,词列表y
,词汇的频数series
与图例无关联,而与颜色关联echartr(data, x, y, <t>, <type>)
参数 | 要求 |
---|---|
data |
数据框格式的源数据 |
x |
文本型自变量,其他类型会被转为因子。如提供多个变量,只传入第一个。 |
y |
数值型应变量。如提供多个变量,只传入第一个。 |
series |
数据系列变量,转为因子后计算。如提供多个变量,只传入第一个。 |
t |
时间轴变量,转为因子后计算。如提供多个变量,只传入第一个。 |
type |
‘wordCloud’ |
从百度热词榜获取热词,并解析为数据框,包含热词和频数。
为此构建一个函数getBaiduHot
,解析_百度热词趋势_ 网页。
getBaiduHot <- function(url, top=30, HTMLencoding=NULL){
baiduhot <- paste0(readLines(url), collapse="")
charset <- gsub('^.+charset=([[:alnum:]-]+?)[^[:alnum:]-].+$', "\\1",
baiduhot)
if (is.null(HTMLencoding)) if (!is.null(charset)) HTMLencoding <- charset
baiduhot <- stringr::str_conv(baiduhot, HTMLencoding)
hotword <- gsub(".+?<a class=\"list-title\"[^>]+?>([^<>]+?)</a>.+?<span class=\"icon-(rise|fair|fall)\">(\\d+?)</span>.+?","\\1\t\\3\t\\2\t", baiduhot)
hotword <- enc2native(gsub("^(.+?)\t{4,}.+$","\\1", hotword))
hotword <- t(matrix(unlist(strsplit(hotword,"\t")), nrow=3))
hotword <- as.data.frame(hotword, stringsAsFactors=FALSE)
names(hotword) <- c("Keyword", "Freq", "Trend")
hotword$Freq <- as.numeric(hotword$Freq)
hotword <- hotword[order(hotword$Freq, decreasing=TRUE),]
return(hotword[1:top,])
}
hotword <- getBaiduHot("http://top.baidu.com/buzz?b=1", HTMLencoding='GBK')
knitr::kable(hotword)
Keyword | Freq | Trend | |
---|---|---|---|
11 | 小姑娘你火了 | 116955 | rise |
10 | 曝美女兵裸照丑闻 | 115900 | fair |
12 | 试探男友谎称绑架 | 106834 | fall |
9 | 富二代玩枪建工厂 | 76881 | rise |
13 | 男子谋生杀猫卖钱 | 42903 | fall |
16 | 儿生日父亲送毒品 | 39328 | fall |
14 | 男子撞脸达尔文 | 38389 | rise |
17 | 老太眼内8条活虫 | 33053 | rise |
5 | 铁路运行图将调整 | 27491 | rise |
1 | 清洁工擦窗困楼外 | 25871 | rise |
30 | 两架小型飞机相撞 | 21520 | fall |
46 | 耐克气垫门曝光 | 21170 | rise |
15 | 敖厂长被威胁事件 | 20979 | rise |
6 | 蒙冤16年回老家 | 18929 | rise |
7 | 离婚冷静期通知书 | 17932 | rise |
24 | 小学课文被指杜撰 | 12642 | fall |
2 | 贾静雯三胎再产女 | 12292 | rise |
27 | 偷上万元发红包 | 11621 | fall |
19 | 香港旺角暴乱罪成 | 11488 | fall |
45 | 安以轩宣布结婚 | 10655 | fall |
23 | 陈妍希短裙秀美腿 | 10652 | fall |
3 | 秘鲁洪灾泥石流 | 10441 | rise |
22 | 10亿建豪华校区 | 10137 | fall |
41 | 沈梦辰揭澡戏内幕 | 9333 | rise |
20 | 李维嘉终于笑了 | 9205 | fall |
21 | 洋妞街头脱衣暴走 | 9023 | rise |
18 | 男婴出生就18岁 | 8981 | rise |
25 | 火锅底料用560次 | 8295 | rise |
31 | 李维嘉被经纪人骗 | 8161 | rise |
26 | 捡到钱包要求陪睡 | 6526 | rise |
只要提供x
和y
。
echartr(hotword, Keyword, Freq, type='wordCloud') %>%
setTitle('Baidu Hot Word Top30 (realtime)', as.character(Sys.time()))
我们希望将热词分组。定义一个series
变量’Trend’。’rise’系列和’fall’系列用不同的颜色标注。
echartr(hotword, Keyword, Freq, Trend, type='wordCloud') %>%
setTitle('Baidu Hot Word Top30 (realtime)', as.character(Sys.time()))
比较实时、今日和七日热词趋势。
首先,获取今日和七日两个榜单的网页并转为数据框,合并。
hotword$t <- 'Realtime'
hotword1 <- getBaiduHot("http://top.baidu.com/buzz?b=341&fr=topbuzz_b1",
HTMLencoding = 'GBK')
hotword1$t <- 'Today'
hotword2 <- getBaiduHot("http://top.baidu.com/buzz?b=42&c=513&fr=topbuzz_b341",
HTMLencoding = 'GBK')
hotword2$t <- '7-days'
hotword <- do.call('rbind', list(hotword, hotword1, hotword2))
hotword$t <- factor(hotword$t, levels=c('Realtime', 'Today', '7-days'))
然后作图。
g <- echartr(hotword, Keyword, Freq, t=t, type='wordCloud') %>%
setTitle('Baidu Hot Word Top30')
g
接下来可以配置控件、添加标注点/标注线,以及美化成图。
setTheme
g %>% setTheme('dark', palette='manyeyes')
参考相关函数,尽情探索吧。