Get新技能,利用ggplot2画环形图

浏览: 2234

周末在家学习了用ggplot2画环形图的技能,通过此次练习主要学会了showtext和Cairo包的用法:

library(rvest)
library(dplyr)
library(stringr)
library(showtext)
library(Cairo)
library(RColorBrewer)
library(ggplot2)
library(grid)

第一步,下载字体数据

url<-"https://github.com/haoyuns/EyesAsia"
table<-read_html(url,encoding="utf-8")%>%html_table
table

我们需要的是第二个表格的数据,因此筛选表格二的内容:

table <- table[[2]]
table

处理数据,整合成一维数据:

##剔除“lowercase”中空值数据
table1<-table[table$lowercase!="",]
##选择“lowercase”中空值数据所在行的所有数据,然后再用[,3:4]选择第三和第四列的数据。
table2<-table[table$lowercase=="",]%>%.[,3:4]
##重命名table1、table2中的列名,且重新赋值,便于整合成一维数据。
table11<-table1[,1:2]%>%rename(case=lowercase)
table12<-table1[,3:4]%>%rename(case=UPPERCASE)
table13<-table2%>%rename(case=UPPERCASE)
##使用rbind()函数重新组合数据。
tabledata<-rbind(table11,table12,table13)

最终数据如下:

接着将地名中的中英文名称分割开:

##筛选中文名称
a <- str_split_fixed(tabledata$Content," ",n=3)[,3]
b <- str_split_fixed(tabledata$Content," ",n=3)[,2]
a[which(a %in% "")] <- b[which(a %in% "")]
tabledata$Cname <- a
##筛选英文名称
a <- str_split_fixed(tabledata$Content," ",n=3)[,3]
c <- str_split_fixed(tabledata$Content," ",n=3)[,1]
c[which(a %in% "")] <- paste(c[which(a %in% "")],b[-(which(a %in% ""))],sep="")
tabledata$Ename <- c
##剔除不需要的列和地名,只需要中国省级行政区
tabledata<-tabledata[,-2]
word<-c("日本","蒙古","朝鲜","韩国","青海湖","鄱阳湖","洞庭湖","太湖","洪泽湖")
tabledata$m<-tabledata$Cname %in% word
tabledata<-tabledata%>%filter(m==FALSE)%>%.[,1:3]
##保存数据
write.csv(tabledata,file = "tabledata")

再次查看最终的数据:

接下来是画图步骤:

第一步:外围字体圆环图

##生成一个虚拟指标,并分割为有序分段因子变量。
###使用runif(34,20,50)函数生产随机数据,其中34是数据量,20是最小值,50是最大值。
mymapdata<-transform(mymapdata,scale=5,peform=runif(34,20,50))
mymapdata$scale<-as.numeric(mymapdata$scale)
###对peform数据进行分类
mymapdata$group<-cut(mymapdata$peform,breaks=c(20,26,32,38,44,50),levels=,labels=c("20~26","26~32","32~38","38~44","44~50"),order=TRUE)
###对mymapdata按照peform进行降序排列,同时添加order顺序。
mymapdata<-arrange(mymapdata,desc(peform));mymapdata$order=1:nrow(mymapdata)
mymapdata$order<-as.numeric(mymapdata$order)

接着载入字体和作图:

###将字体文件“EyesAsia-Regular”进行解压
unzip("EyesAsia-Regular.zip");
###将地图字体载入程序中,字体名字为“EyesAsia-Regular”
library(showtext);
font.add("EyesAsia-Regular", "EyesAsia-Regular.otf");
###作图函数
####打开图形设备
CairoPNG("chineserador.png",900,900)
####开始使用showtext
showtext.begin()
####开始制图
ggplot(mymapdata,aes(order,scale,label=case))+
 ylim(-6,6)+
 coord_polar(theta="x",start=0)+
 geom_text(aes(colour=group),family="EyesAsia-Regular",size=20)+
 scale_colour_brewer(palette="Blues",guide=FALSE)+
 theme_minimal()+
 theme(
   panel.grid=element_blank(),
   axis.title=element_blank(),
   axis.text=element_blank(),
 )
####停止使用showtext
showtext.end()
####关闭图形设备
dev.off()

图形需要到保存的文件夹中查看,可以使用getwd()查询图形保存的位置。得到如下图形:

第二步:制作中心的离散填充地图

接着是制作中间的中国地图。数据直接用网上得到的中国地理位置数据,经过Excel进行数据处理后,得到包括各个地区的经纬度的数据。

数据:

library(readxl)
chinamapdata <- read_excel("F:/chinamapdata.xlsx")
chinamapdata

画图:

p2<-ggplot(chinamapdata,aes(long,lat,group=group))+geom_polygon(col="white",fill="grey")+
 coord_map("polyconic")+
 theme(              
   panel.grid = element_blank(),
   panel.background = element_blank(),
   axis.text = element_blank(),
   axis.ticks = element_blank(),
   axis.title = element_blank()
 )

第三步:合并拼图

首先是字体地图:

##标签添加角度偏移量
circle<-seq(0,95,length=9)
circleALL<-rep(c(-circle,rev(circle[2:9])),2)
mymapdata1$circle<-circleALL
##ggplot极坐标下的首尾不衔接的缺陷,这里再插补一个缺失值
mymapdata<-arrange(mymapdata,order)
mapx<-mymapdata[mymapdata$order==34,]
mapx$order<-35;mapx$Cname=NA;mapx$case=NA
mymapdata1$order<-36;mapx$Cname=NA;mapx$case=NA
mymapdata1<-rbind(mymapdata1,mapx)
##加载微软雅黑和字体地图
windowsFonts(
   myfont=windowsFont("EyesAsia-Regular"),
   yahei=windowsFont("微软雅黑")
 )
 ###作图函数
p1 <-ggplot(mymapdata1,aes(x=order,y=scale))+
   ylim(-6,7.5)+
   coord_polar(theta="x",start=0)+
   geom_text(aes(colour=group,label=case),family="myfont",size=10)+
   geom_text(aes(y=scale+2,angle=circle,label=Cname),family="yahei",size=3,vjust=0.5,hjust=.5)+
   scale_colour_brewer(palette="Blues",guide=FALSE)+
   theme_minimal()+
   theme(
     panel.grid=element_blank(),
     axis.title=element_blank(),
     axis.text=element_blank(),
   )

最后一步,将两个图形连接在一起:

unzip("EyesAsia-Regular.zip")
font.add("myfont", "EyesAsia-Regular.otf")
font.add("yahei", "msyh.ttf")
CairoPNG("chineserador3.png",1000,1000)
showtext.begin()
vs <- viewport(width=0.8,height=0.95,x=0.5,y=0.5)    
print(p1,vp=vs)  
vs <- viewport(width=0.45,height=0.8,x=0.5,y=0.5)  
print(p2,vp=vs)
showtext.end()
dev.off()

通过这次练习,明白到使用showtext和Cairo包的时候,载入字体需要用到font.add()函数,而不采用这两个包的时候,字体载入需要用到windowsFonts()函数。


公众号后台回复关键字即可学习

回复 R               R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

推荐 2
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册