作者简介
曹洋洋: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. x和y是视口中心点距离x坐标抽和y坐标轴的距离,
2. height和width是矩形的高度和宽度
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_step,help了一下,出现了万里长城的图形
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中仍有许多参数值得我们一一去探讨,详细的函数可以参考官方文档,或者借助于度娘~~文中有错误欢迎指出共同进步~~
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法