试验设计与数据分析
  1. Tidyverse学习
  2. 7  grid系统
  1. Tidyverse学习
  2. 7  grid系统

7  grid系统

  • 主页

  • 试验设计概述
    • 1  试验设计基础

  • R语言基础
    • 2  Rstudio环境配置
    • 3  数据类型与基本语法

  • Tidyverse学习
    • 4  tidyverse简介
    • 5  数据读取与导出
    • 6  ggplot2
    • 7  grid系统

  • 回归与拟合
    • 8  线性和非线性拟合

  • 试验设计与方差分析
    • 9  随机区组试验设计
    • 10  裂区试验设计

  • 高级统计分析
    • 11  通径分析
    • 12  随机森林回归
    • 13  主成分分析(PCA)
    • 14  冗余分析
    • 15  结构方程模型
    • 16  弦图(Chord diagram)
    • 17  Meta分析

  • 关于

页内导航

  • 7.1 grid 图形模型
    • 7.1.1 图形原语
    • 7.1.2 坐标系统
    • 7.1.3 gpar参数对象
    • 7.1.4 画布与窗口(viewport)
    • 7.1.5 viewport图形参数
    • 7.1.6 布局

R 中主要存在两种绘图系统:

  • base R 传统图像系统

  • grid 图像系统

传统的图像系统是由 graphics 包所提供的一系列函数组成,grid 系统是 grid 包提供的。grid 包是一个底层的绘图系统,提供的都是底层的绘图函数,没有用于绘制复杂图形的高级函数。像 ggplot2 和 lattice 两个顶层的绘图包都是基于 grid 系统的,所以,了解 grid 包对于理解 ggplot2 的顶层函数的工作方式是很有帮助的。同时,也可以使用 grid 包来灵活地控制图形的外观和布局。

library(knitr)
library(tidyverse)
library(grid)
# library(pacman)
# p_load(grid)

7.1 grid 图形模型

7.1.1 图形原语

grid提供了一些函数用于绘制简单的图形。

表 7.1 grid包基本绘图函数
函数 功能描述 返回值
grid.move.to 设置当前位置 moveToGrob
grid.line.to 绘制一条从当前位置到指定位置的线并重置当前位置 lineToGrob
grid.line 绘制直线 linesGrob
grid.segments 绘制线段 segmentsGrob
grid.rect 在指定位置绘制矩形 rectGrob
grid.circle 根据位置和半径绘制圆形 circleGrob
grid.polygon 根据顶点绘制多边形 polygonGrob
grid.text 在指定位置和角度绘制文本 textGrob
grid.arrows 绘制带箭头的线 arrowsGrob
grid.points 绘制散点 pointsGrob
grid.xaxis 绘制x轴 xaxisGrob
grid.yaxis 绘制y轴 yaxisGrob

这些函数被称为图形原语,使用这些函数可以直接绘制对应的图形,例如

grid::grid.text(label = "让我们用grid包,开始绘图吧!")
图 7.1 绘制文本
x <- seq(-10, 10, length=1000)
grid::grid.circle(
  x=x,
  y=sin(x),
  r=abs(0.1*sin(4*x))
)
图 7.2 绘制图形

7.1.2 坐标系统

grid 的坐标系统是用来确定数值的单位,同样的数值在不同的单位中表示不同的大小,看起来叫单位系统应该会更恰当些。

表 7.2 grid坐标系统
坐标系统 描述
native 位置和大小相对于当前viewport的x、y轴的范围
npc 将当前viewport的左下角为(0,0)右上角为(1,1)
snpc 位置和大小被表示为当前viewport的宽度和高度中更小的值的比例
inches 英寸,(0,0)表示viewport的左下角
cm 厘米
mm 毫米
points 点,每英寸相当于72.27个点
bigpts 大点,每英寸相当于72个大点
picas 1pica相当于12个点
dida 1157个dida相当于1238个点
cicero 1 cicero相当于12个dida
scaledpts 相当于一个点的65536分之一
char 相当于字体大小为单位(由fontsize和cex确定)
lines 相当于以线条高度为单位(由fontsize,cex,lineheight确定)
strwidth 相当于以字符串的宽度为单位(由fontsize, cex, fontfamily, fontface确定)
strheight 相当于以字符串的高度为单位(由fontsize, cex, fontfamily, fontface确定)
grobwidth 以给定图形对象的宽度为单位
grobheight 以给定图形对象的高度为单位

使用unit函数来设置不同的系统

unit(1,"cm")
[1] 1cm
unit(1,"npc")
[1] 1npc

坐标系统之间的运算将会以表达式的方式返回

unit(1,"cm") - unit(1,"npc")
[1] sum(1cm, -1npc)

对于字符串及对象长度坐标系统

unit(1,"strwidth","Some Text")
[1] 1strwidth
unit(1, "grobwidth", grid::textGrob("Some Text"))
[1] 1grobwidth

可以使用 convertWidth 和 convertHeight 实现单位之间的转换

# library(grid)
grid::convertHeight(unit(2,"cm")-unit(1,"npc"),"mm")
[1] -107mm
grid::convertHeight(unit(1,"strwidth","Some Text"),"mm")
[1] 19.84375mm

我们可以使用不同的单位系统来绘制一个矩形

Text <- "让我们用grid包开始绘图吧!"

grid::grid.rect(
  x=unit(0.5, "npc"), 
  y=unit(1, "inches"),
  width=grid::stringWidth(Text), 
  height=unit(1, "lines")#,
  # gp=gpar(fill="blue")
  # just=c("left", "bottom")
)
grid::grid.text(
  x=unit(0.5, "npc"), 
  y=unit(1, "inches"),
  label =Text)

7.1.3 gpar参数对象

所有的图形原语函数都有一个 gp(graphical parameters) 参数,用来接收一个 gpar 对象,该对象包含一些图形参数用于控制图像的输出。gpar 对象可以使用 gpar() 函数来生成。

grid::gpar(col="red",lty="dashed")
$col
[1] "red"

$lty
[1] "dashed"
表 7.3 grid图形参数
参数 描述
col 线条、文本、矩形边框等的颜色
fill 矩形、圆形、多边形的填充色
gamma 颜色的gamma 校正值
alpha 透明度
lwd 线条宽度
lex 线条扩展乘子
lty 线条类型
lineend 线端,点类型:round,butt,square
linejoin 线连接点类型:round,mitre,bevel
linemitre 线条斜率限制
cex fontsize的扩展乘子
fontsize 字体大小(points)
fontface 字体样式(bold,italic/ob1ique,plain,bold.italic或整数1-4)
fontfamily 字体家族
lineheight 线高

使用 get.gpar 可以获取当前图形参数的值,如果未指定要获取的参数,将会返回所有的参数值

library(grid)
get.gpar(c("lty", "fill"))
$lty
[1] "solid"

$fill
[1] "white"

在 grid 中,cex 参数是累积的,也就是说当前的 cex 值等于当前设置的值乘上之前的 cex 值 在一个 viewport 中设置了 cex = 0.5,之后的文本又设置了 cex = 0.5,最后文本的大小就是 0.5*0.5 = 0.25

alpha 参数与 cex 类似,也是累积的

7.1.4 画布与窗口(viewport)

library(grid)
grid.text(
  "top-left corner", 
  x=unit(1, "mm"),
  y=unit(1, "npc") - unit(1, "mm"),
  just=c("left", "top")
  )

pushViewport(
  viewport(
    width=0.8, 
    height=0.5, 
    angle=10,
    name="vp1"
    )
  )

grid.rect()

grid.text(
  "top-left corner", 
  x = unit(1, "mm"),
  y = unit(1, "npc") - unit(1, "mm"),
  just = c("left", "top")
  )

7.1.5 viewport图形参数

7.1.6 布局

6  ggplot2
Source Code
# grid系统

R 中主要存在两种绘图系统:

-   base R 传统图像系统

-   grid 图像系统

传统的图像系统是由 graphics 包所提供的一系列函数组成,grid 系统是 grid 包提供的。`grid` 包是一个底层的绘图系统,提供的都是底层的绘图函数,没有用于绘制复杂图形的高级函数。像 `ggplot2` 和 `lattice` 两个顶层的绘图包都是基于 `grid` 系统的,所以,了解 `grid` 包对于理解 `ggplot2` 的顶层函数的工作方式是很有帮助的。同时,也可以使用 `grid` 包来灵活地控制图形的外观和布局。

```{r}
library(knitr)
library(tidyverse)
library(grid)
# library(pacman)
# p_load(grid)
```

## grid 图形模型

### 图形原语

grid提供了一些函数用于绘制简单的图形。

| 函数          | 功能描述                                       | 返回值       |
|------------------------|------------------------|------------------------|
| grid.move.to  | 设置当前位置                                   | moveToGrob   |
| grid.line.to  | 绘制一条从当前位置到指定位置的线并重置当前位置 | lineToGrob   |
| grid.line     | 绘制直线                                       | linesGrob    |
| grid.segments | 绘制线段                                       | segmentsGrob |
| grid.rect     | 在指定位置绘制矩形                             | rectGrob     |
| grid.circle   | 根据位置和半径绘制圆形                         | circleGrob   |
| grid.polygon  | 根据顶点绘制多边形                             | polygonGrob  |
| grid.text     | 在指定位置和角度绘制文本                       | textGrob     |
| grid.arrows   | 绘制带箭头的线                                 | arrowsGrob   |
| grid.points   | 绘制散点                                       | pointsGrob   |
| grid.xaxis    | 绘制x轴                                        | xaxisGrob    |
| grid.yaxis    | 绘制y轴                                        | yaxisGrob    |

: grid包基本绘图函数 {#tbl-grid-functions}

这些函数被称为图形原语,使用这些函数可以直接绘制对应的图形,例如

```{r}
#| label: fig-grid-start
#| fig-cap: 绘制文本
grid::grid.text(label = "让我们用grid包,开始绘图吧!")
```

```{r}
#| label: fig-grid-circle
#| fig-cap: 绘制图形

x <- seq(-10, 10, length=1000)
grid::grid.circle(
  x=x,
  y=sin(x),
  r=abs(0.1*sin(4*x))
)
```

### 坐标系统

`grid` 的坐标系统是用来确定数值的单位,同样的数值在不同的单位中表示不同的大小,看起来叫单位系统应该会更恰当些。

| 坐标系统 | 描述 |
|---------------|---------------------------------------------------------|
| native | 位置和大小相对于当前viewport的x、y轴的范围 |
| npc | 将当前viewport的左下角为(0,0)右上角为(1,1) |
| snpc | 位置和大小被表示为当前viewport的宽度和高度中更小的值的比例 |
| inches | 英寸,(0,0)表示viewport的左下角 |
| cm | 厘米 |
| mm | 毫米 |
| points | 点,每英寸相当于72.27个点 |
| bigpts | 大点,每英寸相当于72个大点 |
| picas | 1pica相当于12个点 |
| dida | 1157个dida相当于1238个点 |
| cicero | 1 cicero相当于12个dida |
| scaledpts | 相当于一个点的65536分之一 |
| char | 相当于字体大小为单位(由fontsize和cex确定) |
| lines | 相当于以线条高度为单位(由fontsize,cex,lineheight确定) |
| strwidth | 相当于以字符串的宽度为单位(由fontsize, cex, fontfamily, fontface确定) |
| strheight | 相当于以字符串的高度为单位(由fontsize, cex, fontfamily, fontface确定)  |
| grobwidth | 以给定图形对象的宽度为单位 |
| grobheight | 以给定图形对象的高度为单位 |

: grid坐标系统 {#tbl-grid-coordinatedsystem}

使用`unit`函数来设置不同的系统
```{r}
unit(1,"cm")
unit(1,"npc")
```
坐标系统之间的运算将会以表达式的方式返回
```{r}
unit(1,"cm") - unit(1,"npc")
```
对于字符串及对象长度坐标系统
```{r}
unit(1,"strwidth","Some Text")
```
```{r}
unit(1, "grobwidth", grid::textGrob("Some Text"))
```



可以使用 convertWidth 和 convertHeight 实现单位之间的转换
```{r}
# library(grid)
grid::convertHeight(unit(2,"cm")-unit(1,"npc"),"mm")
```

```{r}
grid::convertHeight(unit(1,"strwidth","Some Text"),"mm")

```

我们可以使用不同的单位系统来绘制一个矩形
```{r}
Text <- "让我们用grid包开始绘图吧!"

grid::grid.rect(
  x=unit(0.5, "npc"), 
  y=unit(1, "inches"),
  width=grid::stringWidth(Text), 
  height=unit(1, "lines")#,
  # gp=gpar(fill="blue")
  # just=c("left", "bottom")
)
grid::grid.text(
  x=unit(0.5, "npc"), 
  y=unit(1, "inches"),
  label =Text)
```

### gpar参数对象
所有的图形原语函数都有一个 gp(graphical parameters) 参数,用来接收一个 gpar 对象,该对象包含一些图形参数用于控制图像的输出。gpar 对象可以使用 gpar() 函数来生成。
```{r}
grid::gpar(col="red",lty="dashed")
```

|参数|描述|
| ------------| ----------------------------------------------------------|
|col|线条、文本、矩形边框等的颜色|
|fill|矩形、圆形、多边形的填充色|
|gamma|颜色的gamma 校正值|
|alpha|透明度|
|lwd|线条宽度|
|lex|线条扩展乘子|
|lty|线条类型|
|lineend|线端,点类型:round,butt,square|
|linejoin|线连接点类型:round,mitre,bevel|
|linemitre|线条斜率限制|
|cex|fontsize的扩展乘子|
|fontsize|字体大小(points)|
|fontface|字体样式(bold,italic/ob1ique,plain,bold.italic或整数1-4)|
|fontfamily|字体家族|
|lineheight|线高|

: grid图形参数 {#tbl-grid-gpar}

使用 get.gpar 可以获取当前图形参数的值,如果未指定要获取的参数,将会返回所有的参数值
```{r}
library(grid)
get.gpar(c("lty", "fill"))
```
在 grid 中,cex 参数是累积的,也就是说当前的 cex 值等于当前设置的值乘上之前的 cex 值
在一个 viewport 中设置了 cex = 0.5,之后的文本又设置了 cex = 0.5,最后文本的大小就是 0.5*0.5 = 0.25

alpha 参数与 cex 类似,也是累积的


### 画布与窗口(viewport)

```{r}
library(grid)
grid.text(
  "top-left corner", 
  x=unit(1, "mm"),
  y=unit(1, "npc") - unit(1, "mm"),
  just=c("left", "top")
  )

pushViewport(
  viewport(
    width=0.8, 
    height=0.5, 
    angle=10,
    name="vp1"
    )
  )

grid.rect()

grid.text(
  "top-left corner", 
  x = unit(1, "mm"),
  y = unit(1, "npc") - unit(1, "mm"),
  just = c("left", "top")
  )
```


### viewport图形参数

### 布局
 

Copyright 2025, Taotao Chen