你
就是我的
"疫”外收获
来源:人民日报新媒体
最近看到人民日报新媒体公布的疫情相关的图特别漂亮,想着利用疫情的数据学着画一画,R语言爬虫弱爆的我,只能想着站在“巨人的肩膀”学习,正巧Y叔更新公众号信息,Y叔竟然写了一个nCov2019的R语言包,简直太厉害了!nCov2019包的安装需要依靠remotes包,同时也要注意RStudio的版本是否适合,否则可能安装失败。
01
安装包
>install.packages("remotes”)
>library(remotes)
>remotes::install_github("GuangchuangYu/nCov2019”)
02
获取数据
在王珊、萨师煊编著的数据库系统概论中提到“三分技术、七分管理,十二分基础数据”,在《星际迷航》中,Krik船长说“数据是一件麻烦事,一件非常非常麻烦的事”,的确,为了获取,一波好几折,比如获取前需要安装affy包与simpleaffy包,为了获取affy包,biocLite()或install.packages(“affy”),系统友好的告知“package ‘affy’ is not available (for R version 3.6.3)”,好吧,为了解affy包的适用版本,咱进入Bioconductor官网http://www.bioconductor.org/packages/2.13/bioc/html/affy.html看看affy的installation,根据提示操作,当前的RStudio版本已经不适合the lastest of Bioconductor,Bioconductor version 10.0适用于RStudio 3.6.0,而Bioconductor version 11.0匹配RStudio 4.0.0,而我当前操作的RStudio 版本是3.6.3,此刻内心OverlappingSound,packages和RStudio更新换代速度要不要那么快?此刻已经记不起哪位大师说“In my own work,as much as 60% of the time I spend on data analysis is focused on Preparing the data for analysis”,好啦,在“龟速”网络下运行的RStudio终于成功的获取了疫情的数据(更新至于2020.04.15)。代码如下:
>if(!requireNamespace("BiocManager", quietly = TRUE))
+install.packages("BiocManager”)
>BiocManager::install(version = "3.10”)
>library(BiocManager)
>BiocManager::install("affy”)
>BiocManager::install(“simpleaffy”)
>library(nCov2019)
> data<-load_nCov2019(lang = "en")
>World<-data["global"]
>today<-subset(World,time=="2020-04-15")
>todaycountry),paste(todaycountry,"(死亡",today
> library(dplyr)
>today_gb1<today%>%group_by(cum_confirm)%>%summarise(country=paste(country,collapse=","))
#其中的paste()函数是用来表示连接字符串,summarise()是指将多个值简单化为单个值,%>%是指管道操作函数,来自dplyr包,对于这个的理解,可以想象成车间的流水线,只有前面一道程序完成之后才能进入下一道程序,将前面的参数的结果直接传递给下一个函数,在R语言爬虫中会经常用到。today_gb1其实就相当于我们在excel中将today这个一维数据列表根据cum_confirm列的数据信息转变为二维数据列表,这个二维数据是将cum_confirm中数值一样的country进行汇总。这个关于每个函数如何使用,在RStudio中可以采用help()或??函数得到解决。
>today_gb2<today%>%group_by(cum_confirm)%>%summarise(country_dead=paste(country_dead,collapse=","))
>today_gb3<-today%>%group_by(cum_confirm)%>%summarise(cum_dead=paste(cum_dead,collapse=","))
>today_gb4<merge(today_gb1,today_gb2)#这一步相当于将Excel中的两个表格合并,作用是合并数据帧。
>today_g5<merge(today_g4,today_g3)#别问为什么不直接将today_gb1、today_gb2、today_gb3合并,而要通过today_gb4,这是因为merge()只能合并两个,不能合并3个。
>today_gb5<as.data.frame(today_gb5)#这是检查today_gb5中的对象是否是数据帧,倘若不是,在可能的情况下强制它
>today_gb5<arrange(today_gb5,desc(cum_confirm))#这是通过arranger()排序函数对today_g5中数据根据cum_confirm做降序排列
>View(today_gb5)#通过查看today_gb5的数据,数据总共有174个,为了减少处理数据的工作量,选择第1-41个数据进行处理。
>today_top<-today_gb5[1:41,]
>today_top
>a<-data.frame(cum_confirm=3573,country = "低于95例的国家",country_dead = "",cum_dead = "",angle="")
>today_top<-rbind(today_top,a)#增加一行a
>today_top$angle<-1:42*360/42#在today_g5中添加一列扇形角度angle,一个圆360度,将每个角度分成42份
03
画图
>ggplot(today_top,aes(x = country, y =cum_confirm,fill=country))+geom_bar(stat="identity",position="stack",width=1)+geom_bar(aes(y=I(2)),stat="identity",width=1,fill="white")+geom_bar(aes(y=I(4)),stat="identity",width=1,fill = "white",alpha=0.2)+ geom_bar(aes(y =
I(6)),stat="identity",width=1,fill="white",alpha=0.1)+scale_y_log10()+coord_polar(direction=-1)+theme_void()+theme(legend.position="none")+geom_text(aes(label=paste(country,paste(cum_confirm,"例",sep = ""),sep = "\n"),y = cum_confirm*.8, angle = angle),data = today_top[1:5,],color="white",fontface ="bold",vjust=1,family= "STKaiti",size =2.2)+geom_text(aes(label=paste("死亡",cum_dead,"例",sep=""),y= cum_confirm*.4, angle = angle),data = today_top[1:5,],color="white",fontface ="bold",vjust=1,family= "STKaiti",size = 1.5)+geom_text(aes(label = country, y=cum_confirm*.8),data= today_top[6:20,],color="white",vjust =seq(0.4,0,length.out=15),hjust=seq(0.2,0.5,length.out=15),fontface="bold", family="STKaiti",size=c(2.2,1,seq(2.2,1,length.out=13)))+geom_text(aes(label = paste(cum_confirm,"例",sep = ""), y=cum_confirm*c(seq(.55,.45,length.out=6),seq(.47,.65,length.out= 9))),data =today_top[6:20,],color= "white",vjust = seq(0.5,0,length.out =15),hjust = seq(0,0.5,length.out = 15),fontface = "bold",family="STKaiti",size=seq(1.9,1.5,length.out=15))+geom_text(aes(label = paste("死亡",cum_dead,"例",sep = ""),y=cum_confirm*c(seq(.35,.21,length.out=6),seq(.22,.45,length.out=9))),data=today_top[6:20,],color="white",vjust = seq(0.4,0,length.out = 15),hjust =seq(0.2,0.5,length.out = 15),fontface = "bold", family = "STKaiti",size = 1.2)+geom_text(aes(label=paste(paste(cum_confirm,"例",sep= ""),country_dead,sep=" "),y = cum_confirm*1.1,angle=angle+90),data=today_top[21:40,],color=black",vjust =0, hjust=0,fontface = "bold", family =STKaiti",size=1.5)+geom_text(aes(label=country,y= cum_confirm*1.1,angle = angle+90),data today_top[41,],color = "black",vjust = 0, hjust = 0,fontface = "bold",family = "STKaiti",size = 1.5)
04
图片导出
用RStudio的Export直接导出的PNG、SVG、JPEG、TIFF等格式的图片像素低,低到无法看到图中的文字信息,用pdf格式导出的图片,图片像素没问题,但图片文字全部消失不见。为解决图片清晰度低的问题,采用Cairo包能够创建高质量矢量图,同时支持高质量图形渲染的特点,将ggplot绘制的图片储存成为pdf格式,同时借助showtext包中的showtext_begin函数和showtext_end()函数,使得保存的图片中包含中文字符。尽管代码运行,发现Cairo能够安装成功,但是library加载时却失败,倘若盆友知道原因,可以留言告知,谢谢!
>install.packages(“Cairo”)
>Install.packages(“showtext”)
>library(Cairo)
错误: package or namespace load failed for ‘Cairo’:
loadNamespace()算'Cairo'时.onLoad失败了,详细内容:
调用: dyn.load(file, DLLpath = DLLpath, ...)
错误: 无法载入共享目标对象‘/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Cairo/libs/Cairo.so’::dlopen(/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Cairo/libs/Cairo.so, 6): Library not loaded: /opt/X11/lib/libfreetype.6.dylib,Referenced from: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/Cairo/libs/Cairo.so
Reason: image not found
手工安装Cairo包的方法,http://www.rforge.net/Cairo/files/
通过官网下载匹配电脑和RStudio版本的Cairo包,试图通过RStudio的Tools手工安装,但是始终无法安装至于System library,具体原因有待深究.....尽管,安装Cairo包失败,但仍想附上使用代码,万一哪天就成功了呢?
>CairoPDF(file=“plot.pdf”,width=6,height=7)
>ggplot(…..)#绘制图形
>showtext_end()
>dev.off()#关闭设备
最终,图片导出的方式采用的是Export的png和pdf格式,png格式导出的图片像素不高,在用ps提高像素后,基本能解决问题。于是尝试利用pdf导出,通过手工添加文字也OK,就是效率不高。此次代码运行的南丁格尔玫瑰图是通过学习张杰编著的《R语言数据可视化之美专业图表绘制指南》代码绘制,尽管图的外观和人民日报的图差别有点大,特别是图中数据显示(采用四舍五入法)、扇形角度、geom_bar()的系列参数的差别。通过调节ggplot2中的参数可以提高南丁格尔玫瑰图的美观。