返回的结果:
- collect_tags:data.frame,已读书籍的标签
- collect_df:data.frame,已读书籍的信息
- do_tags:data.frame,在读书籍的标签
- do_df:data.frame,在读书籍的信息
- wish_tags:data.frame,想读书籍的标签
- wish_df:data.frame,想读书籍的信息
- reviews:data.frame,发表的书评
- notes:data.frame,发表的读书笔记
- collect_images:list,已读书籍的封面图片,分辨率为60x80
函数user_book_viz是对user_book_status产生的数据的统计分析和可视化,包括下面的统计(不完全): 包括阅读概要统计、按月统计、按页数统计,概要统计如下图:
根据书籍定价,统计每年的价格总和。此处使用饼图显示。在collect_df中包含了作者、出版社、定价等信息,将其中的价格提取出来。不过有的书籍并没有价格,比如开源社区的免费书籍,需要做特殊处理。处理过程及饼图绘制如下:
01 collect_df<-qxde$collect_df
02 price<-as.numeric(collect_df$price)
03 p_df<-data.frame(price=price,year=substr(collect_df$reading_date,1,4))
04 py<-tapply(p_df$price,p_df$year,sum,na.rm = T)
05 price_df<-data.frame(money=py,year=factor(names(py)))
06 price_df<-price_df[price_df$money>0,]
07 ##所读书籍定价饼图
08 pie <- ggplot(price_df, aes(x = "",y=money, fill = year)) +
09 geom_bar(stat="identity",width = 1) +
10 geom_text(aes(y = money/2 + c(0, cumsum(money)[-length(money)]),
11 label =paste0(money,'¥')),size=10)
12 pie + coord_polar(theta = "y")+
13 labs(x='',y='',title = paste0('总价值(>=)',sum(price,na.rm=T),'元')
一般情况下,每阅读一本书,都会设定一些标签,代表这本书的类型。在获取到的数据list(上述数据名称qxde)中有一个元素名称为个collect_tags 的data.frame,它是所有阅读过书籍的标签及其使用频率。此处使用包 wordcloud 绘制标签云图,从下图可以看出,我阅读比较多的是科幻、数据分析、计算机、历史类。代码如下:
1 library(wordcloud)
2 collect_tags<-qxde$collect_tags
3 par(bg='gray90')
4 wordcloud(words=collect_tags$tag_label,
5 freq=collect_tags$tag_freq, min.freq=1,
6 random.order=F,scale=c(5,1.5), ordered.colors=F,
7 colors=rainbow(length(table(collect_tags$tag_label))))
8 title(main=paste0('所读书籍的标签'))
豆瓣上大多数书籍都有一个封面图,其中collect_images是60X80的缩略图,然使用EBImage的combine函数合并图像,代码如下:
1 library(EBImage)
2 img<-combine(qxde$collect_images)
3 display(img,method="raster",all=T)
从
collect_df中提取出书籍名称与对应的标签,并将之转化为两列“书名->标签”的data.frame. 使用igraph包绘制书籍、标签之间的关系图。上图为利用随机漫步社区发现方法walktrap.community绘制,下图利用力学导向的fruchterman.reingold算法绘制。两个图形中,节点大的为书籍名称,小的为标签。其中科幻类书籍比较集中,主要为大刘的作品,一类为政治经济类,一类历史类,其中数据分析、计算机及周边的学科这一类是重点,因为和所学专业和从事的工作相关。01 .todf<-function(x){
02 x<-as.character(x)
03 x<-gsub(taggg,'',c(x[1],x[2]))
04 left=x[1]
05 right<-unlist(strsplit(x[2],' '))
06 right<-right[nchar(right)>0]
07 right<-right[right!=left]
08 left<-rep(left,length(right))
09 cbind(left,right)
10 }
11 tag_list<-apply(collect_df[,c("title","user_tags")],1,.todf)
12 n=length(tag_list)
13 tag<-c()
14 for(i in 1:n){
15 tag<-rbind(tag,tag_list[[i]])
16 }
17 require(igraph)
18 g<-graph.data.frame(tag,directed=F)
19 title<-unique(collect_df$title)
20 col=rep(2,length(V(g)$name))
21 col[match(V(g)$name,title)]<-4
22 vcex=col;vcex[vcex==4]=1.2;vcex[vcex==2]=1
23 wc=walktrap.community(g)
24 par(mar=rep(2,4))
25 plot(wc,g,vertex.label=V(g)$name,vertex.size=col,edge.arrow.size=0.5)
26 ### 力学导向的fruchterman.reingold关系图
27 plot(g, layout=layout.fruchterman.reingold, vertex.size=col,
28 vertex.label.dist=0, vertex.color=col+1,
29 edge.arrow.size=0.5,vertex.label=V(g)$name,vertex.label.cex=vcex,
30 vertex.label.color=col+2)
还可以做一些其他方面的展示,比如平均每天阅读多少页、多少字等有趣的分析。前不久发现一个网站(
DNA阅读)针对豆瓣读书有类似的分析和展示。在Rdouban中的函数主要获取的是电影、音乐、书籍的评论、笔记数据,比较适合做文本分析。