继续上一篇地理信息可视化讲起,为了能够更加直观的展示数据分布情况,发现之前人民日报客户端曾经做过一张关于疫情分布的玫瑰图,非常惊艳,故尝试用当前爬取的数据进行绘制。
现存数据中不少地区病例已经清零,故在绘图中剔除为0的地区,由于弯弯的数据太过于扎眼,和大陆地区差异巨大,直接用原始数据绘图可视化较差,故对原始数据进行了相应调整。
library(ggplot2)
library(RColorBrewer)
library(dplyr)
###绘图数据处理###
mydata[,c(1,3)]%>%arrange(confirm)->mgdata
mgdata<-filter(mgdata,confirm!=0)##剔除现存本土确诊病例为0的省份##
c(mgdata$confirm[1:20]*10,mgdata$confirm[21:22])->mgdata$num##因数据范围差距较大,对其进行转换##
seq(1,length(mgdata$id_area))->mgdata$id
mm<-data.frame()
for(i in 1:length(mgdata$id_area)){
if(mgdata$id[i]<=10){
mm[i,1]<-paste0(mgdata$confirm[i],"例 ",mgdata$id_area[i])
}else if(mgdata$id[i]>10&mgdata$id[i]<=18){
mm[i,1]<-paste0(mgdata$confirm[i],"例\n",mgdata$id_area[i])
}else{
mm[i,1]<-paste0(mgdata$id_area[i],"\n",mgdata$confirm[i],"例")
}
}##生成图标文本标签##
mm$V1->mgdata$label
在对图形添加文本标签时发现角度较难掌握,一个一个添加较为繁琐,故编写了角度生成函数ggangel,可以根据柱状图数量生成文本标签角度(有需要的小伙伴可以拿去用哦~)。
ggangel<-function(x){
kk<-as.numeric()
for(i in 1:x){
j<-360/(2*x)
kk[i]<-j+(i-1)*j*2
}
return(kk)
}
###绘制南丁格尔玫瑰图###
colourful<-colorRampPalette(brewer.pal(5,"Spectral"))(22)##提取想要填充的颜色##
colourful = c("#54778f", "#4EB043", "#E69D2A", "#DD4714", "#A61650")##推荐色号##
ggplot(mgdata,aes(x=id,y=num,label=label))+geom_col(aes(fill=id),width = 1.1,size=0,show.legend = F)+scale_y_log10()+geom_col(aes(y=log10(8)),fill="white",width = 1.1,alpha=0.2,size=0)+geom_col(aes(y=log10(2)),fill="white",width = 1.1,alpha=0.2,size=0)+coord_polar()+theme_void()+scale_fill_gradientn(colors = colourful)->p
p+geom_text(data=filter(mgdata,id<=10),size=2,nudge_y = 0.8,fontface="bold",angle=90-ggangel(22)[1:10])+geom_text(data=filter(mgdata,id<=23&id>18),size=2,nudge_y = -0.5,fontface="bold",angle=360-ggangel(22)[19:22],color="white")+geom_text(data=filter(mgdata,id>10&id<=18),size=2,nudge_y=-0.5,fontface="bold",color="white")##依据标签位置类别逐类添加文本标签##
ggsave("f://data//Books//rosemap.jpg")##存图##