使用grid包

grid是由Paul Murrell在1990s开发的R包,它提供了一种更简单的方式在指定的绘图区域生成图形。

使用视点

视点(viewpoint)是grid包的核心特征,它给我们提供了一个矩形区域用来组织图形。下面是一个例子:

library(grid)

vp <- viewport(x=0.5, y=0.5, width=0.9, height=0.9)

这个vp对象包含了一个视点如何被创建的规则。中心位置是(.5, .5),宽高相对于图形窗口都是.9。

在我们创建好视点之后,我们需要告诉R使用它。这需要使用pushViewport()函数,一旦一个视点被push,一个图形窗口就会在图形设备中创建(下面显示为一片空白)。

pushViewport(vp)

当我们键入上面命令后,视点vp就会聚焦于当前的绘图。

默认视点左下角的坐标是(0, 0),右上角的坐标是(1, 1)。作为第一个例子,我们将绘制一个半径为0.3的,圆心在(0.6, 0.4)的圆。

grid.circle(x=0.6, y=0.4, r=0.3)
画个圆

Figure 1: 画个圆

我们再来看另一个例子——创建一个小人。

stickperson <- function(){
    grid.circle(x=.5, y=.8, r=.1, gp=gpar(fill="yellow"))
    grid.lines(c(.5, .5), c(.7, .2)) # 身体垂直线
    grid.lines(c(.5, .7), c(.6, .7)) # 右臂
    grid.lines(c(.5, .3), c(.6, .7)) # 左臂
    grid.lines(c(.5, .65), c(.2, 0)) # 右腿
    grid.lines(c(.5, .35), c(.2, 0))
}

stickperson()
火柴人

Figure 2: 火柴人

画圆的时候代码使用了gp参数,这个参数可以带入大量通过gpar()函数指定的图形参数,它是grid版本的par函数。我们这里使用了fill给圆填充颜色。

内置的grid.lines()函数用来根据坐标画线,组成火柴人的各个躯干。

除了在一个视点内画图,我们可以在已经push的视点中构建和push另外的视点。例如,我们想要创建第二个(更小)的视点在一个已创建的视点内。

vp1 <- viewport(x=.5, y=.75, width=.6, height=.3)
pushViewport(vp1)

新的视点vp1将会被push到vp上去。而且,构建视点使用的数值单位与vp将是一个相对值,也就是说vp1的大小不是相对于图形窗口,而是相对于vp

通俗的讲,vp1变成了vp的儿子,而vp变成了vp1的老子。

我们可以使用函数pushViewport()upViewport()来回改变我们聚焦的视点。

命令downViewport()popViewport()同样可以改变我们的聚焦。例如当我们返回到vp后,命令downViewport(vp1)可以将我们从vp移回到vp1。而这种push与up/down的操作是可以无限循环的。

在push了vp1之后,我们可以在vp1中构建图形。

grid.circle(gp=gpar(col="blue"))
grid.rect()

想要返回vp,我们键入

upViewport()
#popViewport(1)

这时候我们在vp上画圆:

grid.circle(gp=gpar(col="purple"))

(这里有些问题,自己尝试)

下面这个例子显示了嵌套的视点。

pushViewport(viewport())
grid.lines(c(.05, .95), c(.95, .05))
grid.lines(c(.05, .95), c(.05, .95))
for (i in 1:100){
    vp <- viewport(h=.9, w=.9)
    pushViewport(vp)
    grid.rect()
}

为了能在最上层的视点中绘图,我们键入

upViewport(100)

可能我使用rmd写动态文档的原因,使用upViewport一直报错。这里没显示结果或者注释的代码请自己尝试下。

显示数据

接下来我们展示如何使用视点Display数据。

comments powered by Disqus