在绘图时,对于需要进行强调的区域通常会使用矩形框对其高亮显示。本篇就来介绍在ggplot2
绘图系统中,如何方便地添加多块矩形框。
在ggplot2
工具包中,一共有三个矩形函数:geom_rect()
、geom_tile()
、geom_raster()
。它们的帮助文档也在同一界面,其描述部分(Description)译成中文如下:
❝❞
geom_rect()
和geom_tile()
函数的功能是一致的,但是参数有所区别:geom_rect()
使用的是矩形四个顶点的位置,即xmin、xmax、ymin和ymax,而geom_tile()
使用的是矩形的中心位置及其尺寸,即x、y、width、height。geom_tile()
是geom_tile()
的特例,其要求所有矩形的尺寸相同。
下面分别使用geom_rect()
和geom_tile()
函数绘制矩形。
geom_rect()
library(ggplot2)
library(RColorBrewer)
ggplot() +
geom_rect(aes(xmin = c(0,1,2,5),
xmax = c(1,2,5,9),
ymin = 0, ymax = 2,
fill = I(brewer.pal(4, "Set3"))))
❝❞
在绘图时,
xmin
参数的四个元素指定了四个矩形水平方向的起始位置,xmax
参数则指定了它们水平方向的终止位置;由于四个矩形在垂直方向的起始、终止位置相同,因此ymin
、ymax
参数只需要一个元素。
geom_tile()
ggplot() +
geom_tile(aes(x = c(0.5,1.5,3.5,7), y = 1,
width = c(1,1,3,4), height = 2,
fill = I(brewer.pal(4, "Set3"))))
❝❞
该图与上一幅图效果一致。两个函数的参数可以进行如下换算:x = (xmin + xmax)/2,width = xmax - xmin;垂直方向同理。
例如,对如下图添加一个矩形标注。
p <- ggplot(mtcars) +
geom_point(aes(mpg, qsec, col = factor(vs))) +
labs(col = "vs") +
theme_bw() +
theme(text = element_text(family = "mono", size = 15))
p
col = brewer.pal(11, "RdYlGn")
p +
geom_rect(aes(xmin = 12, xmax = 30,
ymin = 16, ymax = 20),
fill = col[9], alpha = 0.03)
如果需要将高亮区域分为三块,分别使用不同颜色的矩形矩形标注。
p +
geom_rect(aes(xmin = c(12,15,25),
xmax = c(15,25,30),
ymin = 16, ymax = 20),
fill = col[7:9], alpha = 0.2)
以上代码在运行时,会出现以下错误:
❝Error in
❞check_aesthetics()
:
! Aesthetics must be either length 1 or the same as the data (32): xmin and xmax
从报错信息上可以看出,这是因为全局数据mtcars
共有32个样本,ggplot2
绘图系统要求局部数据的样本量为1,或与全局数据一致;而在上面代码中,geom_rect()
函数使用的局部数据的样本量为3。
针对这种情况,一种方法是使用三次geom_rect()
函数来绘制三个矩形框,但是这种方法比较繁琐,且不具有一般性。
p +
geom_rect(aes(xmin = 12, xmax = 15,
ymin = 16, ymax = 20),
fill = col[9], alpha = 0.02) +
geom_rect(aes(xmin = 15, xmax = 25,
ymin = 16, ymax = 20),
fill = col[8], alpha = 0.02) +
geom_rect(aes(xmin = 25, xmax = 30,
ymin = 16, ymax = 20),
fill = col[7], alpha = 0.02)
另外一种方法是使用注释函数annotate()
。关于注释函数的用法,在基础系列已经有所介绍,详见推文ggplot2 | 注释函数。
p +
annotate("rect", xmin = c(12,15,25), xmax = c(15,25,30),
ymin = 16, ymax = 20,
fill = col[9:7], alpha = 0.2)
在上述代码中,alpha
参数用来调整透明度,数值在[0,1]之间,数值越小,透明度越高。但是可以看出,在geom_rect()
函数中alpha = 0.02
的透明效果还不如annotate()
函数下的alpha = 0.2
。暂时还不知道其原理。