「R」grid 图形对象 grobs

2021-06-16 16:34:11 浏览数 (2)

学习材料:https://bookdown.org/rdpeng/RProgDA/the-grid-package.html#grobs

grobs 是 grid 绘图系统中图形对象的表示,即 graphics objects = grobs。

grobs 的创建通常使用以 Grob 作为后缀的函数们,包括circleGrob, linesGrob, polygonGrob, rasterGrob, rectGrob, segmentsGrob, legendGrob, xaxisGrob, and yaxisGrob 等等。 gridExtra 包定义了更多的图形对象。

下面是一个绘圆的示例:

代码语言:javascript复制
library(grid)
my_circle <- circleGrob(x = 0.5, y = 0.5, r = 0.5,
                        gp = gpar(col = "gray", lty = 3))

每个图形对象有自带的参数,比如圆有它的中心,半径。而不同的对象有相同的一些参数设定,包括颜色、线型、大小等等,这通过 gpar 函数进行设定。

再创建图形对象后,使用 grid.draw() 将图形绘制出来。

代码语言:javascript复制
grid.draw(my_circle)

多个图形对象可以叠加,而且叠加后可以修改原来的图形对象。

代码语言:javascript复制
my_circle <- circleGrob(name = "my_circle",
                        x = 0.5, y = 0.5, r = 0.5,
                        gp = gpar(col = "gray", lty = 3))
grid.draw(my_circle)

my_rect <- rectGrob(x = 0.5, y = 0.5, width = 0.8, height = 0.3)
grid.draw(my_rect)

修改:

代码语言:javascript复制
grid.edit("my_circle", gp = gpar(col = "red", lty = 1))

ggplot2 是基于 grid 系统构建的,所以它们可以比较好的进行整合。

代码语言:javascript复制
wc_plot <- ggplot(worldcup, aes(x = Time, y = Passes))   
  geom_point()

grid.draw(wc_plot)
grid.draw(my_circle)

我们可以使用 grid 提供的函数来修改 ggplot2 图形,首先我们需要先找到 ggplot 图像中的对象,然后使用 grid.edit() 进行修改。

下面是一个例子:

代码语言:javascript复制
wc_plot
grid.force() # 将 ggplot2 转变为 grid 对象列表
grid.ls()

输出:

代码语言:javascript复制
layout
  background.1-7-10-1
  panel.6-4-6-4
    grill.gTree.1413
      panel.background..rect.1404
      panel.grid.minor.y..polyline.1406
      panel.grid.minor.x..polyline.1408
      panel.grid.major.y..polyline.1410
      panel.grid.major.x..polyline.1412
    NULL
    geom_point.points.1400
    NULL
    panel.border..zeroGrob.1401
  spacer.7-5-7-5
  spacer.7-3-7-3
  spacer.5-5-5-5
  spacer.5-3-5-3
  axis-t.5-4-5-4
  axis-l.6-3-6-3
    axis.line.y..zeroGrob.1432
    axis
      axis.1-1-1-1
        GRID.text.1429
      axis.1-2-1-2
  axis-r.6-5-6-5
  axis-b.7-4-7-4
    axis.line.x..zeroGrob.1425
    axis
      axis.1-1-1-1
      axis.2-1-2-1
        GRID.text.1422
  xlab-t.4-4-4-4
  xlab-b.8-4-8-4
    GRID.text.1416
  ylab-l.6-2-6-2
    GRID.text.1419
  ylab-r.6-6-6-6
  subtitle.3-4-3-4
  title.2-4-2-4
  caption.9-4-9-4

然后我们可以针对性修改:

代码语言:javascript复制
grid.edit("geom_point.points.1400", gp = gpar(col = "red"))
grid.edit("GRID.text.1419", gp = gpar(fontface = "bold"))

ggplot2 包中的 ggplotGrob() 函数可以将 ggplot 对象转化为 grob。

gTree grob 可以包含多个子 grob(即组装多个子对象),可以用于像箱线图这种复杂的图形中。下面是例子:

代码语言:javascript复制
candy <- circleGrob(r = 0.1, x = 0.5, y = 0.6)
stick <- segmentsGrob(x0 = 0.5, x1 = 0.5, y0 = 0, y1 = 0.5)
lollipop <- gTree(children = gList(candy, stick))
grid.draw(lollipop)

列出子对象:

代码语言:javascript复制
grid.ls(lollipop)
GRID.gTree.7233
  GRID.circle.7231
  GRID.segments.7232

0 人点赞