前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」grid 图形对象 grobs

「R」grid 图形对象 grobs

作者头像
王诗翔呀
发布2021-06-16 16:34:11
1.1K0
发布2021-06-16 16:34:11
举报
文章被收录于专栏:优雅R优雅R

学习材料: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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档