今天仍然是一篇介绍关于ggplot2高维分面的教程,为什么要单独把这一块内容写这么多篇呢,因为很重要,而且很难搞定呀,高维分面是否能够熟练掌握将决定着你对ggplot2的理解甚至对于整个高维数据可视化的理解是否能够进阶。
其实ggplot2系统内的分面函数只有简单的一个facet_grid(),但是恰恰就是这么一个不很起眼,甚至看起来有些特立独行的分面函数,却给高维数据可视化带来了革命性的变化,有了它,所有基于ggplot2的可视化图形都能够扩展呈现 维度,从第三维、第四维、第五维(理论上来说)。
还是再强调一下facet_grid()在ggplot2各个几何图层中的地位和控制范围,分面函数作为一个特殊的,具有美学映射属性,却被设计在了与几何图层近乎独立地位(表现在从写法上来看,它并没有被设计在几何图层内,而是与其他几何图层在位置上平行),由此可见包作者对其的推崇和重视。
它的控制权限是很高的,倘若你在facet_grid()函数内部指定了一个分面参数,那么剩余的所有几何图层都可以自动适用这个分面(当然前提是各几何图层的美学映射中都好含有与分面参数相同的变量)。
所以想要分面参数同事控制多个图层,必须保证每一个图层内都含有该分面参数同名的变量。
今天以气泡饼图为例:
library(ggplot2)
library(dplyr)
library(rgdal)
library(shiny)
library(shinythemes)
library(scatterpie)
china_map <-readOGR("D:/R/mapdata/State/china.geojson","OGRGeoJSON",stringsAsFactors=FALSE)
Encoding(china_map@data$name)<-"UTF-8"china_map <- fortify(china_map)
province_city <- read.csv("D:/R/rstudy/Province/chinaprovincecity.csv",stringsAsFactors = FALSE,check.names=FALSE)
city_data<-data.frame(Name=rep(c("北京","上海","重庆","武汉","广州","西安")))
for (i in 2:7) city_data[,i]<-round(runif(6,0,250))
names(city_data)[2:7]<-paste0("Year",2011:2016)
city_data$Full<-apply(city_data[,-1],1,sum)
city_data$Full_scale<-scale(city_data$Full,center=F,scale=T)*2
#提取中心城市数据:
city_data<-city_data%>%merge(province_city[,c("city","wd","jd")],by.x="Name",by.y="city",all.x=TRUE)
ggplot() +
geom_polygon(data=china_map,aes(x=long,y=lat,group=group),fill="white",color="grey")+
geom_scatterpie(data=city_data,aes(x=jd,y=wd,r=Full_scale),cols=names(city_data)[2:7],color="grey", alpha=.8) +
scale_fill_brewer(guide=FALSE)+
theme_void()
city_data2<-data.frame(Name=rep(city_data$Name,6))
for (i in 2:4) city_data2[,i]<-runif(nrow(city_data2),10,100)
names(city_data2)[2:4]<-paste0("Value",1:3)
city_data2$Year<-rep(paste0("Year",2011:2016),each=6)
city_data2<-city_data2%>%merge(city_data[,c("Name","jd","wd")],by="Name",all.x=T)
city_data2$Full<-apply(city_data2[,2:4],1,sum)%>%scale(center=F,scale=T)
city_data2$Full<-as.numeric(city_data2$Full)*2
city_data2<-city_data2%>%arrange(Year,Name)
ggplot()+
geom_polygon(data=china_map,aes(x=long,y=lat,group=group),fill="white",color="grey")+
geom_scatterpie(data=city_data2,aes(x=jd,y=wd,r=Full),cols=names(city_data2)[2:4],color="grey", alpha=.8) +
scale_fill_brewer(guide=FALSE)+
facet_wrap(~Year)+
theme_void()