R语言绘图底层系统之Grid包

2018 年 10 月 26 日 R语言中文社区

作者简介

曹洋洋:R语言爱好者。


👉本文转载自公众号EasyCharts


Grid 中文翻译为网格,属于R底层的图形系统。可将其解释为将画布分割,通过设定相应参数,从而可以任意的摆放图形。Grid包有单独的pdf帮助文档,如果你不想去认排列组合的abcd请继续往下看,本文或许对你有所启发,初学者有错误还请各位见谅~~~

先来了解相关参数:

library(grid) #加载包 grid.newpage() #创建一个空白视口 vp1<-viewport(x = 0.5, y = 0.5, width = 0.5,height = 0.25, angle=45) #设定视口大小 grid.show.viewport(vp1) #查看创建的视口



Grid包参数较少,相比于ggplot2庞大的函数系统,grid包算是小巫见大巫了。核心参数为viewport,此文着重介绍viewport()函数。

viewport(x = unit(0.5, "npc"), y =unit(0.5, "npc"),        width = unit(1, "npc"), height = unit(1, "npc"),        default.units = "npc", just = "centre",         gp =gpar(), clip = "inherit",        xscale = c(0, 1), yscale = c(0, 1),        angle = 0,        layout = NULL,        layout.pos.row = NULL, layout.pos.col = NULL,         name= NULL)

以上语法中

1. xy是视口中心点距离x坐标抽和y坐标轴的距离,

2. heightwidth是矩形的高度和宽度

3.Layout:窗口布局包含layout.pos.row:layout.pos.col等参数

4. Just:视口中心的位置,如果是两个值则第一个对水平调整,第二个对纵轴方向调整。若用字符表达:"left","right", "centre","center", "bottom", and "top"。若用数值表达0表示左对齐,1表示右对齐。默认状态下是所创建的视口的中心。

5. Angle:角度,grid包可以通过调整视口的角度来改变图形的角度。

当创建了新的viewport以后,此时还是空白图形。我们可以用pushViewport()将其push出去,但此时仍为空白视口,须在此视口中绘制其他图形。

6. Grid包为每一个viewport创建一个viewport树,使用pushViewport()函数将所建的viewport push出去当作该树的一个节点,作为当前的viewport

pushViewport:向当前的一个viewport添加一个新的viewport,原viewport则变为父viewport,新的viewport则为当前的viewport。简单的来说就是在原视口内添加一个新的视口并把新视口当作绘图区域。

popViewport():把当前的viewport删除,其父变为新的viewport

downViewport():导航到子viewport,原viewport不会被删除

upViewport()函数:导航到子viewport的父viewport,父viewport变成活跃viewport,原viewport不会被删除

画了一个草图方便理解(原谅我丑丑的字~~

反正我是不懂这难读的绕口令~~示例说明:

library(grid) ####父viewport grid.newpage() #新建一个page vp1 <- viewport(x = 0, y = 0.5, w = 0.5, h =0.5,               just = c("left", "bottom"), name = "vp1")#新建一个viewport pushViewport(vp1) #将该viewport推出到page中 grid.rect(gp = gpar(col = "grey")) #新建一个矩形 grid.text("Some drawing in graphics region1", y = 0.8) #######子viewport vp1 <- viewport(x = 0, y = 0.5, w = 0.5, h =0.5,               just = c("left", "bottom"), name = "vp1")#新建一个viewport pushViewport(vp1) #以当前的viewport作为整个page 新建一个viewport,可以认为是子viewport grid.rect(gp = gpar(lty = "dashed")) grid.text("Some drawing in graphics region 2",y = 0.8) upViewport() #从子viewport离开回到父viewport grid.text("Some drawing in graphics region 3",y = 0.8) downViewport("vp1") #从父viewport离开回到子viewport grid.text("Some drawing in graphics region 4",y = 0.8) popViewport() #删除当前viewport,回到父viewport grid.text("MORE drawing in graphics region1", y = 0.2)


实战演练:

在整理ggplot2的图形参数时偶然发现阶梯图函数geom_stephelp了一下,出现了万里长城的图形

help(geom_step) recent <- economics[economics$date >as.Date("2013-01-01"), ] ggplot(recent, aes(date, unemploy)) + geom_step()



因为此图形上下较空,看起来不好看,思考是否能结合grid包将阶梯当作装饰,在其上下各绘制一张图形如下

此为完整code

library(ggplot2) library(grid) grid.newpage() vp1<- viewport(x=0, y=0, width=1, height=1,just=c("left", "bottom")) data<-data.frame(a=c(1,1.5,2,2.3,2.5,3,4,5),b=c(100,120,150,200,250,300,350,400)) p1<-ggplot(data,aes(a,b))+ geom_step()+ theme(axis.line=element_line(color="white"),axis.title=element_text(color="white"),       axis.text.x=element_text(color="white"),       axis.text.y=element_text(color="white"),       axis.ticks =element_line(color="white"),panel.background=element_blank())+  xlab("")+  ylab("");p1 vp2<- viewport(x=0.5, y=0, width=0.5,height=0.5, just=c("left", "bottom")) p2<- ggplot(data=iris,aes(x = Sepal.Length,y =Sepal.Width)) + geom_point(aes(colour = Species)) + stat_smooth() +  theme(panel.background=element_blank(),        legend.position=c(0.8,0.8),legend.title=element_blank(),axis.line=element_line(size=0.2)) vp3<- viewport(x=0, y=0.4, width=0.4,height=0.6, just=c("left", "bottom")) p3<-ggplot(mtcars, aes(x = mpg, y = wt, color =factor(gear)))+ geom_point()+  theme(panel.grid.major=element_blank(),        panel.grid.minor=element_blank(),        panel.background=element_blank(),        axis.line=element_line(size=0.2),        legend.position=c(0.8,0.7),legend.title =element_blank()) print(p1, vp=vp1) print(p2, vp=vp2) print(p3, vp=vp3)

此图的设计理念是创建3个视图窗口并以同一个点为3个视图窗口的原点。通过虚拟数据集合(阶梯图的数据,可以自行调整)将两个散点图分割开来。另外考虑到图例的位置可能会覆盖阶梯,因此我把图例放置在图形内部,当然具体问题还需要具体考虑。

Grid中还有一个重要参数layout,可支持行列布局。任意摆放图形

如下:

library(ggplot2) library(grid) p1<- ggplot(data=iris,aes(x = Sepal.Length,y =Sepal.Width))+  geom_point(aes(colour= Species)) + stat_smooth() + theme(legend.position=c(0.8,0.8),legend.title =element_blank(),       panel.background=element_blank(),       axis.line=element_line(size=0.2)) p2<-ggplot(mtcars, aes(x = mpg, y = wt, color =factor(gear)))+ geom_point()+  theme(panel.grid.major=element_blank(),        panel.grid.minor=element_blank(),        panel.background=element_blank(),        axis.line=element_line(size=0.2),        legend.position=c(0.8,0.7),legend.title =element_blank()) grid.newpage() pushViewport(viewport(layout = grid.layout(2, 1))) print(p1, vp=viewport(layout.pos.row=1,layout.pos.col=1)) print(p2, vp=viewport(layout.pos.row=2,layout.pos.col=1))



总的来说grid中仍有许多参数值得我们一一去探讨,详细的函数可以参考官方文档,或者借助于度娘~~文中有错误欢迎指出共同进步~~



大家都在看 

2017年R语言发展报告(国内)

精心整理 | R语言中文社区历史文章合集(作者篇)

精心整理 | R语言中文社区历史文章整理(类型篇)

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

回复 爬虫             爬虫三大案例实战  
回复 
Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 
人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

登录查看更多
0

相关内容

NPC:IFIP International Conference on Network and Parallel Computing。 Explanation:网络与并行计算国际会议。 Publisher:Springer。 SIT: http://dblp.uni-trier.de/db/conf/npc/
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
Python计算导论,560页pdf,Introduction to Computing Using Python
专知会员服务
72+阅读 · 2020年5月5日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
224+阅读 · 2020年3月22日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
Cayley图数据库的可视化(Visualize)
Python开发者
5+阅读 · 2019年9月9日
R语言机器学习:xgboost的使用及其模型解释
R语言中文社区
11+阅读 · 2019年5月6日
R语言自然语言处理:情感分析
R语言中文社区
16+阅读 · 2019年4月16日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
R语言数据挖掘利器:Rattle包
R语言中文社区
21+阅读 · 2018年11月17日
Stata绘图:简单好用的37条外部命令
R语言中文社区
25+阅读 · 2018年9月22日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
[软件方法]涉众利益和基本路径
UMLChina
4+阅读 · 2017年9月2日
Learning Implicit Fields for Generative Shape Modeling
Arxiv
10+阅读 · 2018年12月6日
Arxiv
136+阅读 · 2018年10月8日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Arxiv
4+阅读 · 2018年1月29日
Arxiv
6+阅读 · 2018年1月29日
Arxiv
6+阅读 · 2018年1月11日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
Python计算导论,560页pdf,Introduction to Computing Using Python
专知会员服务
72+阅读 · 2020年5月5日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
224+阅读 · 2020年3月22日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
相关资讯
Cayley图数据库的可视化(Visualize)
Python开发者
5+阅读 · 2019年9月9日
R语言机器学习:xgboost的使用及其模型解释
R语言中文社区
11+阅读 · 2019年5月6日
R语言自然语言处理:情感分析
R语言中文社区
16+阅读 · 2019年4月16日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
R语言数据挖掘利器:Rattle包
R语言中文社区
21+阅读 · 2018年11月17日
Stata绘图:简单好用的37条外部命令
R语言中文社区
25+阅读 · 2018年9月22日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
[软件方法]涉众利益和基本路径
UMLChina
4+阅读 · 2017年9月2日
相关论文
Learning Implicit Fields for Generative Shape Modeling
Arxiv
10+阅读 · 2018年12月6日
Arxiv
136+阅读 · 2018年10月8日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Arxiv
4+阅读 · 2018年1月29日
Arxiv
6+阅读 · 2018年1月29日
Arxiv
6+阅读 · 2018年1月11日
Top
微信扫码咨询专知VIP会员