在 R 版本 4.1.0 中,通过“grid”包的 R 接口,为 R 图形引擎添加了对图案填充的支持 。
library(grid)
例如,以下代码定义了一个从红色到白色水平变化的线性渐变和一个基于重复红色圆圈的平铺图案。
gradcol <- c(palette()[2], "white")
grad <- linearGradient(gradcol, y1=.5, y2=.5)
patcol <- 2
pat <- pattern(circleGrob(r=unit(2, "mm"), gp=gpar(col=patcol, fill=patcol)),
width=unit(5, "mm"), height=unit(5, "mm"),
extend="repeat")
下一段代码调用 grid.rect()
两次,一次用线性渐变填充矩形,第二次用平铺图案填充另一个矩形。
grid.rect(1/3, width=1/4, height=1/2,
gp=gpar(fill=grad))
grid.rect(2/3, width=1/4, height=1/2,
gp=gpar(fill=pat))
以下代码使用对 grid.rect()
的一次调用绘制两个矩形,并使用线性渐变填充这两个矩形。结果是两个矩形都填充了从红色到白色的相同渐变,渐变相对于两个矩形周围的边界框(我们从左侧矩形的左边缘开始为红色,在右侧矩形的右边缘结束为白色)。
grid.rect(1:2/3, width=1/4, height=1/2,
gp=gpar(fill=grad))
从 R 4.2.0 开始,我们可以产生不同的结果,因为 linearGradient()
函数获得了一个 group
参数。如果我们将其设置为 FALSE
,那么我们可以用“相同”的渐变填充填充两个矩形,但渐变填充相对于各个矩形,如下所示。
grad2 <- linearGradient(gradcol, y1=.5, y2=.5,
group=FALSE)
grid.rect(1:2/3, width=1/4, height=1/2,
gp=gpar(fill=grad2))
R 4.2.0 中的另一个更改是我们可以指定多个图案填充。例如,以下代码在单个 grid.rect()
调用中绘制两个矩形,并提供一个图案填充列表:原始线性渐变和平铺图案。结果是第一个矩形用线性渐变填充,第二个矩形用平铺图案填充。
grid.rect(1:2/3, width=1/4, height=1/2,
gp=gpar(fill=list(grad, pat)))
结果与第一个示例不同,因为线性渐变和平铺图案都相对于两个矩形周围的边界框。以下代码使用新的 group
参数用不同的图案填充填充每个矩形并使图案填充相对于各个矩形。
pat2 <- pattern(circleGrob(r=unit(2, "mm"), gp=gpar(col=patcol, fill=patcol)),
width=unit(5, "mm"), height=unit(5, "mm"),
extend="repeat",
group=FALSE)
grid.rect(1:2/3, width=1/4, height=1/2,
gp=gpar(fill=list(grad2, pat2)))
R 4.2.0 中的另一个新增功能是在“点”(数据符号)上使用图案填充的能力。将其与图案列表和 group=FALSE
结合使用,例如,我们可以将图案填充应用于散点图上的各个点,如下所示。对于此示例,图案填充是从白色到红色的径向渐变。
library(gggrid)
grad3 <- radialGradient(rev(gradcol),
cx2=.8, cy2=.8, group=FALSE)
filledPoints <- function(data, coords) {
pointsGrob(coords$x, coords$y, pch=21,
gp=gpar(col=patcol, fill=grad3))
}
ggplot(mtcars) +
grid_panel(filledPoints,
mapping=aes(x=disp, y=mpg))
可以在技术报告 “R 图形中的矢量化图案填充” 中找到关于这些新功能的进一步讨论和更多详细信息。技术报告 “复杂 Grob 的构造几何” 描述了 grobCoords()
函数的相关更改,该函数用于解析图案填充。