查看原文
其他

R语言可视化——多图层叠加(离散颜色填充与气泡图综合运用)

2016-10-14 小魔方 数据小魔方

今天这一篇是昨天推送的基础上进行了进一步的深化,主要讲如何在离散颜色填充的地图上进行气泡图图层叠加。


为了使得案例前后一致,仍然使用昨天的数据集。


加载包:


library(ggplot2)

library(plyr)

library(maptools)

library(sp)


导入中国省界地图:

china_map<-readShapePoly("c:/rstudy/bou2_4p.shp")

data1<- china_map@data      

data2<- data.frame(id=row.names(data1),data1) 


数据格式转化及业务数据合并:

china_map1 <- fortify(china_map) 

china_map_data <- join(china_map1,data2, type = "full") 

mydata <- read.csv("c:/rstudy/geshengzhibiao.csv")

china_data <- join(china_map_data, mydata, type="full")


各省省会城市经纬度数据:

province_city <- read.csv("c:/rstudy/chinaprovincecity.csv") 


###根据自己的数据量级和具体业务需要设置分割点

mydata<-mydata[,-c(5,6)]

mydata$zhibiao<-rnorm(33,100,50)

mydata$zhibiao<-abs(mydata$zhibiao)

mydata$zhibiao2<-round(mydata$zhibiao,0)

mydata$fau <- cut(mydata$zhibiao, breaks = c(0,50,100,150,200,250)) 


###将转换的分段因子变量重新命名为我们需要的分段阀值:


mydata$fam<-factor(mydata$fau,levels=c('(0,50]','(50,100]','(100,150]','(150,200]','(200,250]'),labels=c('0~50','50~100','100~150','150~200','200~250'),order=TRUE)



#将业务数据与地理信息数据合并:

china_data <- join(china_map_data, mydata, type="full") 

province_city <- read.csv("c:/rstudy/chinaprovincecity.csv")

windowsFonts(myFont = windowsFont("微软雅黑"))



离散标度填充:

ggplot(china_data, aes(x = long, y = lat, group = group,fill =fam)) +

     geom_polygon(colour="white")+

     scale_fill_brewer(palette="Blues") +  ###Blues&Greens

     coord_map("polyconic") +

     ggtitle("某公司2015~2016年度营业状况分布图")+  #写入标题

     guides(fill=guide_legend(reverse=TRUE,title=NULL))+       

     theme(               

          panel.grid = element_blank(),

          panel.background = element_blank(),

          title=element_text(family="myFont"),

          axis.text = element_blank(),

          axis.ticks = element_blank(),

          axis.title = element_blank(),

          legend.position = c(0.08,0.4),

          legend.text.align=1

          )




在离散颜色标度的基础上添加各省份散点图:


ggplot() +

     geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+

     geom_point(data=province_city,aes(x=jd,y=wd),colour="red")+

     scale_fill_brewer(palette="Blues") +  ###Blues&Greens

     coord_map("polyconic") +

     ggtitle("某公司2015~2016年度营业状况分布图")+  #写入标题

     guides(fill=guide_legend(reverse=TRUE,title=NULL))+       

     theme(               

          panel.grid = element_blank(),

          panel.background = element_blank(),

          title=element_text(family="myFont"),

          axis.text = element_blank(),

          axis.ticks = element_blank(),

          axis.title = element_blank(),

          legend.position = c(0.08,0.4),

          legend.text.align=1

          )




更该散点图为气泡图:


province_city$PerforamA<-round(rnorm(34,100,30),0)

province_city$Perforamb<-round(rnorm(34,100,30),0)



ggplot() +

     geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+

     geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+

     scale_fill_brewer(palette="Blues") +  ###Blues&Greens

     scale_size_area(max_size=6)+

     coord_map("polyconic") +

     ggtitle("某公司2015~2016年度营业状况分布图")+  #写入标题

     guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+       

     theme(               

          panel.grid = element_blank(),

          panel.background = element_blank(),

          title=element_text(family="myFont"),

          axis.text = element_blank(),

          axis.ticks = element_blank(),

          axis.title = element_blank(),

          legend.position = c(0.08,0.4),

          legend.text.align=1

          )



本来打算再继续在气泡图的基础上进行颜色渐变填充呢,可以试了一下,这样的话前面的底图离散颜色标度填充的的时候已经使用过了一个fill属性设置选项,而要对气泡图进行颜色渐变填充就要再使用一次fill属性,可是目前为止我还不知道如何在多图层中出现多个fill属性的时候如何识别并分别进行标度设置,当我运行如下代码时,软件无法识别两个颜色标度设置分别对应的指标,因而图表无法跑出来:


ggplot() +

     geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+

     scale_fill_brewer(palette="Blues") +  ###Blues&Greens

     geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA,fill=PerforamB),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+     

     scale_size_area(max_size=6)+

     scale_fill_gradient2(low="DarkCyan", mid="Azure", high="Sienna", midpoint=median(province_city$PerforamB))+ 

     coord_map("polyconic") +

     ggtitle("某公司2015~2016年度营业状况分布图")+  #写入标题

     guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+       

     theme(               

          panel.grid = element_blank(),

          panel.background = element_blank(),

          title=element_text(family="myFont"),

          axis.text = element_blank(),

          axis.ticks = element_blank(),

          axis.title = element_blank(),

          legend.position = c(0.08,0.4),

          legend.text.align=1

          )


Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

Error: Discrete value supplied to continuous scale


实在是太遗憾了,不知道哪位大神知道如何处理多图层相同的fill属性,可以告知在下,这里先行谢过了。



最后来处理标签问题,为了防止页面杂乱不堪,我只用了PerforamA指标前十个标签。


labelper<-province_city[order(province_city[,5],decreasing=T),][1:10,]


ggplot() +

     geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+

     geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+

     scale_fill_brewer(palette="Blues") +  ###Blues&Greens

     scale_size_area(max_size=6)+

     coord_map("polyconic") +

     geom_text(aes(x=jd+2.3,y=wd,label=city),size =3,family="myFont",fontface="plain",data=labelper) +

     ggtitle("某公司2015~2016年度营业状况分布图")+  #写入标题

     guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+       

     theme(               

          panel.grid = element_blank(),

          panel.background = element_blank(),

          title=element_text(family="myFont"),

          axis.text = element_blank(),

          axis.ticks = element_blank(),

          axis.title = element_blank(),

          legend.position = c(0.08,0.4),

          legend.text.align=1

          )





要是把所有的标签全部都添加到地图上的话,真的不太合适,本来图层就有两个,已经出现信息相互遮挡的情况了。


ggplot() +

     geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+

     geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+

     scale_fill_brewer(palette="Blues") +  ###Blues&Greens

     scale_size_area(max_size=6)+

     coord_map("polyconic") +

     geom_text(aes(x=jd+2.3,y=wd,label=city),size =3,family="myFont",fontface="plain",data=province_city) +

     ggtitle("某公司2015~2016年度营业状况分布图")+  #写入标题

     guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+       

     theme(               

          panel.grid = element_blank(),

          panel.background = element_blank(),

          title=element_text(family="myFont"),

          axis.text = element_blank(),

          axis.ticks = element_blank(),

          axis.title = element_blank(),

          legend.position = c(0.08,0.4),

          legend.text.align=1

          )




所以标签的话,还是尽量越少越好,最好别添加,本来省级行政单位作为地理常识,已经是大家心知肚明的东西了,信息表达到位了就OK了。



魔方学院QQ群:


QQ群:

微信群:




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存