专栏名称: EasyCharts
EasyCharts,易图表,我们将定期推送各种数据可视化与分析教程,包括Excel(Power BI)、Origin、Sigmaplot、GraphPad、R、Python、Matlab、Tableau、D3.js等。
目录
相关文章推荐
51好读  ›  专栏  ›  EasyCharts

挖掘成龙的朋友圈

EasyCharts  · 公众号  · 前端  · 2017-09-13 07:00

正文

请到「今天看啥」查看全文


今天给大家分享如何使用R语言从百度百科深层抓取成龙的朋友圈,以及如何绘制成龙的社交图.

加载R包

  1. library(rvest)

  2. library(stringr)

一级关系网抓取

  1. url='https://baike.baidu.com/item/%E6%88%90%E9%BE%99/71648?fr=aladdin'

  2. web=read_html(url)

  3. name=web%>%html_nodes('#slider_relations>ul>li>a>.name')%>%html_attr('title')

  4. relation=web%>%html_nodes('#slider_relations>ul>li>a>.name')%>%html_text()

  5. relation=(str_split(relation,name)%>%unlist)[(str_split(relation,name)%>%unlist

  6.                                              %>%str_length()) >0]

  7. href=web%>%html_nodes('#slider_relations>ul>li> a')%>% html_attr('href')

  8. re=data.frame(sorce='成龙',name=name,

  9.              relation=relation,href=href,stringsAsFactors =F)

构建爬虫及清理函数

为减少代码冗余,构建两个函数.

  • 数据爬取函数

  1. fun = function(x){

  2.  web=read_html(x)

  3.  name=web%>%html_nodes('#slider_relations>ul>li>a>.name')%>%html_attr('title')

  4.  relation=web%>%html_nodes('#slider_relations>ul>li>a>.name')%>%html_text()

  5.  relation=(str_split(relation,name)%>%unlist)[(str_split(relation,name)%>%unlist

  6.                                                %>%str_length()) >0]

  7.  href=web%>%html_nodes('#slider_relations>ul>li> a')%>%html_attr('href')

  8.  re=data.frame(name=name,relation=relation,href=href,stringsAsFactors =F)

  9.  return(re)

  10. }

  • 数据清理函数

  1. fun1=function(x){

  2.  re=x

  3.  res=NULL

  4.  for(i in 1:length(re$href)){

  5.    if( nrow(fun(re$href[i]))>0){

  6.      res=rbind(res,data.frame(sorce=re$name[i],fun(re$href[i]),stringsAsFactors =F))

  7.    }

  8.  }

  9.  re1=res[(res$name %in% unique(re$sorce))==0,]

  10.  return(re1)

  11. }

数据读取及保存

  1. #二级关系网

  2. re1=fun1(re)

  3. #三级关系网

  4. re2=fun1(re1)

  5. #四级关系网

  6. re3=fun1(re2)

  7. #五级关系网

  8. re4=fun1(re3)

  9. ##数据保存

  10. saveRDS(list(re=re,re1=re1,re2=re2,re3=re3,re4=re4),'D:\\chenglong.rds')

数据可视化

  • 绘制一级网络图

  1. #加载数据

  2. ldt=readRDS('D:\\chenglong.rds')

  3. str(ldt)

  4. str(ldt$re)

  5. #一级关系网络图

  6. library(GGally)

  7. library(network)

  8. library (ggnetwork)

  9. library(geomnet)

  10. ##点

  11. nodes=data.frame(label=unique(c(ldt$re$sorce,ldt$re$name)),

  12.                 grade=c(1,rep(2,9)),stringsAsFactors =F)

  13. ##边

  14. links=ldt$re[,1:2]

  15. mm.net network(links, directed = FALSE)

  16. rownames(nodes) nodes$label

  17. mm.net%v%'grade'= ifelse(network. vertex.names(mm.net)=="周杰伦" ,1,2)

  18. set.edge.attribute(mm.net,'labb',ldt$re$relation)

  19. set.seed(10052016)

  20. ggplot(data = ggnetwork(mm.net, layout = "kamadakawai"),

  21.       aes(x, y, xend = xend, yend = yend)) +

  22.  geom_edges(color = "grey50",linetype=3) +

  23.  geom_nodes(aes(colour = as.factor(grade)), size = 5) +

  24.  geom_nodetext_repel(aes(colour = as.factor(grade),label = vertex.names),

  25.                size = 4, vjust = -0.6) +

  26.  geom_edgetext(aes(label = labb),color = "white", fill = "grey25")+

  27.  scale_colour_manual(values =  c("pink", "gold")) +

  28.  xlim(c(-0.05, 1.05)) +

  29.  theme_blank() +

  30.  theme(legend .position = "n")+

  31.  theme(axis.text = element_blank(),

  32.        axis.title = element_blank(),

  33.        panel.background = element_rect(fill = "grey25"),

  34.        panel.grid = element_blank())

  • 绘制五级网络图

  1. ldt$re$grade=2

  2. ldt$re1$grade=3

  3. ldt$re2$grade=4

  4. ldt$re3$grade=5

  5. ldt$re4$grade=6

  6. dt4=rbind(ldt$re[,-4],ldt$re1[,-4],ldt$re2[,-4],ldt$re3[,-4],ldt$re4[,- 4])

  7. #点

  8. nodes4=data.frame(label=c('成龙',dt4[!duplicated(dt4$name),]$name) ,

  9.                  grade=c(1,dt4[!duplicated(dt4$name),]$grade),stringsAsFactors =F)

  10. nodes4=nodes4[-27,]

  11. #边

  12. links4=dt4[,1:2]

  13. mm.net4 network(links4, directed = FALSE)

  14. rownames(nodes4) nodes4$label

  15. mm.net4%v %'grade'= nodes4[network.vertex.names(mm.net4) ,'grade']

  16. set.edge.attribute(mm.net4,'labb',dt4$relation)

  17. set.seed(10052016)

  18. p=ggplot(data = ggnetwork(mm.net4, layout = "kamadakawai"),

  19.       aes(x, y, xend = xend, yend = yend)) +

  20.  geom_edges(color = "grey80",linetype=3) +

  21.  geom_nodes(aes(colour = as.factor(grade)), size = 1) +

  22.  geom_nodetext_repel(aes(colour = as.factor(grade),label = vertex.names),

  23.                      size = 3, vjust = -0.6) +

  24.  #geom_edgetext(aes(label = labb),color = "white", fill = "grey25")+

  25.  scale_colour_brewer(palette = "Oranges") +

  26.  xlim(c(-0.05, 1.05)) +

  27.  theme_blank() +

  28.  theme(legend.position = "n")+

  29.  theme(axis.text = element_blank(),

  30.        axis.title = element_blank(),

  31.        panel.background = element_rect(fill = "grey25"),

  32.        panel.grid = element_blank())

  33. p

  34. windows(height = 15,width = 20)

  35. p+scale_colour_brewer(palette = "Oranges")

如需转载请联系EasyCharts团队!

微信后台回复“转载”即可!



【书籍推荐】 《Excel 数据之美--科学图表与商业图表的绘制》

【必备插件】 EasyCharts -- Excel图表插件

【网易云课堂】 Excel 商业图表修炼秘笈之基础篇

【手册获取】 国内首款-数据可视化参考手册:专业绘图必备








请到「今天看啥」查看全文