ggplot2多维分面多图层对应规则

今天只给大家讲一个知识点,是属于ggplot2高阶用法中的分面与多图层关系如何对应,这个用法之前困扰我很久,也是最近帮朋友做东西才发现这个漏洞,于是感觉分享给大家。

ggplot2的多维分面系统非常完美,可以让我们非常方便的将一个多维度的复杂图形按照某个维度的类别进行矩阵化,使得单个类别的信息更加清晰明了,数据呈现直观易懂。

通常我们可以通过如下步骤做出一个基于地理位置的分面图来。

library(ggplot2) library(plyr) library(maptools) library(Cairo) library(RColorBrewer) library(dplyr)

CHN_adm2 <- readShapePoly("D:/R/rstudy/CHN_adm/CHN_adm2.shp") CHN_adm2_1 <- fortify(CHN_adm2) data1 <- CHN_adm2@data data2 <- data.frame(id=row.names(data1),data1) china_map_data <- join(CHN_adm2_1,data2, type = "full") dongsansheng <-subset(china_map_data,NAME_1==c("Heilongjiang","Jilin","Liaoning")) dongsansheng$NAME_1<-as.character(dongsansheng$NAME_1)

mydata<-read.csv("D:/R/rstudy/State/dongsansheng.csv",header=T)

dongsansheng<-within(dongsansheng,{ NAME_1[NAME_1=="Heilongjiang"]="黑龙江" NAME_1[NAME_1=="Jilin"]="吉林" NAME_1[NAME_1=="Liaoning"]="辽宁" })

ggplot()+ geom_polygon(data=dongsansheng,aes(x=long,y=lat,group=group),colour="grey40",fill="white") + facet_grid(.~NAME_1,scales = "free")+ coord_map("polyconic")+ theme_void(base_size=18)

然而问题来了,以上图形仅仅基于同一个图层进行维度分面,倘若我有如下需求,不仅要对地图进行分面,而且要在单个区域地图上呈现一些点信息、线条的信息,这就意味着我们需要在保持分面的基础上,叠加图层,那么我们给分面函数指定的分面规则是否能够作用于第二个图层呢,或者说想要让分面函数同事控制所有图层应该 如何进行参数设定呢,分面参数的控制权限到底有多高呢?

带着以下疑问,我们先尝试着在原始分面图层的基础上叠加一个散点图层。

midpos <- function(x) mean(range(x,na.rm=TRUE)) centres <- ddply(dongsansheng,.(NAME_2),colwise(midpos,.(long,lat))) mydata<-mydata%>%merge(centres) ggplot() + geom_polygon(data=dongsansheng,aes(x=long,y=lat,group=group),colour="grey40",fill="white") + geom_point(data=mydata,aes(x=long,y=lat,size=zhibiao),colour="red",alpha=.5)+ facet_grid(.~NAME_1,scales = "free")+ coord_map("polyconic")+ scale_size_area(max_size=8)+ theme_void(base_size=18)

然而遗憾的是,我们得到的结果是这样的,分面函数仅仅控制了第一个图层(也就是地图的图层),却对第二个图层(散点图层没有任何影响),这不是我们想要的结果,我们想要的是这个分面参数同事完成地图和散点图的对应区域分割、匹配。

实际上以上结果并不难解释,因为我们在分面参数设定是,参数设置的依据是第一个图层的数据源中的NAME_1字段,但是我们并没有保证第二个图层中有这个同属性,同名称的字段。

事实上为了进行接下来的案例讲解,我确实在散点图的数据源中设定了一个跟多边形(也就是第一个图层)数据源的NAME_1同属性的字段(里面记录的都是类别相同的省份名称),为了对比效果暂时命名为Province。但是分面函数只能在以上两个数据框中找到第一个图层数据源中含有NAME_1变量,而第二个图层的数据源中尽管有同性质的变量,但是名称不同,分面函数是无法识别的,因为忽略了对图层二的分面操作。

接下来我将图层二中的省份名称变量更改为更图层一中名称相同,再看下结果:

mydata<-mydata%>%rename(NAME_1=Province) ggplot() + geom_polygon(data=dongsansheng,aes(x=long,y=lat,group=group),colour="grey40",fill="white") + geom_point(data=mydata,aes(x=long,y=lat,size=zhibiao),colour="red",alpha=.5)+ facet_grid(.~NAME_1,scales = "free")+ coord_map("polyconic")+ scale_size_area(max_size=8)+ theme_void(base_size=18)

这下效果一目了然,分面函数很顺利的识别了通过设定的分面依据字段NAME_1,在图层一、图层二中均探测到了同名字段,而且字段结构类别均一致,分面操作成功。

这个知识点相对难理解,属于ggplot2高阶用法中比较深奥的部分,与此相同的还有分面参数的控制权限范围问题,即分面参数的控制权限范围到底有多高,是否可以控制ggplot父函数内设定的同名参数,关于这一点儿,我先挖个坑,以后有时间再填,如果你感兴趣,可以自己通过以上提示,使用今天的案例数据修改参数,自己探索,相信在实践中提升技能,你学到的才是硬实力。

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-08-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏流媒体人生

mpg文件切片之后,不能播放问题分析

对于大部分mpg文件切片都能正常播放,而少部分mpg切片之后只有第一个切片能播放,后续的切片视频播放均失败,只能播放视频。

10520
来自专栏UAI人工智能

RLLAB 入门

47430
来自专栏C语言及其他语言

【程序源码】猜拳游戏

关注我们 今天来给大家来一段游戏源码(猜拳游戏) ? 程序截图如上。话不多说,上源码!! #include <stdio.h> #include <stdlib...

35960
来自专栏数据小魔方

Excel单元格内容合并的技巧!!!

今天给大家分享单元格内容合并的技巧! ▽ 之前推送过一篇单元格数据分裂的技巧,很多同学都私信我说很实用,并且希望以后能够多写一些这种可以瞬间提升工作效率的小技巧...

31970
来自专栏性能与架构

将 Redis 作为图数据库

1. 简介 Redis 在 4.0 中正式支持了Module模块系统,使其可以进行丰富的扩展 图数据库的应用越来越广泛,RedisGraph 就是一个 Redi...

47560
来自专栏葡萄城控件技术团队

前端代码标准最佳实践:CSS篇

上一篇《前端代码标准最佳实践:javascript》发表后,大家讨论还是很热烈,从侧面体现了前端工程师对写标准的前端代码的重视程度很高。这些最佳标准实践并不是那...

230100
来自专栏Flutter入门

Android OpenGL ES(六) - 将输入源换成视频

上文中,我们是将相机提供的预览画面输入到Surface当中,然后进行滤镜处理和录制。 那我们可以切换输入源为视频吗?

65750
来自专栏前端杂货铺

不要使用浏览器嗅探,尽量使用特性检测和特性模拟

平淡的描述   在js中,能使用特征监测就尽量不要使用浏览器嗅探。嗅探浏览器目的是判断可否使用这个对象或者API,但是抛开浏览器 的各个版本的userAgent...

31350
来自专栏写写代码吃吃瓜

OpenGL初学--环境配置和视景体初步接触

20250
来自专栏机器学习养成记

R语言爬虫与文本分析

之前用python做过简单的爬虫与分析,今天尝试一下用R完成相应的功能。首先用R爬取了《了不起的麦瑟尔夫人》豆瓣短评作为语料,然后进行了词云绘制、关键词提取的基...

473140

扫码关注云+社区

领取腾讯云代金券