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

作者简介

曹洋洋: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) #查看创建的视口


640?wx_fmt=png

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不会被删除

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

640?wx_fmt=png

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

 
 

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()


640?wx_fmt=png

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

640?wx_fmt=png

此为完整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))


640?wx_fmt=png

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


640?wx_fmt=gif


大家都在看 

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

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

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

640?wx_fmt=jpeg

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值